Advertisement
bruimafia

template handler

Mar 27th, 2025
289
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Go 8.31 KB | None | 0 0
  1. package transport
  2.  
  3. import (
  4.     "document-flow-server/internal/auth"
  5.     "document-flow-server/internal/models"
  6.     "document-flow-server/internal/services"
  7.     "document-flow-server/internal/transport/utils"
  8.     "mime/multipart"
  9.     "net/http"
  10. )
  11.  
  12. // GetTemplates возвращает список шаблонов: либо всех, либо с пагинацией
  13. //
  14. // @Summary Получение списка шаблонов
  15. // @Description Возвращает список шаблонов с возможностью поиска и пагинации. Если `page` и `limit` не передаются, то возвращаются все шаблоны.
  16. // @Tags Шаблоны
  17. // @Accept json
  18. // @Produce json
  19. // @Param page query int false "Номер страницы (если не передается, то возвращаются все шаблоны)"
  20. // @Param limit query int false "Количество элементов на странице (если не передается, то возвращаются все шаблоны)"
  21. // @Param search query string false "Поисковый запрос"
  22. // @Success 200 {object} models.TemplatesResponse "Список шаблонов"
  23. // @Success 204 "Шаблоны не найдены"
  24. // @Failure 400 "Неверные параметры пагинации"
  25. // @Failure 500 "Внутренняя ошибка сервера"
  26. // @Router /templates [get]
  27. func GetTemplates(w http.ResponseWriter, r *http.Request) {
  28.     holder := utils.GetRequestValuesHolder(r, "page", "limit", "search")
  29.  
  30.     page, err := holder.Uint64FromQuery("page").GetInt()
  31.     utils.ThrowIfNotNil(w, err)
  32.  
  33.     limit, err := holder.Uint64FromQuery("limit").GetInt()
  34.     utils.ThrowIfNotNil(w, err)
  35.  
  36.     query := holder.StringFromQuery("search").Get()
  37.  
  38.     var templatesResponse models.TemplatesResponse
  39.     if query != nil {
  40.         templatesResponse, err = services.SearchTemplates(*query, page, limit)
  41.     } else {
  42.         templatesResponse, err = services.GetTemplates(page, limit)
  43.     }
  44.     utils.ThrowIfNotNil(w, err, "ошибка получения шаблонов: ")
  45.  
  46.     if templatesResponse.TotalCount == 0 {
  47.         utils.WriteJSONResponse(w, nil, http.StatusNoContent)
  48.     } else {
  49.         utils.WriteJSONResponse(w, templatesResponse, http.StatusOK)
  50.     }
  51. }
  52.  
  53. // CreateTemplate создает шаблон, сохраняет его вместе с метаданными и возвращает его с предзагруженными данными
  54. //
  55. // @Summary Создание нового шаблона
  56. // @Description Создает новый шаблон, файл и метаданные сохраняет на сервере.
  57. // @Tags Шаблоны
  58. // @Accept multipart/form-data
  59. // @Produce json
  60. // @Param template formData string true "JSON типа Template с метаданными шаблона"
  61. // @Param file formData file true "Файл шаблона .docx"
  62. // @Success 201 {object} models.Template "Созданный шаблон"
  63. // @Failure 400 "Ошибка запроса (неверные данные формы или отсутствие файла)"
  64. // @Failure 403 "Доступ запрещен"
  65. // @Failure 409 "Шаблон с таким именем уже существует"
  66. // @Failure 500 "Внутренняя ошибка сервера"
  67. // @Router /templates [post]
  68. func CreateTemplate(w http.ResponseWriter, r *http.Request) {
  69.     err := utils.ParseMultipartForm(w, r, 20)
  70.     utils.ThrowIfNotNil(w, err, "Не удается проанализировать данные формы по причине: ")
  71.  
  72.     holder := utils.GetRequestValuesHolder(r, "template", "file")
  73.  
  74.     templateJson := holder.StringFromData("template").Get()
  75.     fileWrapper := holder.FileFromData("file")
  76.     utils.ThrowIfNotNil(w, fileWrapper.Error, "Ошибка при извлечении файла: ")
  77.  
  78.     if fileWrapper.File == nil || templateJson == nil {
  79.         utils.ThrowBadRequest(w, "отсутствует параметр `file` или `template`")
  80.     }
  81.     defer fileWrapper.File.Close()
  82.  
  83.     user, _ := auth.GetUserFromContext(r)
  84.  
  85.     createdTemplate, err := services.CreateTemplate(*templateJson, &fileWrapper.File, fileWrapper.Header, user)
  86.     utils.ThrowIfNotNil(w, err)
  87.  
  88.     utils.WriteJSONResponse(w, createdTemplate, http.StatusCreated)
  89. }
  90.  
  91. // GetTemplate возвращает данные шаблона по идентификатору
  92. //
  93. // @Summary Получение шаблона по идентификатору
  94. // @Description Возвращает шаблон по уникальному идентификатору.
  95. // @Tags Шаблоны
  96. // @Accept json
  97. // @Produce json
  98. // @Param id path int true "ID шаблона"
  99. // @Success 200 {object} models.Template "Найденный документ"
  100. // @Failure 400 "Некорректный ID"
  101. // @Failure 404 "Шаблон не найден"
  102. // @Failure 500 "Внутренняя ошибка сервера"
  103. // @Router /templates/{id} [get]
  104. func GetTemplate(w http.ResponseWriter, r *http.Request) {
  105.     holder := utils.GetRequestValuesHolder(r, "id")
  106.  
  107.     id, err := holder.Uint64FromPath("id").Get()
  108.     utils.ThrowIfNotNil(w, err)
  109.  
  110.     template, err := services.GetTemplateById(*id)
  111.     utils.ThrowIfNotNil(w, err)
  112.  
  113.     utils.WriteJSONResponse(w, template, http.StatusOK)
  114. }
  115.  
  116. // UpdateTemplate обновляет шаблон по идентификатору
  117. // @Summary Обновление шаблона по идентификатору
  118. // @Description Обновляет шаблон по по уникальному идентификатору с возможностью частичного обновления полей.
  119. // @Tags Шаблоны
  120. // @Accept multipart/form-data
  121. // @Produce json
  122. // @Param id path int true "ID шаблона"
  123. // @Param template formData string false "JSON с обновляемыми полями шаблона"
  124. // @Param file formData file false "Новый файл шаблона"
  125. // @Success 200 {object} models.Template "Обновленный шаблон"
  126. // @Failure 400 "Неверные данные"
  127. // @Failure 403 "Доступ запрещен"
  128. // @Failure 404 "Шаблон не найден"
  129. // @Failure 409 "Шаблон с таким именем уже существует"
  130. // @Failure 500 "Внутренняя ошибка"
  131. // @Router /templates/{id} [patch]
  132. func UpdateTemplate(w http.ResponseWriter, r *http.Request) {
  133.     err := utils.ParseMultipartForm(w, r, 20)
  134.     utils.ThrowIfNotNil(w, err, "Ошибка парсинга формы: ")
  135.  
  136.     holder := utils.GetRequestValuesHolder(r, "id", "template", "file")
  137.  
  138.     id, err := holder.Uint64FromPath("id").Get()
  139.     utils.ThrowIfNotNil(w, err)
  140.  
  141.     templateJsonPtr := holder.StringFromData("template").Get()
  142.     var templateJson string
  143.     if templateJsonPtr != nil {
  144.         templateJson = *templateJsonPtr
  145.     }
  146.  
  147.     fileWrapper := holder.FileFromData("file")
  148.     utils.ThrowIfNotNil(w, fileWrapper.Error, "Ошибка получения файла: ")
  149.     var file *multipart.File
  150.     var fileHeader *multipart.FileHeader
  151.     if fileWrapper.File != nil {
  152.         file = &fileWrapper.File
  153.         fileHeader = fileWrapper.Header
  154.         defer fileWrapper.File.Close()
  155.     }
  156.  
  157.     user, _ := auth.GetUserFromContext(r)
  158.  
  159.     updatedTemplate, err := services.UpdateTemplateById(*id, templateJson, file, fileHeader, user)
  160.     utils.ThrowIfNotNil(w, err)
  161.  
  162.     utils.WriteJSONResponse(w, updatedTemplate, http.StatusOK)
  163. }
  164.  
  165. // DeleteTemplate удаляет шаблон по идентификатору
  166. //
  167. // @Summary Удаление шаблона по идентификатору
  168. // @Description Удаляет шаблон по идентификатору.
  169. // @Tags Шаблоны
  170. // @Accept json
  171. // @Produce json
  172. // @Param id path int true "ID шаблона"
  173. // @Success 204 "Шаблон успешно удален"
  174. // @Failure 400 "Некорректный ID"
  175. // @Failure 403 "Доступ запрещен"
  176. // @Failure 404 "Шаблон не найден"
  177. // @Failure 500 "Внутренняя ошибка сервера"
  178. // @Router /templates/{id} [delete]
  179. func DeleteTemplate(w http.ResponseWriter, r *http.Request) {
  180.     holder := utils.GetRequestValuesHolder(r, "id")
  181.  
  182.     id, err := holder.Uint64FromPath("id").Get()
  183.     utils.ThrowIfNotNil(w, err)
  184.  
  185.     user, _ := auth.GetUserFromContext(r)
  186.  
  187.     err = services.DeleteTemplateById(*id, user)
  188.     utils.ThrowIfNotNil(w, err)
  189.  
  190.     utils.WriteJSONResponse(w, nil, http.StatusNoContent)
  191. }
  192.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement