package controller import ( "narasi-ahli-be/app/module/chat/request" "narasi-ahli-be/app/module/chat/service" "narasi-ahli-be/utils/paginator" utilRes "narasi-ahli-be/utils/response" utilVal "narasi-ahli-be/utils/validator" "strconv" "github.com/gofiber/fiber/v2" ) type chatScheduleController struct { chatScheduleService service.ChatScheduleService } type ChatScheduleController interface { // Chat Schedule endpoints GetAllChatSchedules(c *fiber.Ctx) error GetChatScheduleByID(c *fiber.Ctx) error CreateChatSchedule(c *fiber.Ctx) error UpdateChatSchedule(c *fiber.Ctx) error DeleteChatSchedule(c *fiber.Ctx) error // Additional schedule endpoints GetUpcomingSchedules(c *fiber.Ctx) error GetSchedulesByStatus(c *fiber.Ctx) error SendScheduleReminder(c *fiber.Ctx) error } func NewChatScheduleController(chatScheduleService service.ChatScheduleService) ChatScheduleController { return &chatScheduleController{ chatScheduleService: chatScheduleService, } } // GetAllChatSchedules - Get all chat schedules for a user // @Summary Get all chat schedules // @Description API for getting all chat schedules for authenticated user // @Tags Chat Schedule // @Security Bearer // @Param Authorization header string false "Insert your access token" default(Bearer ) // @Param chatSessionId query string false "Chat Session ID" // @Param status query string false "Schedule status (scheduled, ongoing, completed, cancelled)" // @Param createdBy query string false "Created by user ID" // @Param dateFrom query string false "Date from (YYYY-MM-DD)" // @Param dateTo query string false "Date to (YYYY-MM-DD)" // @Param req query paginator.Pagination false "pagination parameters" // @Success 200 {object} response.Response // @Failure 400 {object} response.BadRequestError // @Failure 401 {object} response.UnauthorizedError // @Failure 500 {object} response.InternalServerError // @Router /chat/schedules [get] func (_i *chatScheduleController) GetAllChatSchedules(c *fiber.Ctx) error { paginate, err := paginator.Paginate(c) if err != nil { return err } authToken := c.Get("Authorization") reqContext := request.ChatScheduleQueryRequestContext{ ChatSessionID: c.Query("chatSessionId"), Status: c.Query("status"), CreatedBy: c.Query("createdBy"), DateFrom: c.Query("dateFrom"), DateTo: c.Query("dateTo"), } req := reqContext.ToParamRequest() req.Pagination = *paginate chatSchedules, paging, err := _i.chatScheduleService.GetAllChatSchedules(authToken, req) if err != nil { return err } return utilRes.Resp(c, utilRes.Response{ Success: true, Messages: utilRes.Messages{"Chat schedules successfully retrieved"}, Data: chatSchedules, Meta: paging, }) } // GetChatScheduleByID - Get one chat schedule // @Summary Get one chat schedule // @Description API for getting one chat schedule // @Tags Chat Schedule // @Security Bearer // @Param Authorization header string false "Insert your access token" default(Bearer ) // @Param id path int true "Chat Schedule ID" // @Success 200 {object} response.Response // @Failure 400 {object} response.BadRequestError // @Failure 401 {object} response.UnauthorizedError // @Failure 500 {object} response.InternalServerError // @Router /chat/schedules/{id} [get] func (_i *chatScheduleController) GetChatScheduleByID(c *fiber.Ctx) error { id, err := strconv.ParseUint(c.Params("id"), 10, 0) if err != nil { return err } authToken := c.Get("Authorization") chatSchedule, err := _i.chatScheduleService.GetChatScheduleByID(authToken, uint(id)) if err != nil { return err } return utilRes.Resp(c, utilRes.Response{ Success: true, Messages: utilRes.Messages{"Chat schedule successfully retrieved"}, Data: chatSchedule, }) } // CreateChatSchedule - Create chat schedule // @Summary Create chat schedule // @Description API for creating a new chat schedule // @Tags Chat Schedule // @Security Bearer // @Param X-Csrf-Token header string true "Insert the X-Csrf-Token" // @Param Authorization header string false "Insert your access token" default(Bearer ) // @Param payload body request.ChatScheduleCreateRequest true "Required payload" // @Success 200 {object} response.Response // @Failure 400 {object} response.BadRequestError // @Failure 401 {object} response.UnauthorizedError // @Failure 500 {object} response.InternalServerError // @Router /chat/schedules [post] func (_i *chatScheduleController) CreateChatSchedule(c *fiber.Ctx) error { authToken := c.Get("Authorization") req := new(request.ChatScheduleCreateRequest) if err := utilVal.ParseAndValidate(c, req); err != nil { return err } dataResult, err := _i.chatScheduleService.CreateChatSchedule(authToken, *req) if err != nil { return err } return utilRes.Resp(c, utilRes.Response{ Success: true, Messages: utilRes.Messages{"Chat schedule successfully created"}, Data: dataResult, }) } // UpdateChatSchedule - Update chat schedule // @Summary Update chat schedule // @Description API for updating chat schedule (only creator can update) // @Tags Chat Schedule // @Security Bearer // @Param X-Csrf-Token header string true "Insert the X-Csrf-Token" // @Param Authorization header string false "Insert your access token" default(Bearer ) // @Param id path int true "Chat Schedule ID" // @Param payload body request.ChatScheduleUpdateRequest true "Required payload" // @Success 200 {object} response.Response // @Failure 400 {object} response.BadRequestError // @Failure 401 {object} response.UnauthorizedError // @Failure 500 {object} response.InternalServerError // @Router /chat/schedules/{id} [put] func (_i *chatScheduleController) UpdateChatSchedule(c *fiber.Ctx) error { id, err := strconv.ParseUint(c.Params("id"), 10, 0) if err != nil { return err } authToken := c.Get("Authorization") req := new(request.ChatScheduleUpdateRequest) if err := utilVal.ParseAndValidate(c, req); err != nil { return err } err = _i.chatScheduleService.UpdateChatSchedule(authToken, uint(id), *req) if err != nil { return err } return utilRes.Resp(c, utilRes.Response{ Success: true, Messages: utilRes.Messages{"Chat schedule successfully updated"}, }) } // DeleteChatSchedule - Delete chat schedule // @Summary Delete chat schedule // @Description API for deleting chat schedule (only creator can delete) // @Tags Chat Schedule // @Security Bearer // @Param X-Csrf-Token header string true "Insert the X-Csrf-Token" // @Param Authorization header string false "Insert your access token" default(Bearer ) // @Param id path int true "Chat Schedule ID" // @Success 200 {object} response.Response // @Failure 400 {object} response.BadRequestError // @Failure 401 {object} response.UnauthorizedError // @Failure 500 {object} response.InternalServerError // @Router /chat/schedules/{id} [delete] func (_i *chatScheduleController) DeleteChatSchedule(c *fiber.Ctx) error { id, err := strconv.ParseUint(c.Params("id"), 10, 0) if err != nil { return err } authToken := c.Get("Authorization") err = _i.chatScheduleService.DeleteChatSchedule(authToken, uint(id)) if err != nil { return err } return utilRes.Resp(c, utilRes.Response{ Success: true, Messages: utilRes.Messages{"Chat schedule successfully deleted"}, }) } // GetUpcomingSchedules - Get upcoming schedules for a user // @Summary Get upcoming schedules // @Description API for getting upcoming chat schedules for authenticated user // @Tags Chat Schedule // @Security Bearer // @Param Authorization header string false "Insert your access token" default(Bearer ) // @Param limit query int false "Limit number of results" default(10) // @Success 200 {object} response.Response // @Failure 400 {object} response.BadRequestError // @Failure 401 {object} response.UnauthorizedError // @Failure 500 {object} response.InternalServerError // @Router /chat/schedules/upcoming [get] func (_i *chatScheduleController) GetUpcomingSchedules(c *fiber.Ctx) error { authToken := c.Get("Authorization") limit := 10 // default limit if limitStr := c.Query("limit"); limitStr != "" { if parsedLimit, err := strconv.Atoi(limitStr); err == nil && parsedLimit > 0 { limit = parsedLimit } } chatSchedules, err := _i.chatScheduleService.GetUpcomingSchedules(authToken, limit) if err != nil { return err } return utilRes.Resp(c, utilRes.Response{ Success: true, Messages: utilRes.Messages{"Upcoming chat schedules successfully retrieved"}, Data: chatSchedules, }) } // GetSchedulesByStatus - Get schedules by status // @Summary Get schedules by status // @Description API for getting chat schedules by status // @Tags Chat Schedule // @Security Bearer // @Param Authorization header string false "Insert your access token" default(Bearer ) // @Param status path string true "Schedule status (scheduled, ongoing, completed, cancelled)" // @Success 200 {object} response.Response // @Failure 400 {object} response.BadRequestError // @Failure 401 {object} response.UnauthorizedError // @Failure 500 {object} response.InternalServerError // @Router /chat/schedules/status/{status} [get] func (_i *chatScheduleController) GetSchedulesByStatus(c *fiber.Ctx) error { status := c.Params("status") if status == "" { return utilRes.Resp(c, utilRes.Response{ Success: false, Messages: utilRes.Messages{"Status parameter is required"}, }) } authToken := c.Get("Authorization") chatSchedules, err := _i.chatScheduleService.GetSchedulesByStatus(authToken, status) if err != nil { return err } return utilRes.Resp(c, utilRes.Response{ Success: true, Messages: utilRes.Messages{"Chat schedules by status successfully retrieved"}, Data: chatSchedules, }) } // SendScheduleReminder - Send reminder for a schedule // @Summary Send schedule reminder // @Description API for sending reminder for a chat schedule (only creator can send) // @Tags Chat Schedule // @Security Bearer // @Param X-Csrf-Token header string true "Insert the X-Csrf-Token" // @Param Authorization header string false "Insert your access token" default(Bearer ) // @Param id path int true "Chat Schedule ID" // @Success 200 {object} response.Response // @Failure 400 {object} response.BadRequestError // @Failure 401 {object} response.UnauthorizedError // @Failure 500 {object} response.InternalServerError // @Router /chat/schedules/{id}/reminder [post] func (_i *chatScheduleController) SendScheduleReminder(c *fiber.Ctx) error { id, err := strconv.ParseUint(c.Params("id"), 10, 0) if err != nil { return err } authToken := c.Get("Authorization") err = _i.chatScheduleService.SendScheduleReminder(authToken, uint(id)) if err != nil { return err } return utilRes.Resp(c, utilRes.Response{ Success: true, Messages: utilRes.Messages{"Schedule reminder successfully sent"}, }) }