/
gnomdeployer
/
VUZPlus
Обзор
Документация
Войти
/
gnomdeployer
/
VUZPlus
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
master
server/internal/api/handler/form.go
161 строка
8 KB
maximmalchevsky
ura
20 май 2025, 02:58
20 май 2025, 02:58
e733017
Код
Авторство
О чём код?
package handler import ( "context" "fmt" "github.com/gofiber/fiber/v2" "os" "path/filepath" "time" "vuzplus/internal/shared/entities" "vuzplus/internal/shared/log" "vuzplus/util" ) // CreateForm // @Tags Form // @Summary Создание формы // @Accept multipart/form-data // @Produce json // @Param last_name formData string true "Фамилия" example("Иванов") // @Param first_name formData string true "Имя" example("Иван") // @Param third_name formData string false "Отчество" example("Иванович") // @Param email formData string true "Электронная почта" example("ivan@example.com") // @Param phone_number formData string true "Контактный телефон" example("+7(999)123-45-67") // @Param telegram_username formData string false "Telegram-юзернейм" example("ivan_ivanov") // @Param university_name formData string true "Название университета" example("РТУ МИРЭА") // @Param university_address formData string true "Адрес университета" example("г. Москва, пр-т Вернадского, д.78") // @Param university_licenses formData []file false "Лицензии университета" // @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 /forms [post] func (h *Handler) CreateForm(c *fiber.Ctx) error { var f entities.Form if err := c.BodyParser(&f); 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(fiber.Map{"error": err.Error()}) } form, err := c.MultipartForm() 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()}) } media := form.File["university_licenses"] for _, file := range media { // Получаем расширение оригинального файла и генерируем уникальное имя ext := filepath.Ext(file.Filename) uniqueName := util.GenerateRandomFileName(ext) // Формируем путь для сохранения под уникальным именем filePath := fmt.Sprintf("./tmp/%s", uniqueName) if err := c.SaveFile(file, filePath); 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()}) } // Загружаем файл в хранилище под уникальным именем err = h.repository.S3.FPutObject(context.Background(), "form-media", uniqueName, filePath, file.Header.Get("Content-Type")) 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()}) } f.UniversityLicenses = append(f.UniversityLicenses, uniqueName) err = os.Remove(filePath) 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.DBCreateForm") f.ID, err = h.repository.DB.DBCreateForm(&f) if err != nil { for _, mediaName := range f.UniversityLicenses { h.repository.S3.RemoveObject(context.Background(), "form-media", mediaName) } logEvent := log.CreateLog(h.logger, log.LogsField{Level: "Error", Method: c.Method(), Url: c.OriginalURL(), Status: fiber.StatusBadRequest}) logEvent.Msg(fmt.Sprintf("error creating form: %s", err.Error())) return c.Status(fiber.StatusBadRequest).JSON(entities.Error{Error: fmt.Sprintf("error creating form: %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 form with id=%v", f.ID)) return c.Status(fiber.StatusOK).JSON(entities.ID{ID: f.ID}) } // GetForms // @Tags Form // @Summary Получение всех форм // @Produce json // @Success 200 {array} []entities.Form "Список заполненных форм" // @Failure 400 {object} entities.Error "Некорректный запрос" // @Failure 401 {object} entities.Error "Пользователь не авторизован" // @Failure 403 {object} entities.Error "Недостаточно прав для запроса" // @Failure 500 {object} entities.Error "Ошибка на стороне сервера" // @Router /auth/forms [get] // @Security ApiKeyAuth func (h *Handler) GetForms(c *fiber.Ctx) error { adminId, ok := c.Locals("id").(int) if !ok { logEvent := log.CreateLog(h.logger, log.LogsField{Level: "Error", Method: c.Method(), Url: c.OriginalURL(), Status: fiber.StatusBadRequest}) logEvent.Msg("error: cant get id from token") return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": "cant get id from token"}) } h.logger.Debug().Msg("call h.repository.DB.DBGetRoleById") userStatus, err := h.repository.DB.DBGetRoleById(adminId) 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(fiber.Map{"error": err.Error()}) } if userStatus.Role == "root" && userStatus.Status == "verified" { h.logger.Debug().Msg("call h.repository.DB.DBGetForms") forms, err := h.repository.DB.DBGetForms() 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(fiber.Map{"error": err.Error()}) } for i, _ := range *forms { var mediaLinks []string for _, media := range (*forms)[i].UniversityLicenses { url, _ := h.repository.S3.PresignedGetObject(context.Background(), "form-media", media, 7*24*time.Hour) mediaLinks = append(mediaLinks, url.String()) } (*forms)[i].UniversityLicenses = mediaLinks } logEvent := log.CreateLog(h.logger, log.LogsField{Level: "Info", Method: c.Method(), Url: c.OriginalURL(), Status: fiber.StatusOK}) logEvent.Msg("successfully getting all forms") return c.Status(fiber.StatusOK).JSON(forms) } else { logEvent := log.CreateLog(h.logger, log.LogsField{Level: "Error", Method: c.Method(), Url: c.OriginalURL(), Status: fiber.StatusInternalServerError}) logEvent.Msg("error: There are not enough rights for this action") return c.Status(fiber.StatusForbidden).JSON(fiber.Map{"error": "There are not enough rights for this action"}) } }