Advertisement
bruimafia

document handler

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