Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package transport
- import (
- "document-flow-server/internal/auth"
- "document-flow-server/internal/models"
- "document-flow-server/internal/services"
- "document-flow-server/internal/transport/utils"
- "mime/multipart"
- "net/http"
- )
- // GetTemplates возвращает список шаблонов: либо всех, либо с пагинацией
- //
- // @Summary Получение списка шаблонов
- // @Description Возвращает список шаблонов с возможностью поиска и пагинации. Если `page` и `limit` не передаются, то возвращаются все шаблоны.
- // @Tags Шаблоны
- // @Accept json
- // @Produce json
- // @Param page query int false "Номер страницы (если не передается, то возвращаются все шаблоны)"
- // @Param limit query int false "Количество элементов на странице (если не передается, то возвращаются все шаблоны)"
- // @Param search query string false "Поисковый запрос"
- // @Success 200 {object} models.TemplatesResponse "Список шаблонов"
- // @Success 204 "Шаблоны не найдены"
- // @Failure 400 "Неверные параметры пагинации"
- // @Failure 500 "Внутренняя ошибка сервера"
- // @Router /templates [get]
- func GetTemplates(w http.ResponseWriter, r *http.Request) {
- holder := utils.GetRequestValuesHolder(r, "page", "limit", "search")
- page, err := holder.Uint64FromQuery("page").GetInt()
- utils.ThrowIfNotNil(w, err)
- limit, err := holder.Uint64FromQuery("limit").GetInt()
- utils.ThrowIfNotNil(w, err)
- query := holder.StringFromQuery("search").Get()
- var templatesResponse models.TemplatesResponse
- if query != nil {
- templatesResponse, err = services.SearchTemplates(*query, page, limit)
- } else {
- templatesResponse, err = services.GetTemplates(page, limit)
- }
- utils.ThrowIfNotNil(w, err, "ошибка получения шаблонов: ")
- if templatesResponse.TotalCount == 0 {
- utils.WriteJSONResponse(w, nil, http.StatusNoContent)
- } else {
- utils.WriteJSONResponse(w, templatesResponse, http.StatusOK)
- }
- }
- // CreateTemplate создает шаблон, сохраняет его вместе с метаданными и возвращает его с предзагруженными данными
- //
- // @Summary Создание нового шаблона
- // @Description Создает новый шаблон, файл и метаданные сохраняет на сервере.
- // @Tags Шаблоны
- // @Accept multipart/form-data
- // @Produce json
- // @Param template formData string true "JSON типа Template с метаданными шаблона"
- // @Param file formData file true "Файл шаблона .docx"
- // @Success 201 {object} models.Template "Созданный шаблон"
- // @Failure 400 "Ошибка запроса (неверные данные формы или отсутствие файла)"
- // @Failure 403 "Доступ запрещен"
- // @Failure 409 "Шаблон с таким именем уже существует"
- // @Failure 500 "Внутренняя ошибка сервера"
- // @Router /templates [post]
- func CreateTemplate(w http.ResponseWriter, r *http.Request) {
- err := utils.ParseMultipartForm(w, r, 20)
- utils.ThrowIfNotNil(w, err, "Не удается проанализировать данные формы по причине: ")
- holder := utils.GetRequestValuesHolder(r, "template", "file")
- templateJson := holder.StringFromData("template").Get()
- fileWrapper := holder.FileFromData("file")
- utils.ThrowIfNotNil(w, fileWrapper.Error, "Ошибка при извлечении файла: ")
- if fileWrapper.File == nil || templateJson == nil {
- utils.ThrowBadRequest(w, "отсутствует параметр `file` или `template`")
- }
- defer fileWrapper.File.Close()
- user, _ := auth.GetUserFromContext(r)
- createdTemplate, err := services.CreateTemplate(*templateJson, &fileWrapper.File, fileWrapper.Header, user)
- utils.ThrowIfNotNil(w, err)
- utils.WriteJSONResponse(w, createdTemplate, http.StatusCreated)
- }
- // GetTemplate возвращает данные шаблона по идентификатору
- //
- // @Summary Получение шаблона по идентификатору
- // @Description Возвращает шаблон по уникальному идентификатору.
- // @Tags Шаблоны
- // @Accept json
- // @Produce json
- // @Param id path int true "ID шаблона"
- // @Success 200 {object} models.Template "Найденный документ"
- // @Failure 400 "Некорректный ID"
- // @Failure 404 "Шаблон не найден"
- // @Failure 500 "Внутренняя ошибка сервера"
- // @Router /templates/{id} [get]
- func GetTemplate(w http.ResponseWriter, r *http.Request) {
- holder := utils.GetRequestValuesHolder(r, "id")
- id, err := holder.Uint64FromPath("id").Get()
- utils.ThrowIfNotNil(w, err)
- template, err := services.GetTemplateById(*id)
- utils.ThrowIfNotNil(w, err)
- utils.WriteJSONResponse(w, template, http.StatusOK)
- }
- // UpdateTemplate обновляет шаблон по идентификатору
- // @Summary Обновление шаблона по идентификатору
- // @Description Обновляет шаблон по по уникальному идентификатору с возможностью частичного обновления полей.
- // @Tags Шаблоны
- // @Accept multipart/form-data
- // @Produce json
- // @Param id path int true "ID шаблона"
- // @Param template formData string false "JSON с обновляемыми полями шаблона"
- // @Param file formData file false "Новый файл шаблона"
- // @Success 200 {object} models.Template "Обновленный шаблон"
- // @Failure 400 "Неверные данные"
- // @Failure 403 "Доступ запрещен"
- // @Failure 404 "Шаблон не найден"
- // @Failure 409 "Шаблон с таким именем уже существует"
- // @Failure 500 "Внутренняя ошибка"
- // @Router /templates/{id} [patch]
- func UpdateTemplate(w http.ResponseWriter, r *http.Request) {
- err := utils.ParseMultipartForm(w, r, 20)
- utils.ThrowIfNotNil(w, err, "Ошибка парсинга формы: ")
- holder := utils.GetRequestValuesHolder(r, "id", "template", "file")
- id, err := holder.Uint64FromPath("id").Get()
- utils.ThrowIfNotNil(w, err)
- templateJsonPtr := holder.StringFromData("template").Get()
- var templateJson string
- if templateJsonPtr != nil {
- templateJson = *templateJsonPtr
- }
- fileWrapper := holder.FileFromData("file")
- utils.ThrowIfNotNil(w, fileWrapper.Error, "Ошибка получения файла: ")
- var file *multipart.File
- var fileHeader *multipart.FileHeader
- if fileWrapper.File != nil {
- file = &fileWrapper.File
- fileHeader = fileWrapper.Header
- defer fileWrapper.File.Close()
- }
- user, _ := auth.GetUserFromContext(r)
- updatedTemplate, err := services.UpdateTemplateById(*id, templateJson, file, fileHeader, user)
- utils.ThrowIfNotNil(w, err)
- utils.WriteJSONResponse(w, updatedTemplate, http.StatusOK)
- }
- // DeleteTemplate удаляет шаблон по идентификатору
- //
- // @Summary Удаление шаблона по идентификатору
- // @Description Удаляет шаблон по идентификатору.
- // @Tags Шаблоны
- // @Accept json
- // @Produce json
- // @Param id path int true "ID шаблона"
- // @Success 204 "Шаблон успешно удален"
- // @Failure 400 "Некорректный ID"
- // @Failure 403 "Доступ запрещен"
- // @Failure 404 "Шаблон не найден"
- // @Failure 500 "Внутренняя ошибка сервера"
- // @Router /templates/{id} [delete]
- func DeleteTemplate(w http.ResponseWriter, r *http.Request) {
- holder := utils.GetRequestValuesHolder(r, "id")
- id, err := holder.Uint64FromPath("id").Get()
- utils.ThrowIfNotNil(w, err)
- user, _ := auth.GetUserFromContext(r)
- err = services.DeleteTemplateById(*id, user)
- utils.ThrowIfNotNil(w, err)
- utils.WriteJSONResponse(w, nil, http.StatusNoContent)
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement