diff --git a/docs/docs.go b/docs/docs.go index a232b91..0111bc4 100644 --- a/docs/docs.go +++ b/docs/docs.go @@ -68,9 +68,6 @@ const docTemplate = `{ } ], "description": "Получить все записи мерча", - "produces": [ - "application/json" - ], "tags": [ "Merch" ], @@ -106,9 +103,6 @@ const docTemplate = `{ } ], "description": "Обновить информацию про мерч по его uuid в json-е", - "consumes": [ - "application/json" - ], "tags": [ "Merch" ], @@ -151,9 +145,6 @@ const docTemplate = `{ } ], "description": "Получить картинки по merch_uuid и query параметрам", - "produces": [ - "application/json" - ], "tags": [ "Merch images" ], @@ -296,9 +287,6 @@ const docTemplate = `{ } ], "description": "Получить все метки товаров", - "produces": [ - "application/json" - ], "tags": [ "Merch labels" ], @@ -334,9 +322,6 @@ const docTemplate = `{ } ], "description": "Создать новую метку для товара", - "consumes": [ - "application/json" - ], "tags": [ "Merch labels" ], @@ -379,9 +364,6 @@ const docTemplate = `{ } ], "description": "Прикрепить метку к товару", - "consumes": [ - "application/json" - ], "tags": [ "Merch labels" ], @@ -424,9 +406,6 @@ const docTemplate = `{ } ], "description": "Удалить привязку метки к товару", - "consumes": [ - "application/json" - ], "tags": [ "Merch labels" ], @@ -462,47 +441,6 @@ const docTemplate = `{ } }, "/merch/labels/{uuid}": { - "get": { - "security": [ - { - "BearerAuth": [] - } - ], - "description": "Получить метки товара по его uuid", - "produces": [ - "application/json" - ], - "tags": [ - "Merch labels" - ], - "summary": "Получить метки товара по его uuid", - "parameters": [ - { - "type": "string", - "description": "label uuid", - "name": "uuid", - "in": "path", - "required": true - } - ], - "responses": { - "200": { - "description": "OK" - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/responses.ErrorResponse400" - } - }, - "500": { - "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/responses.ErrorResponse500" - } - } - } - }, "put": { "security": [ { @@ -510,9 +448,6 @@ const docTemplate = `{ } ], "description": "Изменить метку", - "consumes": [ - "application/json" - ], "tags": [ "Merch labels" ], @@ -592,136 +527,6 @@ const docTemplate = `{ } } }, - "/merch/zeroprices": { - "get": { - "security": [ - { - "BearerAuth": [] - } - ], - "description": "Получить нулевые цены", - "produces": [ - "application/json" - ], - "tags": [ - "Merch zero prices" - ], - "summary": "Получить нулевые цены", - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/merch.ZeroPrice" - } - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/responses.ErrorResponse400" - } - }, - "500": { - "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/responses.ErrorResponse500" - } - } - } - }, - "delete": { - "security": [ - { - "BearerAuth": [] - } - ], - "description": "Пометить нулевые цены как удаленные", - "consumes": [ - "application/json" - ], - "tags": [ - "Merch zero prices" - ], - "summary": "Пометить нулевые цены как удаленные", - "parameters": [ - { - "description": "payload", - "name": "payload", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/merch.DeleteZeroPrices" - } - } - ], - "responses": { - "200": { - "description": "OK" - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/responses.ErrorResponse400" - } - }, - "500": { - "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/responses.ErrorResponse500" - } - } - } - } - }, - "/merch/zeroprices/period": { - "delete": { - "security": [ - { - "BearerAuth": [] - } - ], - "description": "Пометить нулевые цены как удаленные за указанный период", - "tags": [ - "Merch zero prices" - ], - "summary": "Пометить нулевые цены как удаленные за указанный период", - "parameters": [ - { - "type": "string", - "description": "start", - "name": "start", - "in": "query", - "required": true - }, - { - "type": "string", - "description": "end", - "name": "end", - "in": "query", - "required": true - } - ], - "responses": { - "200": { - "description": "OK" - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/responses.ErrorResponse400" - } - }, - "500": { - "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/responses.ErrorResponse500" - } - } - } - } - }, "/merch/{uuid}": { "get": { "security": [ @@ -730,9 +535,6 @@ const docTemplate = `{ } ], "description": "Получить всю информацию про мерч по его uuid", - "produces": [ - "application/json" - ], "tags": [ "Merch" ], @@ -817,9 +619,6 @@ const docTemplate = `{ } ], "description": "Получить цены мерча за период", - "produces": [ - "application/json" - ], "tags": [ "Merch" ], @@ -865,9 +664,6 @@ const docTemplate = `{ } ], "description": "Получить перепады цен мерча за период по его merch_uuid", - "produces": [ - "application/json" - ], "tags": [ "Merch" ], @@ -1222,17 +1018,6 @@ const docTemplate = `{ } } }, - "merch.DeleteZeroPrices": { - "type": "object", - "properties": { - "id": { - "type": "integer" - }, - "merch_uuid": { - "type": "string" - } - } - }, "merch.ImageLink": { "type": "object", "properties": { @@ -1289,12 +1074,6 @@ const docTemplate = `{ "merch.ListResponse": { "type": "object", "properties": { - "labels": { - "type": "array", - "items": { - "type": "string" - } - }, "merch_uuid": { "type": "string" }, @@ -1314,12 +1093,6 @@ const docTemplate = `{ "merch.MerchDTO": { "type": "object", "properties": { - "labels": { - "type": "array", - "items": { - "type": "string" - } - }, "merch_uuid": { "type": "string" }, @@ -1401,26 +1174,6 @@ const docTemplate = `{ } } }, - "merch.ZeroPrice": { - "type": "object", - "properties": { - "created_at": { - "type": "string" - }, - "id": { - "type": "integer" - }, - "merch_uuid": { - "type": "string" - }, - "name": { - "type": "string" - }, - "origin": { - "type": "string" - } - } - }, "responses.ErrorResponse400": { "type": "object", "properties": { diff --git a/docs/swagger.json b/docs/swagger.json index 74a0031..7b17bd7 100644 --- a/docs/swagger.json +++ b/docs/swagger.json @@ -60,9 +60,6 @@ } ], "description": "Получить все записи мерча", - "produces": [ - "application/json" - ], "tags": [ "Merch" ], @@ -98,9 +95,6 @@ } ], "description": "Обновить информацию про мерч по его uuid в json-е", - "consumes": [ - "application/json" - ], "tags": [ "Merch" ], @@ -143,9 +137,6 @@ } ], "description": "Получить картинки по merch_uuid и query параметрам", - "produces": [ - "application/json" - ], "tags": [ "Merch images" ], @@ -288,9 +279,6 @@ } ], "description": "Получить все метки товаров", - "produces": [ - "application/json" - ], "tags": [ "Merch labels" ], @@ -326,9 +314,6 @@ } ], "description": "Создать новую метку для товара", - "consumes": [ - "application/json" - ], "tags": [ "Merch labels" ], @@ -371,9 +356,6 @@ } ], "description": "Прикрепить метку к товару", - "consumes": [ - "application/json" - ], "tags": [ "Merch labels" ], @@ -416,9 +398,6 @@ } ], "description": "Удалить привязку метки к товару", - "consumes": [ - "application/json" - ], "tags": [ "Merch labels" ], @@ -454,47 +433,6 @@ } }, "/merch/labels/{uuid}": { - "get": { - "security": [ - { - "BearerAuth": [] - } - ], - "description": "Получить метки товара по его uuid", - "produces": [ - "application/json" - ], - "tags": [ - "Merch labels" - ], - "summary": "Получить метки товара по его uuid", - "parameters": [ - { - "type": "string", - "description": "label uuid", - "name": "uuid", - "in": "path", - "required": true - } - ], - "responses": { - "200": { - "description": "OK" - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/responses.ErrorResponse400" - } - }, - "500": { - "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/responses.ErrorResponse500" - } - } - } - }, "put": { "security": [ { @@ -502,9 +440,6 @@ } ], "description": "Изменить метку", - "consumes": [ - "application/json" - ], "tags": [ "Merch labels" ], @@ -584,136 +519,6 @@ } } }, - "/merch/zeroprices": { - "get": { - "security": [ - { - "BearerAuth": [] - } - ], - "description": "Получить нулевые цены", - "produces": [ - "application/json" - ], - "tags": [ - "Merch zero prices" - ], - "summary": "Получить нулевые цены", - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/merch.ZeroPrice" - } - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/responses.ErrorResponse400" - } - }, - "500": { - "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/responses.ErrorResponse500" - } - } - } - }, - "delete": { - "security": [ - { - "BearerAuth": [] - } - ], - "description": "Пометить нулевые цены как удаленные", - "consumes": [ - "application/json" - ], - "tags": [ - "Merch zero prices" - ], - "summary": "Пометить нулевые цены как удаленные", - "parameters": [ - { - "description": "payload", - "name": "payload", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/merch.DeleteZeroPrices" - } - } - ], - "responses": { - "200": { - "description": "OK" - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/responses.ErrorResponse400" - } - }, - "500": { - "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/responses.ErrorResponse500" - } - } - } - } - }, - "/merch/zeroprices/period": { - "delete": { - "security": [ - { - "BearerAuth": [] - } - ], - "description": "Пометить нулевые цены как удаленные за указанный период", - "tags": [ - "Merch zero prices" - ], - "summary": "Пометить нулевые цены как удаленные за указанный период", - "parameters": [ - { - "type": "string", - "description": "start", - "name": "start", - "in": "query", - "required": true - }, - { - "type": "string", - "description": "end", - "name": "end", - "in": "query", - "required": true - } - ], - "responses": { - "200": { - "description": "OK" - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/responses.ErrorResponse400" - } - }, - "500": { - "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/responses.ErrorResponse500" - } - } - } - } - }, "/merch/{uuid}": { "get": { "security": [ @@ -722,9 +527,6 @@ } ], "description": "Получить всю информацию про мерч по его uuid", - "produces": [ - "application/json" - ], "tags": [ "Merch" ], @@ -809,9 +611,6 @@ } ], "description": "Получить цены мерча за период", - "produces": [ - "application/json" - ], "tags": [ "Merch" ], @@ -857,9 +656,6 @@ } ], "description": "Получить перепады цен мерча за период по его merch_uuid", - "produces": [ - "application/json" - ], "tags": [ "Merch" ], @@ -1214,17 +1010,6 @@ } } }, - "merch.DeleteZeroPrices": { - "type": "object", - "properties": { - "id": { - "type": "integer" - }, - "merch_uuid": { - "type": "string" - } - } - }, "merch.ImageLink": { "type": "object", "properties": { @@ -1281,12 +1066,6 @@ "merch.ListResponse": { "type": "object", "properties": { - "labels": { - "type": "array", - "items": { - "type": "string" - } - }, "merch_uuid": { "type": "string" }, @@ -1306,12 +1085,6 @@ "merch.MerchDTO": { "type": "object", "properties": { - "labels": { - "type": "array", - "items": { - "type": "string" - } - }, "merch_uuid": { "type": "string" }, @@ -1393,26 +1166,6 @@ } } }, - "merch.ZeroPrice": { - "type": "object", - "properties": { - "created_at": { - "type": "string" - }, - "id": { - "type": "integer" - }, - "merch_uuid": { - "type": "string" - }, - "name": { - "type": "string" - }, - "origin": { - "type": "string" - } - } - }, "responses.ErrorResponse400": { "type": "object", "properties": { diff --git a/docs/swagger.yaml b/docs/swagger.yaml index 31eaa0d..3dadf18 100644 --- a/docs/swagger.yaml +++ b/docs/swagger.yaml @@ -7,13 +7,6 @@ definitions: thumbnail: type: string type: object - merch.DeleteZeroPrices: - properties: - id: - type: integer - merch_uuid: - type: string - type: object merch.ImageLink: properties: etag: @@ -50,10 +43,6 @@ definitions: type: object merch.ListResponse: properties: - labels: - items: - type: string - type: array merch_uuid: type: string name: @@ -66,10 +55,6 @@ definitions: type: object merch.MerchDTO: properties: - labels: - items: - type: string - type: array merch_uuid: type: string name: @@ -122,19 +107,6 @@ definitions: origin: type: string type: object - merch.ZeroPrice: - properties: - created_at: - type: string - id: - type: integer - merch_uuid: - type: string - name: - type: string - origin: - type: string - type: object responses.ErrorResponse400: properties: error: @@ -233,8 +205,6 @@ paths: /merch/: get: description: Получить все записи мерча - produces: - - application/json responses: "200": description: OK @@ -256,8 +226,6 @@ paths: tags: - Merch put: - consumes: - - application/json description: Обновить информацию про мерч по его uuid в json-е parameters: - description: merch_uuid @@ -317,8 +285,6 @@ paths: name: uuid required: true type: string - produces: - - application/json responses: "200": description: OK @@ -375,8 +341,6 @@ paths: name: type required: true type: string - produces: - - application/json responses: "200": description: OK @@ -434,8 +398,6 @@ paths: /merch/labels: get: description: Получить все метки товаров - produces: - - application/json responses: "200": description: OK @@ -457,8 +419,6 @@ paths: tags: - Merch labels post: - consumes: - - application/json description: Создать новую метку для товара parameters: - description: payload @@ -508,35 +468,7 @@ paths: summary: Пометить метку как удаленную tags: - Merch labels - get: - description: Получить метки товара по его uuid - parameters: - - description: label uuid - in: path - name: uuid - required: true - type: string - produces: - - application/json - responses: - "200": - description: OK - "400": - description: Bad Request - schema: - $ref: '#/definitions/responses.ErrorResponse400' - "500": - description: Internal Server Error - schema: - $ref: '#/definitions/responses.ErrorResponse500' - security: - - BearerAuth: [] - summary: Получить метки товара по его uuid - tags: - - Merch labels put: - consumes: - - application/json description: Изменить метку parameters: - description: label uuid @@ -568,8 +500,6 @@ paths: - Merch labels /merch/labels/attach: post: - consumes: - - application/json description: Прикрепить метку к товару parameters: - description: payload @@ -596,8 +526,6 @@ paths: - Merch labels /merch/labels/detach: post: - consumes: - - application/json description: Удалить привязку метки к товару parameters: - description: payload @@ -622,88 +550,6 @@ paths: summary: Удалить привязку метки к товару tags: - Merch labels - /merch/zeroprices: - delete: - consumes: - - application/json - description: Пометить нулевые цены как удаленные - parameters: - - description: payload - in: body - name: payload - required: true - schema: - $ref: '#/definitions/merch.DeleteZeroPrices' - responses: - "200": - description: OK - "400": - description: Bad Request - schema: - $ref: '#/definitions/responses.ErrorResponse400' - "500": - description: Internal Server Error - schema: - $ref: '#/definitions/responses.ErrorResponse500' - security: - - BearerAuth: [] - summary: Пометить нулевые цены как удаленные - tags: - - Merch zero prices - get: - description: Получить нулевые цены - produces: - - application/json - responses: - "200": - description: OK - schema: - items: - $ref: '#/definitions/merch.ZeroPrice' - type: array - "400": - description: Bad Request - schema: - $ref: '#/definitions/responses.ErrorResponse400' - "500": - description: Internal Server Error - schema: - $ref: '#/definitions/responses.ErrorResponse500' - security: - - BearerAuth: [] - summary: Получить нулевые цены - tags: - - Merch zero prices - /merch/zeroprices/period: - delete: - description: Пометить нулевые цены как удаленные за указанный период - parameters: - - description: start - in: query - name: start - required: true - type: string - - description: end - in: query - name: end - required: true - type: string - responses: - "200": - description: OK - "400": - description: Bad Request - schema: - $ref: '#/definitions/responses.ErrorResponse400' - "500": - description: Internal Server Error - schema: - $ref: '#/definitions/responses.ErrorResponse500' - security: - - BearerAuth: [] - summary: Пометить нулевые цены как удаленные за указанный период - tags: - - Merch zero prices /prices: get: description: Получить цены мерча за период @@ -712,8 +558,6 @@ paths: in: query name: days type: string - produces: - - application/json responses: "200": description: OK @@ -747,8 +591,6 @@ paths: in: query name: days type: string - produces: - - application/json responses: "200": description: OK diff --git a/internal/api/merch/controller.go b/internal/api/merch/controller.go index a9f922a..41a6983 100644 --- a/internal/api/merch/controller.go +++ b/internal/api/merch/controller.go @@ -27,6 +27,7 @@ func newController(service *service, utils interfaces.Utils, expires time.Durati func (h *Handler) RegisterRoutes(r *gin.RouterGroup, authMW gin.HandlerFunc, refreshMW gin.HandlerFunc) { merchGroup := r.Group("/merch", authMW) + merchGroup.POST("/", h.controller.addMerch) merchGroup.GET("/:uuid", h.controller.getSingleMerch) merchGroup.GET("/", h.controller.getAllMerch) @@ -50,13 +51,6 @@ func (h *Handler) RegisterRoutes(r *gin.RouterGroup, authMW gin.HandlerFunc, ref labelsGroup.POST("/attach", h.controller.attachLabel) labelsGroup.POST("/detach", h.controller.detachLabel) labelsGroup.GET("/:uuid", h.controller.getMerchLabels) - - zeroPricesGroup := merchGroup.Group("/zeroprices", authMW) - zeroPricesGroup.GET("", h.controller.getZeroPrices) - zeroPricesGroup.DELETE("", h.controller.deleteZeroPrices) - - zeroPricesGroup.DELETE("/period", h.controller.deleteZeroPricesPeriod) - } // @Summary Добавить новый мерч @@ -98,7 +92,6 @@ func (co *controller) addMerch(c *gin.Context) { // @Description Получить всю информацию про мерч по его uuid // @Tags Merch // @Security BearerAuth -// @Produce json // @Param uuid path string true "merch_uuid" // @Success 200 {object} MerchDTO // @Failure 400 {object} responses.ErrorResponse400 @@ -132,7 +125,6 @@ func (co *controller) getSingleMerch(c *gin.Context) { // @Description Получить все записи мерча // @Tags Merch // @Security BearerAuth -// @Produce json // @Success 200 {array} ListResponse // @Failure 400 {object} responses.ErrorResponse400 // @Failure 500 {object} responses.ErrorResponse500 @@ -159,7 +151,6 @@ func (co *controller) getAllMerch(c *gin.Context) { // @Description Обновить информацию про мерч по его uuid в json-е // @Tags Merch // @Security BearerAuth -// @Accept json // @Param body body UpdateMerchDTO true "merch_uuid" // @Success 200 // @Failure 400 {object} responses.ErrorResponse400 @@ -185,7 +176,6 @@ func (co *controller) updateMerch(c *gin.Context) { log.WithError(err).Error("Merch | Failed to get single merch") return } - c.Status(http.StatusOK) } // @Summary Пометить мерч как удаленный @@ -196,7 +186,6 @@ func (co *controller) updateMerch(c *gin.Context) { // @Success 200 {object} MerchDTO // @Failure 400 {object} responses.ErrorResponse400 // @Failure 500 {object} responses.ErrorResponse500 -// // @Router /merch/{uuid} [delete] func (co *controller) deleteMerch(c *gin.Context) { merchUuid := c.Param("uuid") @@ -225,16 +214,11 @@ func (co *controller) deleteMerch(c *gin.Context) { // @Description Получить цены мерча за период // @Tags Merch // @Security BearerAuth -// @Produce json // @Param days query string false "period in days" // @Success 200 {array} PricesResponse // @Failure 400 {object} responses.ErrorResponse400 // @Failure 500 {object} responses.ErrorResponse500 // @Router /prices [get] -// -// @Failure 400 {object} responses.ErrorResponse400 -// @Failure 500 {object} responses.ErrorResponse500 -// @Router /prices [get] func (co *controller) getChartsPrices(c *gin.Context) { daysQuery := strings.ToLower(c.DefaultQuery("days", "")) @@ -259,7 +243,6 @@ func (co *controller) getChartsPrices(c *gin.Context) { // @Description Получить перепады цен мерча за период по его merch_uuid // @Tags Merch // @Security BearerAuth -// @Produce json // @Param uuid path string true "merch_uuid" // @Param days query string false "period in days" // @Success 200 {object} PricesResponse @@ -347,6 +330,7 @@ func (co *controller) uploadMerchImage(c *gin.Context) { return } + //c.Status(http.StatusOK) c.JSON(http.StatusOK, response) } @@ -354,7 +338,6 @@ func (co *controller) uploadMerchImage(c *gin.Context) { // @Description Получить картинки по merch_uuid и query параметрам // @Tags Merch images // @Security BearerAuth -// @Produce json // @Param uuid path string true "merch_uuid" // @Param type query string true "image type" // @Success 200 {object} ImageLink @@ -401,6 +384,7 @@ func (co *controller) getMerchImage(c *gin.Context) { //} // //c.JSON(http.StatusOK, link) + c.JSON(http.StatusNotImplemented, gin.H{"msg": "Method deprecated. Request images from image storage."}) } // @Summary Удалить (безвозвратно) картинки по merch_uuid @@ -445,7 +429,6 @@ func (co *controller) deleteMerchImage(c *gin.Context) { // @Description Создать новую метку для товара // @Tags Merch labels // @Security BearerAuth -// @Accept json // @Param payload body LabelDTO true "payload" // @Success 200 // @Failure 400 {object} responses.ErrorResponse400 @@ -481,7 +464,6 @@ func (co *controller) createLabel(c *gin.Context) { // @Description Получить все метки товаров // @Tags Merch labels // @Security BearerAuth -// @Produce json // @Success 200 {array} LabelsList // @Failure 400 {object} responses.ErrorResponse400 // @Failure 500 {object} responses.ErrorResponse500 @@ -510,7 +492,6 @@ func (co *controller) getLabels(c *gin.Context) { // @Description Изменить метку // @Tags Merch labels // @Security BearerAuth -// @Accept json // @Param uuid path string true "label uuid" // @Param payload body LabelDTO true "payload" // @Success 200 @@ -587,7 +568,6 @@ func (co *controller) deleteLabel(c *gin.Context) { // @Description Прикрепить метку к товару // @Tags Merch labels // @Security BearerAuth -// @Accept json // @Param payload body LabelLink true "payload" // @Success 200 // @Failure 400 {object} responses.ErrorResponse400 @@ -622,7 +602,6 @@ func (co *controller) attachLabel(c *gin.Context) { // @Description Удалить привязку метки к товару // @Tags Merch labels // @Security BearerAuth -// @Accept json // @Param payload body LabelLink true "payload" // @Success 200 // @Failure 400 {object} responses.ErrorResponse400 @@ -657,7 +636,6 @@ func (co *controller) detachLabel(c *gin.Context) { // @Description Получить метки товара по его uuid // @Tags Merch labels // @Security BearerAuth -// @Produce json // @Param uuid path string true "label uuid" // @Success 200 // @Failure 400 {object} responses.ErrorResponse400 @@ -688,109 +666,3 @@ func (co *controller) getMerchLabels(c *gin.Context) { } c.JSON(http.StatusOK, response) } - -// @Summary Получить нулевые цены -// @Description Получить нулевые цены -// @Tags Merch zero prices -// @Security BearerAuth -// @Produce json -// @Success 200 {array} ZeroPrice -// @Failure 400 {object} responses.ErrorResponse400 -// @Failure 500 {object} responses.ErrorResponse500 -// @Router /merch/zeroprices [get] -func (co *controller) getZeroPrices(c *gin.Context) { - const logMsg = "Merch | Get zero prices" - - userUuid, err := co.utils.GetUserUuidFromContext(c) - if err != nil { - c.JSON(http.StatusInternalServerError, responses.ErrorResponse500{Error: err.Error()}) - log.WithError(err).Error(logMsg) - return - } - - response, err := co.service.getZeroPrices(userUuid) - if err != nil { - c.JSON(http.StatusInternalServerError, responses.ErrorResponse500{Error: err.Error()}) - log.WithError(err).Error(logMsg) - return - } - - c.JSON(http.StatusOK, response) -} - -// @Summary Пометить нулевые цены как удаленные -// @Description Пометить нулевые цены как удаленные -// @Tags Merch zero prices -// @Security BearerAuth -// @Accept json -// @Param payload body DeleteZeroPrices true "payload" -// @Success 200 -// @Failure 400 {object} responses.ErrorResponse400 -// @Failure 500 {object} responses.ErrorResponse500 -// @Router /merch/zeroprices [delete] -func (co *controller) deleteZeroPrices(c *gin.Context) { - const logMsg = "Merch | Delete zero prices" - - userUuid, err := co.utils.GetUserUuidFromContext(c) - if err != nil { - c.JSON(http.StatusInternalServerError, responses.ErrorResponse500{Error: err.Error()}) - log.WithError(err).Error(logMsg) - return - } - - var payload []DeleteZeroPrices - if err = c.ShouldBindJSON(&payload); err != nil { - c.JSON(http.StatusBadRequest, responses.ErrorResponse400{Error: err.Error()}) - log.WithError(err).Error(logMsg) - return - } - - if err = co.service.deleteZeroPrices(userUuid, payload); err != nil { - c.JSON(http.StatusInternalServerError, responses.ErrorResponse500{Error: err.Error()}) - log.WithError(err).Error(logMsg) - return - } - c.Status(http.StatusOK) -} - -// @Summary Пометить нулевые цены как удаленные за указанный период -// @Description Пометить нулевые цены как удаленные за указанный период -// @Tags Merch zero prices -// @Security BearerAuth -// @Param start query string true "start" -// @Param end query string true "end" -// @Success 200 -// @Failure 400 {object} responses.ErrorResponse400 -// @Failure 500 {object} responses.ErrorResponse500 -// @Router /merch/zeroprices/period [delete] -func (co *controller) deleteZeroPricesPeriod(c *gin.Context) { - const logMsg = "Merch | Delete zero prices period" - - userUuid, err := co.utils.GetUserUuidFromContext(c) - if err != nil { - c.JSON(http.StatusInternalServerError, responses.ErrorResponse500{Error: err.Error()}) - log.WithError(err).Error(logMsg) - return - } - - start, err := co.utils.ParseTime(c.Query("start")) - if err != nil { - c.JSON(http.StatusBadRequest, responses.ErrorResponse400{Error: err.Error()}) - log.WithError(err).Error(logMsg) - return - } - - end, err := co.utils.ParseTime(c.Query("end")) - if err != nil { - c.JSON(http.StatusBadRequest, responses.ErrorResponse400{Error: err.Error()}) - log.WithError(err).Error(logMsg) - return - } - - if err = co.service.deleteZeroPricesPeriod(userUuid, start, end); err != nil { - c.JSON(http.StatusInternalServerError, responses.ErrorResponse500{Error: err.Error()}) - log.WithError(err).Error(logMsg) - return - } - c.Status(http.StatusOK) -} diff --git a/internal/api/merch/dto.go b/internal/api/merch/dto.go index 5b9180c..2f267b1 100644 --- a/internal/api/merch/dto.go +++ b/internal/api/merch/dto.go @@ -1,7 +1,5 @@ package merch -import "time" - type merchBundle struct { Merch *Merch Surugaya *Surugaya @@ -80,16 +78,3 @@ type LabelLink struct { MerchUuid string `json:"merch_uuid"` LabelUuid string `json:"label_uuid"` } - -type ZeroPrice struct { - Id int `json:"id"` - CreatedAt time.Time `json:"created_at"` - MerchUuid string `json:"merch_uuid"` - Name string `json:"name"` - Origin Origin `json:"origin"` -} - -type DeleteZeroPrices struct { - Id uint `json:"id"` - MerchUuid string `json:"merch_uuid"` -} diff --git a/internal/api/merch/model.go b/internal/api/merch/model.go index 2dd6e0e..935a194 100644 --- a/internal/api/merch/model.go +++ b/internal/api/merch/model.go @@ -44,8 +44,8 @@ func (Mandarake) TableName() string { type Price struct { Id uint `json:"id" gorm:"primary_key"` CreatedAt time.Time `json:"created_at" gorm:"column:created_at"` - UpdatedAt sql.NullTime `json:"updated_at,omitempty" gorm:"column:updated_at"` - DeletedAt sql.NullTime `json:"deleted_at,omitempty" gorm:"column:deleted_at"` + UpdatedAt sql.NullTime `json:"updated_at" gorm:"column:updated_at"` + DeletedAt sql.NullTime `json:"deleted_at" gorm:"column:deleted_at"` MerchUuid string `json:"merch_uuid" gorm:"column:merch_uuid"` Price int `json:"price" gorm:"column:price"` Origin Origin `json:"origin" gorm:"column:origin;type:integer"` diff --git a/internal/api/merch/repository.go b/internal/api/merch/repository.go index fe5dd7d..b5ecf39 100644 --- a/internal/api/merch/repository.go +++ b/internal/api/merch/repository.go @@ -22,7 +22,6 @@ type repository interface { addMerch(bundle merchBundle) error merchRecordExists(userUuid, merchUuid string) (bool, error) - userOwnsMerchUuids(userUuid string, merchUuids []string) ([]Merch, error) getSingleMerch(userUuid, merchUuid string) (merchBundle, error) getAllMerch(userUuid string) ([]ListResponse, error) @@ -39,10 +38,6 @@ type repository interface { type prices interface { getPricesWithDays(userUuid string, period time.Time) ([]Price, error) getDistinctPrices(userUuid, merchUuid string, period time.Time) (prices []Price, err error) - - getZeroPrices(userUuid string) ([]ZeroPrice, error) - deleteZeroPrices(list []DeleteZeroPrices) error - deleteZeroPricesPeriod(userUuid string, start, end time.Time) error } type labels interface { @@ -86,22 +81,6 @@ func (r *Repo) merchRecordExists(userUuid, merchUuid string) (bool, error) { return exists, err } -func (r *Repo) userOwnsMerchUuids(userUuid string, merchUuids []string) ([]Merch, error) { - var ownsUuids []Merch - err := r.db.Model(&Merch{}). - Select("merch_uuid"). - Where("user_uuid = ?", userUuid). - Where("merch_uuid IN (?)", merchUuids). - Where("deleted_at IS NULL"). - Find(&ownsUuids).Error - - if err != nil { - return nil, err - } - - return ownsUuids, nil -} - func (r *Repo) getSingleMerch(userUuid, merchUuid string) (merchBundle, error) { var merch Merch if err := r.db. @@ -332,59 +311,3 @@ func (r *Repo) getAttachedLabelsByUuid(userUuid, merchUuid string) ([]CardLabel, return labelsList, nil } - -func (r *Repo) getZeroPrices(userUuid string) ([]ZeroPrice, error) { - var priceList []ZeroPrice - if err := r.db.Raw(` - WITH price_with_neighbors AS ( - SELECT - p.id, p.created_at, p.merch_uuid, p.price, p.origin, m.name, - LAG(price) OVER (PARTITION BY p.merch_uuid, p.origin ORDER BY p.created_at, p.id) AS prev_price, - LEAD(price) OVER (PARTITION BY p.merch_uuid, p.origin ORDER BY p.created_at, p.id) AS next_price - FROM prices AS p - JOIN merch as m ON m.merch_uuid = p.merch_uuid - WHERE p.deleted_at IS NULL - AND m.deleted_at IS NULL - AND m.user_uuid = ?) - - SELECT - id, created_at, merch_uuid, origin, name - FROM price_with_neighbors - WHERE - price = 0 - AND prev_price IS NOT NULL - AND prev_price > 0 - AND next_price IS NOT NULL - AND next_price > 0; - `, userUuid).Scan(&priceList).Error; err != nil { - return nil, err - } - return priceList, nil -} - -func (r *Repo) deleteZeroPrices(list []DeleteZeroPrices) error { - for _, item := range list { - if err := r.db.Model(&Price{}). - Where("id = ? AND merch_uuid = ?", item.Id, item.MerchUuid). - Update("deleted_at", time.Now().UTC()).Error; err != nil { - return err - } - } - return nil -} - -func (r *Repo) deleteZeroPricesPeriod(userUuid string, start, end time.Time) error { - if err := r.db.Exec(` - UPDATE prices - SET deleted_at = ? - FROM merch - WHERE prices.merch_uuid = merch.merch_uuid - AND merch.user_uuid = ? - AND prices.price = 0 - AND prices.deleted_at IS NULL - AND prices.created_at BETWEEN ? AND ?; - `, time.Now().UTC(), userUuid, start, end).Error; err != nil { - return err - } - return nil -} diff --git a/internal/api/merch/service.go b/internal/api/merch/service.go index ae6c2f5..4689453 100644 --- a/internal/api/merch/service.go +++ b/internal/api/merch/service.go @@ -612,57 +612,3 @@ func (s *service) getMerchLabels(userUuid, merchUuid string) ([]string, error) { return response, nil } - -func (s *service) getZeroPrices(userUuid string) ([]ZeroPrice, error) { - return s.repo.getZeroPrices(userUuid) -} - -func (s *service) deleteZeroPrices(userUuid string, list []DeleteZeroPrices) error { - const delMsg = "Merch - service | Delete zero prices" - if len(list) == 0 { - return nil - } - - ids := make([]string, 0, len(list)) - for _, item := range list { - ids = append(ids, item.MerchUuid) - } - - uniqueMap := make(map[string]struct{}, len(list)) - uniqueIds := make([]string, 0, len(list)) - for _, id := range ids { - if _, ok := uniqueMap[id]; !ok { - uniqueMap[id] = struct{}{} - uniqueIds = append(uniqueIds, id) - } - } - - log.WithField("uuid count", len(uniqueIds)).Debug(delMsg) - - owns, err := s.repo.userOwnsMerchUuids(userUuid, uniqueIds) - if err != nil { - return err - } - - if len(owns) < 1 { - return errors.New("wrong ids") - } - - ownsMap := make(map[string]struct{}, len(owns)) - for _, own := range owns { - ownsMap[own.MerchUuid] = struct{}{} - } - - toDelete := make([]DeleteZeroPrices, 0, len(owns)) - for _, item := range list { - if _, ok := ownsMap[item.MerchUuid]; ok { - toDelete = append(toDelete, item) - } - } - - return s.repo.deleteZeroPrices(toDelete) -} - -func (s *service) deleteZeroPricesPeriod(userUuid string, start, end time.Time) error { - return s.repo.deleteZeroPricesPeriod(userUuid, start, end) -} diff --git a/internal/api/user/controller.go b/internal/api/user/controller.go index 48128f6..212865a 100644 --- a/internal/api/user/controller.go +++ b/internal/api/user/controller.go @@ -26,10 +26,10 @@ func newController(service *service, utils interfaces.Utils) *controller { func (h *Handler) RegisterRoutes(r *gin.RouterGroup, authMW gin.HandlerFunc, refreshMW gin.HandlerFunc) { userGroup := r.Group("/user") - userGroup.POST("", h.controller.register) - userGroup.GET("", authMW, h.controller.get) - userGroup.PUT("", authMW, h.controller.update) - userGroup.DELETE("", authMW, h.controller.delete) + userGroup.POST("/", h.controller.register) + userGroup.GET("/", authMW, h.controller.get) + userGroup.PUT("/", authMW, h.controller.update) + userGroup.DELETE("/", authMW, h.controller.delete) //auth h.controller.authPath = fmt.Sprintf("%s/user/auth", h.apiPrefix) diff --git a/internal/api/user/repository.go b/internal/api/user/repository.go index 4b0b754..87d2b2d 100644 --- a/internal/api/user/repository.go +++ b/internal/api/user/repository.go @@ -40,7 +40,7 @@ func (r *repo) getByUuid(userUuid string) (user User, err error) { } func (r *repo) update(user map[string]any) error { - return r.db.Model(&User{}).Where("uuid = ?", user["uuid"]).Updates(&user).Error + return r.db.Where("uuid = ?", user["uuid"]).Updates(&user).Error } func (r *repo) delete(userUuid string) error { diff --git a/internal/interfaces/utils.go b/internal/interfaces/utils.go index 31cd891..dd6b773 100644 --- a/internal/interfaces/utils.go +++ b/internal/interfaces/utils.go @@ -1,9 +1,6 @@ package interfaces -import ( - "github.com/gin-gonic/gin" - "time" -) +import "github.com/gin-gonic/gin" type Utils interface { IsEmail(email string) bool @@ -11,5 +8,4 @@ type Utils interface { GetRefreshUuidFromContext(c *gin.Context) (string, error) HashPassword(password string) (string, error) ComparePasswords(hashedPassword string, plainPassword string) error - ParseTime(t string) (time.Time, error) } diff --git a/pkg/utils/time.go b/pkg/utils/time.go deleted file mode 100644 index 01bfaf6..0000000 --- a/pkg/utils/time.go +++ /dev/null @@ -1,11 +0,0 @@ -package utils - -import "time" - -func (u *Utils) ParseTime(t string) (time.Time, error) { - timeStr, err := time.Parse(time.RFC3339, t) - if err != nil { - return time.Time{}, err - } - return timeStr, nil -}