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/constants"
- "document-flow-server/internal/models"
- "document-flow-server/internal/services"
- "document-flow-server/internal/transport/utils"
- "net/http"
- )
- // GetDocuments возвращает список документов с пагинацией
- //
- // @Summary Получение списка документов
- // @Description Возвращает список документов с возможностью поиска и пагинации.
- // @Tags Документы
- // @Accept json
- // @Produce json
- // @Param page query int false "Номер страницы" default(1)
- // @Param limit query int false "Количество элементов на странице" default(10)
- // @Param search query string false "Поисковый запрос"
- // @Success 200 {object} models.DocumentsResponse "Список документов"
- // @Success 204 "Документы не найдены"
- // @Failure 400 "Неверные параметры пагинации"
- // @Failure 500 "Внутренняя ошибка сервера"
- // @Router /documents [get]
- func GetDocuments(w http.ResponseWriter, r *http.Request) {
- page, limit := constants.PAGE_DEFAULT, constants.LIMIT_DEFAULT
- holder := utils.GetRequestValuesHolder(r, "page", "limit", "search")
- requestPage, err := holder.Uint64FromQuery("page").GetInt()
- utils.ThrowIfNotNil(w, err)
- updateIfNotNil(&page, requestPage)
- requestLimit, err := holder.Uint64FromQuery("limit").GetInt()
- utils.ThrowIfNotNil(w, err)
- updateIfNotNil(&limit, requestLimit)
- query := holder.StringFromQuery("search").Get()
- user, _ := auth.GetUserFromContext(r)
- var documentsResponse models.DocumentsResponse
- if query != nil {
- documentsResponse, err = services.SearchDocuments(*query, page, limit, user)
- } else {
- documentsResponse, err = services.GetDocuments(page, limit, user)
- }
- utils.ThrowIfNotNil(w, err, "Ошибка получения документов: ")
- if documentsResponse.TotalCount == 0 {
- utils.WriteJSONResponse(w, nil, http.StatusNoContent)
- } else {
- utils.WriteJSONResponse(w, documentsResponse, http.StatusOK)
- }
- }
- // updateIfNotNil изменяет переданную переменную, если значение не nil и больше 0.
- func updateIfNotNil(target *int, value *int) {
- if value != nil && *value > 0 {
- *target = *value
- }
- }
- // CreateDocument создает документ и сохраняет его вместе с метаданными и возвращает его с предзагруженными данными
- //
- // @Summary Создание нового документа
- // @Description Создает новый документ, файл и метаданные сохраняет на сервере.
- // @Tags Документы
- // @Accept multipart/form-data
- // @Produce json
- // @Param document formData string true "JSON типа Document с метаданными документа"
- // @Param templateFilePath formData string true "Путь к файлу шаблона (.docx)"
- // @Success 201 {object} models.Document "Созданный документ"
- // @Failure 400 "Ошибка запроса (неверные данные формы или отсутствие файла)"
- // @Failure 409 "Документ с таким именем уже существует у данного пользователя"
- // @Failure 500 "Внутренняя ошибка сервера"
- // @Router /documents [post]
- func CreateDocument(w http.ResponseWriter, r *http.Request) {
- holder := utils.GetRequestValuesHolder(r, "document", "templateFilePath")
- documentJson := holder.StringFromData("document").Get()
- templateFilePath := holder.StringFromData("templateFilePath").Get()
- if documentJson == nil || templateFilePath == nil {
- utils.ThrowBadRequest(w, "Отсутствует поле document либо поле templateFilePath")
- }
- createdDocument, err := services.CreateDocument(*documentJson, *templateFilePath)
- utils.ThrowIfNotNil(w, err)
- utils.WriteJSONResponse(w, createdDocument, http.StatusCreated)
- }
- // GetDocument возвращает данные документа по идентификатору
- //
- // @Summary Получение документа по идентификатору
- // @Description Возвращает документ по уникальному идентификатору.
- // @Tags Документы
- // @Accept json
- // @Produce json
- // @Param id path int true "ID документа"
- // @Success 200 {object} models.Document "Найденный документ"
- // @Failure 400 "Некорректный ID"
- // @Failure 403 "Доступ запрещен"
- // @Failure 404 "Документ не найден"
- // @Failure 500 "Внутренняя ошибка сервера"
- // @Router /documents/{id} [get]
- func GetDocument(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)
- document, err := services.GetDocumentById(*id, user)
- utils.ThrowIfNotNil(w, err)
- utils.WriteJSONResponse(w, document, http.StatusOK)
- }
- // UpdateDocument обновляет существующий документ по идентификатору, заменяя файл и метаданные
- //
- // @Summary Обновление существующего документа по идентификатору
- // @Description Обновляет существующий документ по идентификатору, принимая JSON-метаданные и файл.
- // @Tags Документы
- // @Accept multipart/form-data
- // @Produce json
- // @Param id path int true "ID документа"
- // @Param document formData string true "Обновленные метаданные документа в формате JSON типа Document"
- // @Param templateFilePath formData string true "Путь к файлу шаблона (.docx)"
- // @Success 200 {object} models.Document "Обновленный документ"
- // @Failure 400 "Ошибка запроса (неверные данные формы, некорректный ID или отсутствие данных)"
- // @Failure 403 "Доступ запрещен"
- // @Failure 500 "Внутренняя ошибка сервера"
- // @Router /documents/{id} [put]
- func UpdateDocument(w http.ResponseWriter, r *http.Request) {
- holder := utils.GetRequestValuesHolder(r, "id", "document", "templateFilePath")
- id, err := holder.Uint64FromPath("id").Get()
- utils.ThrowIfNotNil(w, err)
- documentJson := holder.StringFromData("document").Get()
- templateFilePath := holder.StringFromData("templateFilePath").Get()
- if documentJson == nil || templateFilePath == nil {
- utils.ThrowBadRequest(w, "Отсутствует поле document либо поле templateFilePath")
- }
- user, _ := auth.GetUserFromContext(r)
- updatedDocument, err := services.UpdateDocumentById(*id, *documentJson, *templateFilePath, user)
- utils.ThrowIfNotNil(w, err)
- utils.WriteJSONResponse(w, updatedDocument, http.StatusOK)
- }
- // DeleteDocument удаляет документ по идентификатору
- //
- // @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 /documents/{id} [delete]
- func DeleteDocument(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.DeleteDocumentById(*id, user)
- utils.ThrowIfNotNil(w, err)
- utils.WriteJSONResponse(w, nil, http.StatusNoContent)
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement