/
gnomdeployer
/
VUZPlus
Обзор
Документация
Войти
/
gnomdeployer
/
VUZPlus
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
master
server/internal/api/handler/program.go
374 строки
20 KB
maximmalchevsky
jopa
11 май 2025, 21:57
11 май 2025, 21:57
b296575
Код
Авторство
О чём код?
package handler import ( "context" "fmt" "github.com/gofiber/fiber/v2" "strconv" "time" "vuzplus/internal/shared/entities" "vuzplus/internal/shared/log" ) // CreateProgram // @Tags Program // @Summary Создание программы // @Accept json // @Produce json // @Param direction body entities.CreateProgramRequest true "Данные для создания направления" // @Success 200 {object} entities.ID "Направление успешно создано" // @Failure 400 {object} entities.Error "Некорректный запрос" // @Failure 401 {object} entities.Error "Пользователь не авторизован" // @Failure 403 {object} entities.Error "Недостаточно прав для запроса" // @Failure 500 {object} entities.Error "Ошибка на стороне сервера" // @Router /auth/program [post] // @Security ApiKeyAuth func (h *Handler) CreateProgram(c *fiber.Ctx) error { userId := c.Locals("id").(int) uStatus, err := h.repository.DB.DBGetRoleById(userId) if err != nil { logEvent := log.CreateLog(h.logger, log.LogsField{Level: "Error", Method: c.Method(), Url: c.OriginalURL(), Status: fiber.StatusBadRequest}) logEvent.Msg(fmt.Sprintf("error getting user role: %s", err.Error())) return c.Status(fiber.StatusBadRequest).JSON(entities.Error{Error: fmt.Sprintf("error getting user role: %s", err.Error())}) } if uStatus.Role == "admin" && uStatus.Status == "verified" { var p entities.Program err := c.BodyParser(&p) if err != nil { logEvent := log.CreateLog(h.logger, log.LogsField{Level: "Error", Method: c.Method(), Url: c.OriginalURL(), Status: fiber.StatusBadRequest}) logEvent.Msg(err.Error()) return c.Status(fiber.StatusBadRequest).JSON(entities.Error{Error: err.Error()}) } h.logger.Debug().Msg("calling h.repository.DB.DBGetUniversityIdByUserId") universityID, err := h.repository.DB.DBGetUniversityIdByUserId(userId) if err != nil { logEvent := log.CreateLog(h.logger, log.LogsField{Level: "Error", Method: c.Method(), Url: c.OriginalURL(), Status: fiber.StatusBadRequest}) logEvent.Msg(err.Error()) return c.Status(fiber.StatusBadRequest).JSON(entities.Error{Error: err.Error()}) } p.UniversityID = universityID h.logger.Debug().Msg("calling h.repository.DB.DBCreateProgram") p.ID, err = h.repository.DB.DBCreateProgram(&p) if err != nil { logEvent := log.CreateLog(h.logger, log.LogsField{Level: "Error", Method: c.Method(), Url: c.OriginalURL(), Status: fiber.StatusBadRequest}) logEvent.Msg(fmt.Sprintf("error creating program: %s", err.Error())) return c.Status(fiber.StatusBadRequest).JSON(entities.Error{Error: fmt.Sprintf("error creating direction: %s", err.Error())}) } logEvent := log.CreateLog(h.logger, log.LogsField{Level: "Info", Method: c.Method(), Url: c.OriginalURL(), Status: fiber.StatusOK}) logEvent.Msg(fmt.Sprintf("successful creating program with id=%v", p.ID)) return c.Status(fiber.StatusOK).JSON(entities.ID{ID: p.ID}) } logEvent := log.CreateLog(h.logger, log.LogsField{Level: "Error", Method: c.Method(), Url: c.OriginalURL(), Status: fiber.StatusForbidden}) logEvent.Msg("there are not enough rights for this action") return c.Status(fiber.StatusForbidden).JSON(entities.Error{Error: "there are not enough rights for this action"}) } // GetByIDProgram // @Tags Program // @Summary Получение программы по ID // @Accept json // @Produce json // @Param id path int true "ID программы" example(1) // @Success 200 {object} entities.ProgramWithRating "Направление по ID успешно получен" // @Failure 400 {object} entities.Error "Некорректный запрос" // @Failure 500 {object} entities.Error "Ошибка на стороне сервера" // @Router /program/id/{id} [get] func (h *Handler) GetByIDProgram(c *fiber.Ctx) error { idStr := c.Params("id") id, err := strconv.Atoi(idStr) if err != nil { logEvent := log.CreateLog(h.logger, log.LogsField{Level: "Error", Method: c.Method(), Url: c.OriginalURL(), Status: fiber.StatusBadRequest}) logEvent.Msg(err.Error()) return c.Status(fiber.StatusBadRequest).JSON(entities.Error{Error: err.Error()}) } h.logger.Debug().Msg("calling h.repository.DB.DBGetDirectionByID") d, err := h.repository.DB.DBGetProgramByID(id) if err != nil { logEvent := log.CreateLog(h.logger, log.LogsField{Level: "Error", Method: c.Method(), Url: c.OriginalURL(), Status: fiber.StatusBadRequest}) logEvent.Msg(fmt.Sprintf("error getting direction with id=%v: %s", id, err.Error())) return c.Status(fiber.StatusBadRequest).JSON(entities.Error{Error: fmt.Sprintf("error getting direction by id=%v: %s", id, err.Error())}) } logEvent := log.CreateLog(h.logger, log.LogsField{Level: "Info", Method: c.Method(), Url: c.OriginalURL(), Status: fiber.StatusOK}) logEvent.Msg(fmt.Sprintf("successful getting direction with id=%v", id)) return c.Status(fiber.StatusOK).JSON(d) } // GetPrograms // @Tags Program // @Summary Получение всех направлений и дисциплин цк // @Accept json // @Produce json // @Success 200 {object} []entities.ProgramWithLogo "Направления и дисциплины цк успешно получены" // @Failure 400 {object} entities.Error "Некорректный запрос" // @Failure 500 {object} entities.Error "Ошибка на стороне сервера" // @Router /program [get] func (h *Handler) GetPrograms(c *fiber.Ctx) error { h.logger.Debug().Msg("calling h.repository.DB.DBGetAllProgramNamesWithLogo") p, err := h.repository.DB.DBGetAllProgramNamesWithLogo() if err != nil { logEvent := log.CreateLog(h.logger, log.LogsField{Level: "Error", Method: c.Method(), Url: c.OriginalURL(), Status: fiber.StatusBadRequest}) logEvent.Msg(fmt.Sprintf("error getting all direction names with logo: %s", err.Error())) return c.Status(fiber.StatusBadRequest).JSON(entities.Error{Error: fmt.Sprintf("error getting all direction names with logo: %s", err.Error())}) } for i := range *p { url, _ := h.repository.S3.PresignedGetObject(context.Background(), "university-media", (*p)[i].Logo.Name, 7*24*time.Hour) if url != nil { (*p)[i].Logo.URL = url.String() } } logEvent := log.CreateLog(h.logger, log.LogsField{Level: "Info", Method: c.Method(), Url: c.OriginalURL(), Status: fiber.StatusOK}) logEvent.Msg("successful getting programs") return c.Status(fiber.StatusOK).JSON(p) } // GetByProgramsByUniversityID // @Tags Program // @Summary Получение направления по ID университета // @Accept json // @Produce json // @Param id path int true "ID университета" example(1) // @Success 200 {object} []entities.ProgramWithRating "Все направления вуза успешно получены" // @Failure 400 {object} entities.Error "Некорректный запрос" // @Failure 500 {object} entities.Error "Ошибка на стороне сервера" // @Router /program/university_id/{id} [get] func (h *Handler) GetByProgramsByUniversityID(c *fiber.Ctx) error { idStr := c.Params("id") id, err := strconv.Atoi(idStr) if err != nil { logEvent := log.CreateLog(h.logger, log.LogsField{Level: "Error", Method: c.Method(), Url: c.OriginalURL(), Status: fiber.StatusBadRequest}) logEvent.Msg(err.Error()) return c.Status(fiber.StatusBadRequest).JSON(entities.Error{Error: err.Error()}) } h.logger.Debug().Msg("calling h.repository.DB.DBGetProgramsByUniversityID") p, err := h.repository.DB.DBGetProgramsByUniversityID(id) if err != nil { logEvent := log.CreateLog(h.logger, log.LogsField{Level: "Error", Method: c.Method(), Url: c.OriginalURL(), Status: fiber.StatusBadRequest}) logEvent.Msg(fmt.Sprintf("error getting directions by university id: %s", err.Error())) return c.Status(fiber.StatusBadRequest).JSON(entities.Error{Error: fmt.Sprintf("error getting directions by university id: %s", err.Error())}) } logEvent := log.CreateLog(h.logger, log.LogsField{Level: "Info", Method: c.Method(), Url: c.OriginalURL(), Status: fiber.StatusOK}) logEvent.Msg("successful getting programs by university id") return c.Status(fiber.StatusOK).JSON(p) } // GetByUniversityIDExchangeablePrograms // @Tags Program // @Summary Получение доступных для обмена направлений по ID ВУЗа // @Accept json // @Produce json // @Param id path int true "ID университета" example(1) // @Success 200 {object} []entities.Program "Все направления вуза успешно получены" // @Failure 400 {object} entities.Error "Некорректный запрос" // @Failure 500 {object} entities.Error "Ошибка на стороне сервера" // @Router /program/exchangeable/university_id/{id} [get] func (h *Handler) GetByUniversityIDExchangeablePrograms(c *fiber.Ctx) error { idStr := c.Params("id") id, err := strconv.Atoi(idStr) if err != nil { logEvent := log.CreateLog(h.logger, log.LogsField{Level: "Error", Method: c.Method(), Url: c.OriginalURL(), Status: fiber.StatusBadRequest}) logEvent.Msg(err.Error()) return c.Status(fiber.StatusBadRequest).JSON(entities.Error{Error: err.Error()}) } h.logger.Debug().Msg("calling h.repository.DB.DBGetExchangeableProgramsByUniversityID") p, err := h.repository.DB.DBGetExchangeableProgramsByUniversityID(id) if err != nil { logEvent := log.CreateLog(h.logger, log.LogsField{Level: "Error", Method: c.Method(), Url: c.OriginalURL(), Status: fiber.StatusBadRequest}) logEvent.Msg(fmt.Sprintf("error getting programs by university id: %s", err.Error())) return c.Status(fiber.StatusBadRequest).JSON(entities.Error{Error: fmt.Sprintf("error getting directions by university id: %s", err.Error())}) } logEvent := log.CreateLog(h.logger, log.LogsField{Level: "Info", Method: c.Method(), Url: c.OriginalURL(), Status: fiber.StatusOK}) logEvent.Msg("successful getting programs by university id") return c.Status(fiber.StatusOK).JSON(p) } // GetExchangeablePrograms // @Tags Program // @Summary Получение всех доступных для обмена программ // @Accept json // @Produce json // @Success 200 {object} []entities.ProgramWithLogo "Программы успешно получены" // @Failure 400 {object} entities.Error "Некорректный запрос" // @Failure 500 {object} entities.Error "Ошибка на стороне сервера" // @Router /program/exchangeable/all [get] func (h *Handler) GetExchangeablePrograms(c *fiber.Ctx) error { h.logger.Debug().Msg("calling h.repository.DB.DBGetAllExchangeablePrograms") p, err := h.repository.DB.DBGetAllExchangeablePrograms() if err != nil { logEvent := log.CreateLog(h.logger, log.LogsField{Level: "Error", Method: c.Method(), Url: c.OriginalURL(), Status: fiber.StatusBadRequest}) logEvent.Msg(fmt.Sprintf("error getting all direction names with logo: %s", err.Error())) return c.Status(fiber.StatusBadRequest).JSON(entities.Error{Error: fmt.Sprintf("error getting all direction names with logo: %s", err.Error())}) } for i := range *p { url, _ := h.repository.S3.PresignedGetObject(context.Background(), "university-media", (*p)[i].Logo.Name, 7*24*time.Hour) if url != nil { (*p)[i].Logo.URL = url.String() } } logEvent := log.CreateLog(h.logger, log.LogsField{Level: "Info", Method: c.Method(), Url: c.OriginalURL(), Status: fiber.StatusOK}) logEvent.Msg("successful getting programs") return c.Status(fiber.StatusOK).JSON(p) } //// UpdateDirection //// @Tags Direction //// @Summary Обновление направления //// @Accept json //// @Produce json //// @Param direction body entities.Direction true "Данные для обновления направления" //// @Success 200 {object} entities.Direction "Направление успешно обновлено" //// @Failure 400 {object} entities.Error "Некорректный запрос" //// @Failure 401 {object} entities.Error "Пользователь не авторизован" //// @Failure 403 {object} entities.Error "Недостаточно прав для запроса" //// @Failure 500 {object} entities.Error "Ошибка на стороне сервера" //// @Router /auth/direction [put] //// @Security ApiKeyAuth //func (h *Handler) UpdateDirection(c *fiber.Ctx) error { // userId := c.Locals("id").(int) // uStatus, err := h.repository.DB.DBGetRoleById(userId) // if err != nil { // logEvent := log.CreateLog(h.logger, log.LogsField{Level: "Error", Method: c.Method(), Url: c.OriginalURL(), Status: fiber.StatusBadRequest}) // logEvent.Msg(fmt.Sprintf("error getting user role: %s", err.Error())) // return c.Status(fiber.StatusBadRequest).JSON(entities.Error{Error: fmt.Sprintf("error getting user role: %s", err.Error())}) // } // if uStatus.Role == "admin" && uStatus.Status == "verified" { // var d entities.Direction // err := c.BodyParser(&d) // if err != nil { // logEvent := log.CreateLog(h.logger, log.LogsField{Level: "Error", Method: c.Method(), Url: c.OriginalURL(), Status: fiber.StatusBadRequest}) // logEvent.Msg(err.Error()) // return c.Status(fiber.StatusBadRequest).JSON(entities.Error{Error: err.Error()}) // } // // h.logger.Debug().Msg("calling h.repository.DB.DBUpdateDirection(&d)") // err = h.repository.DB.DBUpdateDirection(&d) // if err != nil { // logEvent := log.CreateLog(h.logger, log.LogsField{Level: "Error", Method: c.Method(), Url: c.OriginalURL(), Status: fiber.StatusBadRequest}) // logEvent.Msg(fmt.Sprintf("error updating direction: %s", err.Error())) // return c.Status(fiber.StatusBadRequest).JSON(entities.Error{Error: fmt.Sprintf("error updating direction: %s", err.Error())}) // } // // logEvent := log.CreateLog(h.logger, log.LogsField{Level: "Info", Method: c.Method(), Url: c.OriginalURL(), Status: fiber.StatusOK}) // logEvent.Msg(fmt.Sprintf("successful updating direction with id=%v", d.ID)) // return c.Status(fiber.StatusOK).JSON(d) // } // // logEvent := log.CreateLog(h.logger, log.LogsField{Level: "Error", Method: c.Method(), Url: c.OriginalURL(), Status: fiber.StatusForbidden}) // logEvent.Msg("there are not enough rights for this action") // return c.Status(fiber.StatusForbidden).JSON(entities.Error{Error: "there are not enough rights for this action"}) //} // DeleteDirection // @Tags Program // @Summary Удаление направления по ID // @Accept json // @Produce json // @Param id path int true "ID направления" example(1) // @Success 200 {object} entities.Response "Направление успешно удалено" // @Failure 400 {object} entities.Error "Некорректный запрос" // @Failure 401 {object} entities.Error "Пользователь не авторизован" // @Failure 403 {object} entities.Error "Недостаточно прав для запроса" // @Failure 500 {object} entities.Error "Ошибка на стороне сервера" // @Router /auth/program/{id} [delete] // @Security ApiKeyAuth func (h *Handler) DeleteDirection(c *fiber.Ctx) error { userId := c.Locals("id").(int) uStatus, err := h.repository.DB.DBGetRoleById(userId) if err != nil { logEvent := log.CreateLog(h.logger, log.LogsField{Level: "Error", Method: c.Method(), Url: c.OriginalURL(), Status: fiber.StatusBadRequest}) logEvent.Msg(fmt.Sprintf("error getting user role: %s", err.Error())) return c.Status(fiber.StatusBadRequest).JSON(entities.Error{Error: fmt.Sprintf("error getting user role: %s", err.Error())}) } if uStatus.Role == "admin" && uStatus.Status == "verified" { idStr := c.Params("id") id, err := strconv.Atoi(idStr) if err != nil { logEvent := log.CreateLog(h.logger, log.LogsField{Level: "Error", Method: c.Method(), Url: c.OriginalURL(), Status: fiber.StatusBadRequest}) logEvent.Msg(err.Error()) return c.Status(fiber.StatusBadRequest).JSON(entities.Error{Error: err.Error()}) } h.logger.Debug().Msg("calling h.repository.DB.DBDeleteDirection") err = h.repository.DB.DBDeleteProgram(id) if err != nil { logEvent := log.CreateLog(h.logger, log.LogsField{Level: "Error", Method: c.Method(), Url: c.OriginalURL(), Status: fiber.StatusBadRequest}) logEvent.Msg(fmt.Sprintf("error deleting direction with id=%v: %s", id, err.Error())) return c.Status(fiber.StatusBadRequest).JSON(entities.Error{Error: fmt.Sprintf("error deleting direction by id=%v: %s", id, err.Error())}) } logEvent := log.CreateLog(h.logger, log.LogsField{Level: "Info", Method: c.Method(), Url: c.OriginalURL(), Status: fiber.StatusOK}) logEvent.Msg(fmt.Sprintf("successful deleting direction with id=%v", id)) return c.Status(fiber.StatusOK).JSON(entities.Response{Response: fmt.Sprintf("successful deleting direction with id=%v", id)}) } logEvent := log.CreateLog(h.logger, log.LogsField{Level: "Error", Method: c.Method(), Url: c.OriginalURL(), Status: fiber.StatusForbidden}) logEvent.Msg("there are not enough rights for this action") return c.Status(fiber.StatusForbidden).JSON(entities.Error{Error: "there are not enough rights for this action"}) } // GetAvailableExchangeablePrograms // @Tags Program // @Summary Получение всех доступных определенному студенту направлений и дисциплин цк // @Accept json // @Produce json // @Success 200 {object} []entities.ProgramWithLogo "Направления и дисциплины цк успешно получены" // @Failure 400 {object} entities.Error "Некорректный запрос" // @Failure 403 {object} entities.Error "Недостаточно прав" // @Failure 500 {object} entities.Error "Ошибка на стороне сервера" // @Router /auth/program/exchangeable/available [get] // @Security ApiKeyAuth func (h *Handler) GetAvailableExchangeablePrograms(c *fiber.Ctx) error { userId := c.Locals("id").(int) uStatus, err := h.repository.DB.DBGetRoleById(userId) if err != nil { logEvent := log.CreateLog(h.logger, log.LogsField{Level: "Error", Method: c.Method(), Url: c.OriginalURL(), Status: fiber.StatusBadRequest}) logEvent.Msg(fmt.Sprintf("error getting user role: %s", err.Error())) return c.Status(fiber.StatusBadRequest).JSON(entities.Error{Error: fmt.Sprintf("error getting user role: %s", err.Error())}) } if uStatus.Role != "student" || uStatus.Status != "verified" { logEvent := log.CreateLog(h.logger, log.LogsField{Level: "Error", Method: c.Method(), Url: c.OriginalURL(), Status: fiber.StatusForbidden}) logEvent.Msg("there are not enough rights for this action") return c.Status(fiber.StatusForbidden).JSON(entities.Error{Error: "there are not enough rights for this action"}) } h.logger.Debug().Msg("calling h.repository.DB.DBGetUserGpaByID") userGPA, err := h.repository.DB.DBGetUserGpaByID(userId) if err != nil { logEvent := log.CreateLog(h.logger, log.LogsField{Level: "Error", Method: c.Method(), Url: c.OriginalURL(), Status: fiber.StatusBadRequest}) logEvent.Msg(fmt.Sprintf("error getting available direction names with logo: %s", err.Error())) return c.Status(fiber.StatusBadRequest).JSON(entities.Error{Error: fmt.Sprintf("error getting all direction names with logo: %s", err.Error())}) } h.logger.Debug().Msg("calling h.repository.DB.DBGetAvailableExchangeableProgramNamesWithLogo") p, err := h.repository.DB.DBGetAvailableExchangeableProgramNamesWithLogo(userGPA) if err != nil { logEvent := log.CreateLog(h.logger, log.LogsField{Level: "Error", Method: c.Method(), Url: c.OriginalURL(), Status: fiber.StatusBadRequest}) logEvent.Msg(fmt.Sprintf("error getting available direction names with logo: %s", err.Error())) return c.Status(fiber.StatusBadRequest).JSON(entities.Error{Error: fmt.Sprintf("error getting available direction names with logo: %s", err.Error())}) } for i := range *p { url, _ := h.repository.S3.PresignedGetObject(context.Background(), "university-media", (*p)[i].Logo.Name, 7*24*time.Hour) if url != nil { (*p)[i].Logo.URL = url.String() } } logEvent := log.CreateLog(h.logger, log.LogsField{Level: "Info", Method: c.Method(), Url: c.OriginalURL(), Status: fiber.StatusOK}) logEvent.Msg("successful getting direction with ") return c.Status(fiber.StatusOK).JSON(p) }