diff --git a/docs/docs.go b/docs/docs.go index 9ec07c9..8e556d2 100644 --- a/docs/docs.go +++ b/docs/docs.go @@ -15,88 +15,7 @@ const docTemplate = `{ "host": "{{.Host}}", "basePath": "{{.BasePath}}", "paths": { - "/merch/": { - "get": { - "security": [ - { - "BearerAuth": [] - } - ], - "description": "Получить все записи мерча", - "produces": [ - "application/json" - ], - "tags": [ - "Merch" - ], - "summary": "Получить все записи мерча", - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/merch.ListResponse" - } - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/responses.ErrorResponse400" - } - }, - "500": { - "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/responses.ErrorResponse500" - } - } - } - }, - "put": { - "security": [ - { - "BearerAuth": [] - } - ], - "description": "Обновить информацию про мерч по его uuid в json-е", - "consumes": [ - "application/json" - ], - "tags": [ - "Merch" - ], - "summary": "Обновить информацию про мерч", - "parameters": [ - { - "description": "merch_uuid", - "name": "body", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/merch.UpdateMerchDTO" - } - } - ], - "responses": { - "200": { - "description": "OK" - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/responses.ErrorResponse400" - } - }, - "500": { - "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/responses.ErrorResponse500" - } - } - } - }, + "/merch": { "post": { "security": [ { @@ -141,6 +60,83 @@ const docTemplate = `{ } } }, + "/merch/": { + "get": { + "security": [ + { + "BearerAuth": [] + } + ], + "description": "Получить все записи мерча", + "tags": [ + "Merch" + ], + "summary": "Получить все записи мерча", + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/merch.ListResponse" + } + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/responses.ErrorResponse400" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/responses.ErrorResponse500" + } + } + } + }, + "put": { + "security": [ + { + "BearerAuth": [] + } + ], + "description": "Обновить информацию про мерч по его uuid в json-е", + "tags": [ + "Merch" + ], + "summary": "Обновить информацию про мерч", + "parameters": [ + { + "description": "merch_uuid", + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/merch.UpdateMerchDTO" + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/responses.ErrorResponse400" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/responses.ErrorResponse500" + } + } + } + } + }, "/merch/images/{uuid}": { "get": { "security": [ @@ -149,9 +145,6 @@ const docTemplate = `{ } ], "description": "Получить картинки по merch_uuid и query параметрам", - "produces": [ - "application/json" - ], "tags": [ "Merch images" ], @@ -286,440 +279,6 @@ const docTemplate = `{ } } }, - "/merch/labels": { - "get": { - "security": [ - { - "BearerAuth": [] - } - ], - "description": "Получить все метки товаров", - "produces": [ - "application/json" - ], - "tags": [ - "Merch labels" - ], - "summary": "Получить все метки товаров", - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/merch.LabelsList" - } - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/responses.ErrorResponse400" - } - }, - "500": { - "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/responses.ErrorResponse500" - } - } - } - }, - "post": { - "security": [ - { - "BearerAuth": [] - } - ], - "description": "Создать новую метку для товара", - "consumes": [ - "application/json" - ], - "tags": [ - "Merch labels" - ], - "summary": "Создать новую метку для товара", - "parameters": [ - { - "description": "payload", - "name": "payload", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/merch.LabelDTO" - } - } - ], - "responses": { - "200": { - "description": "OK" - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/responses.ErrorResponse400" - } - }, - "500": { - "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/responses.ErrorResponse500" - } - } - } - } - }, - "/merch/labels/attach": { - "post": { - "security": [ - { - "BearerAuth": [] - } - ], - "description": "Прикрепить метку к товару", - "consumes": [ - "application/json" - ], - "tags": [ - "Merch labels" - ], - "summary": "Прикрепить метку к товару", - "parameters": [ - { - "description": "payload", - "name": "payload", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/merch.LabelLink" - } - } - ], - "responses": { - "200": { - "description": "OK" - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/responses.ErrorResponse400" - } - }, - "500": { - "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/responses.ErrorResponse500" - } - } - } - } - }, - "/merch/labels/detach": { - "post": { - "security": [ - { - "BearerAuth": [] - } - ], - "description": "Удалить привязку метки к товару", - "consumes": [ - "application/json" - ], - "tags": [ - "Merch labels" - ], - "summary": "Удалить привязку метки к товару", - "parameters": [ - { - "description": "payload", - "name": "payload", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/merch.LabelLink" - } - } - ], - "responses": { - "200": { - "description": "OK" - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/responses.ErrorResponse400" - } - }, - "500": { - "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/responses.ErrorResponse500" - } - } - } - } - }, - "/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": [ - { - "BearerAuth": [] - } - ], - "description": "Изменить метку", - "consumes": [ - "application/json" - ], - "tags": [ - "Merch labels" - ], - "summary": "Изменить метку", - "parameters": [ - { - "type": "string", - "description": "label uuid", - "name": "uuid", - "in": "path", - "required": true - }, - { - "description": "payload", - "name": "payload", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/merch.LabelDTO" - } - } - ], - "responses": { - "200": { - "description": "OK" - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/responses.ErrorResponse400" - } - }, - "500": { - "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/responses.ErrorResponse500" - } - } - } - }, - "delete": { - "security": [ - { - "BearerAuth": [] - } - ], - "description": "Пометить метку как удаленную", - "tags": [ - "Merch labels" - ], - "summary": "Пометить метку как удаленную", - "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" - } - } - } - } - }, - "/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": [ @@ -728,9 +287,6 @@ const docTemplate = `{ } ], "description": "Получить всю информацию про мерч по его uuid", - "produces": [ - "application/json" - ], "tags": [ "Merch" ], @@ -815,9 +371,6 @@ const docTemplate = `{ } ], "description": "Получить цены мерча за период", - "produces": [ - "application/json" - ], "tags": [ "Merch" ], @@ -863,9 +416,6 @@ const docTemplate = `{ } ], "description": "Получить перепады цен мерча за период по его merch_uuid", - "produces": [ - "application/json" - ], "tags": [ "Merch" ], @@ -1220,25 +770,6 @@ const docTemplate = `{ } } }, - "merch.AmiamiDTO": { - "type": "object", - "properties": { - "link": { - "type": "string" - } - } - }, - "merch.DeleteZeroPrices": { - "type": "object", - "properties": { - "id": { - "type": "integer" - }, - "merch_uuid": { - "type": "string" - } - } - }, "merch.ImageLink": { "type": "object", "properties": { @@ -1250,57 +781,9 @@ const docTemplate = `{ } } }, - "merch.LabelDTO": { - "type": "object", - "properties": { - "bg_color": { - "type": "string" - }, - "color": { - "type": "string" - }, - "name": { - "type": "string" - } - } - }, - "merch.LabelLink": { - "type": "object", - "properties": { - "label_uuid": { - "type": "string" - }, - "merch_uuid": { - "type": "string" - } - } - }, - "merch.LabelsList": { - "type": "object", - "properties": { - "bg_color": { - "type": "string" - }, - "color": { - "type": "string" - }, - "label_uuid": { - "type": "string" - }, - "name": { - "type": "string" - } - } - }, "merch.ListResponse": { "type": "object", "properties": { - "labels": { - "type": "array", - "items": { - "type": "string" - } - }, "merch_uuid": { "type": "string" }, @@ -1320,21 +803,12 @@ const docTemplate = `{ "merch.MerchDTO": { "type": "object", "properties": { - "labels": { - "type": "array", - "items": { - "type": "string" - } - }, "merch_uuid": { "type": "string" }, "name": { "type": "string" }, - "origin_amiami": { - "$ref": "#/definitions/merch.AmiamiDTO" - }, "origin_mandarake": { "$ref": "#/definitions/merch.MandarakeDTO" }, @@ -1346,7 +820,7 @@ const docTemplate = `{ "merch.OriginWithPrices": { "type": "object", "properties": { - "origins": { + "origin": { "type": "integer" }, "prices": { @@ -1405,31 +879,11 @@ const docTemplate = `{ "name": { "type": "string" }, - "origins": { + "origin": { "type": "string" } } }, - "merch.ZeroPrice": { - "type": "object", - "properties": { - "created_at": { - "type": "string" - }, - "id": { - "type": "integer" - }, - "merch_uuid": { - "type": "string" - }, - "name": { - "type": "string" - }, - "origins": { - "type": "integer" - } - } - }, "responses.ErrorResponse400": { "type": "object", "properties": { diff --git a/docs/swagger.json b/docs/swagger.json index d132129..ea5dbf2 100644 --- a/docs/swagger.json +++ b/docs/swagger.json @@ -7,88 +7,7 @@ }, "basePath": "/api/v2", "paths": { - "/merch/": { - "get": { - "security": [ - { - "BearerAuth": [] - } - ], - "description": "Получить все записи мерча", - "produces": [ - "application/json" - ], - "tags": [ - "Merch" - ], - "summary": "Получить все записи мерча", - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/merch.ListResponse" - } - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/responses.ErrorResponse400" - } - }, - "500": { - "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/responses.ErrorResponse500" - } - } - } - }, - "put": { - "security": [ - { - "BearerAuth": [] - } - ], - "description": "Обновить информацию про мерч по его uuid в json-е", - "consumes": [ - "application/json" - ], - "tags": [ - "Merch" - ], - "summary": "Обновить информацию про мерч", - "parameters": [ - { - "description": "merch_uuid", - "name": "body", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/merch.UpdateMerchDTO" - } - } - ], - "responses": { - "200": { - "description": "OK" - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/responses.ErrorResponse400" - } - }, - "500": { - "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/responses.ErrorResponse500" - } - } - } - }, + "/merch": { "post": { "security": [ { @@ -133,6 +52,83 @@ } } }, + "/merch/": { + "get": { + "security": [ + { + "BearerAuth": [] + } + ], + "description": "Получить все записи мерча", + "tags": [ + "Merch" + ], + "summary": "Получить все записи мерча", + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/merch.ListResponse" + } + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/responses.ErrorResponse400" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/responses.ErrorResponse500" + } + } + } + }, + "put": { + "security": [ + { + "BearerAuth": [] + } + ], + "description": "Обновить информацию про мерч по его uuid в json-е", + "tags": [ + "Merch" + ], + "summary": "Обновить информацию про мерч", + "parameters": [ + { + "description": "merch_uuid", + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/merch.UpdateMerchDTO" + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/responses.ErrorResponse400" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/responses.ErrorResponse500" + } + } + } + } + }, "/merch/images/{uuid}": { "get": { "security": [ @@ -141,9 +137,6 @@ } ], "description": "Получить картинки по merch_uuid и query параметрам", - "produces": [ - "application/json" - ], "tags": [ "Merch images" ], @@ -278,440 +271,6 @@ } } }, - "/merch/labels": { - "get": { - "security": [ - { - "BearerAuth": [] - } - ], - "description": "Получить все метки товаров", - "produces": [ - "application/json" - ], - "tags": [ - "Merch labels" - ], - "summary": "Получить все метки товаров", - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/merch.LabelsList" - } - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/responses.ErrorResponse400" - } - }, - "500": { - "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/responses.ErrorResponse500" - } - } - } - }, - "post": { - "security": [ - { - "BearerAuth": [] - } - ], - "description": "Создать новую метку для товара", - "consumes": [ - "application/json" - ], - "tags": [ - "Merch labels" - ], - "summary": "Создать новую метку для товара", - "parameters": [ - { - "description": "payload", - "name": "payload", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/merch.LabelDTO" - } - } - ], - "responses": { - "200": { - "description": "OK" - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/responses.ErrorResponse400" - } - }, - "500": { - "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/responses.ErrorResponse500" - } - } - } - } - }, - "/merch/labels/attach": { - "post": { - "security": [ - { - "BearerAuth": [] - } - ], - "description": "Прикрепить метку к товару", - "consumes": [ - "application/json" - ], - "tags": [ - "Merch labels" - ], - "summary": "Прикрепить метку к товару", - "parameters": [ - { - "description": "payload", - "name": "payload", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/merch.LabelLink" - } - } - ], - "responses": { - "200": { - "description": "OK" - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/responses.ErrorResponse400" - } - }, - "500": { - "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/responses.ErrorResponse500" - } - } - } - } - }, - "/merch/labels/detach": { - "post": { - "security": [ - { - "BearerAuth": [] - } - ], - "description": "Удалить привязку метки к товару", - "consumes": [ - "application/json" - ], - "tags": [ - "Merch labels" - ], - "summary": "Удалить привязку метки к товару", - "parameters": [ - { - "description": "payload", - "name": "payload", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/merch.LabelLink" - } - } - ], - "responses": { - "200": { - "description": "OK" - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/responses.ErrorResponse400" - } - }, - "500": { - "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/responses.ErrorResponse500" - } - } - } - } - }, - "/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": [ - { - "BearerAuth": [] - } - ], - "description": "Изменить метку", - "consumes": [ - "application/json" - ], - "tags": [ - "Merch labels" - ], - "summary": "Изменить метку", - "parameters": [ - { - "type": "string", - "description": "label uuid", - "name": "uuid", - "in": "path", - "required": true - }, - { - "description": "payload", - "name": "payload", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/merch.LabelDTO" - } - } - ], - "responses": { - "200": { - "description": "OK" - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/responses.ErrorResponse400" - } - }, - "500": { - "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/responses.ErrorResponse500" - } - } - } - }, - "delete": { - "security": [ - { - "BearerAuth": [] - } - ], - "description": "Пометить метку как удаленную", - "tags": [ - "Merch labels" - ], - "summary": "Пометить метку как удаленную", - "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" - } - } - } - } - }, - "/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": [ @@ -720,9 +279,6 @@ } ], "description": "Получить всю информацию про мерч по его uuid", - "produces": [ - "application/json" - ], "tags": [ "Merch" ], @@ -807,9 +363,6 @@ } ], "description": "Получить цены мерча за период", - "produces": [ - "application/json" - ], "tags": [ "Merch" ], @@ -855,9 +408,6 @@ } ], "description": "Получить перепады цен мерча за период по его merch_uuid", - "produces": [ - "application/json" - ], "tags": [ "Merch" ], @@ -1212,25 +762,6 @@ } } }, - "merch.AmiamiDTO": { - "type": "object", - "properties": { - "link": { - "type": "string" - } - } - }, - "merch.DeleteZeroPrices": { - "type": "object", - "properties": { - "id": { - "type": "integer" - }, - "merch_uuid": { - "type": "string" - } - } - }, "merch.ImageLink": { "type": "object", "properties": { @@ -1242,57 +773,9 @@ } } }, - "merch.LabelDTO": { - "type": "object", - "properties": { - "bg_color": { - "type": "string" - }, - "color": { - "type": "string" - }, - "name": { - "type": "string" - } - } - }, - "merch.LabelLink": { - "type": "object", - "properties": { - "label_uuid": { - "type": "string" - }, - "merch_uuid": { - "type": "string" - } - } - }, - "merch.LabelsList": { - "type": "object", - "properties": { - "bg_color": { - "type": "string" - }, - "color": { - "type": "string" - }, - "label_uuid": { - "type": "string" - }, - "name": { - "type": "string" - } - } - }, "merch.ListResponse": { "type": "object", "properties": { - "labels": { - "type": "array", - "items": { - "type": "string" - } - }, "merch_uuid": { "type": "string" }, @@ -1312,21 +795,12 @@ "merch.MerchDTO": { "type": "object", "properties": { - "labels": { - "type": "array", - "items": { - "type": "string" - } - }, "merch_uuid": { "type": "string" }, "name": { "type": "string" }, - "origin_amiami": { - "$ref": "#/definitions/merch.AmiamiDTO" - }, "origin_mandarake": { "$ref": "#/definitions/merch.MandarakeDTO" }, @@ -1338,7 +812,7 @@ "merch.OriginWithPrices": { "type": "object", "properties": { - "origins": { + "origin": { "type": "integer" }, "prices": { @@ -1397,31 +871,11 @@ "name": { "type": "string" }, - "origins": { + "origin": { "type": "string" } } }, - "merch.ZeroPrice": { - "type": "object", - "properties": { - "created_at": { - "type": "string" - }, - "id": { - "type": "integer" - }, - "merch_uuid": { - "type": "string" - }, - "name": { - "type": "string" - }, - "origins": { - "type": "integer" - } - } - }, "responses.ErrorResponse400": { "type": "object", "properties": { diff --git a/docs/swagger.yaml b/docs/swagger.yaml index ea2f927..1afef07 100644 --- a/docs/swagger.yaml +++ b/docs/swagger.yaml @@ -7,18 +7,6 @@ definitions: thumbnail: type: string type: object - merch.AmiamiDTO: - properties: - link: - type: string - type: object - merch.DeleteZeroPrices: - properties: - id: - type: integer - merch_uuid: - type: string - type: object merch.ImageLink: properties: etag: @@ -26,39 +14,8 @@ definitions: link: type: string type: object - merch.LabelDTO: - properties: - bg_color: - type: string - color: - type: string - name: - type: string - type: object - merch.LabelLink: - properties: - label_uuid: - type: string - merch_uuid: - type: string - type: object - merch.LabelsList: - properties: - bg_color: - type: string - color: - type: string - label_uuid: - type: string - name: - type: string - type: object merch.ListResponse: properties: - labels: - items: - type: string - type: array merch_uuid: type: string name: @@ -71,16 +28,10 @@ definitions: type: object merch.MerchDTO: properties: - labels: - items: - type: string - type: array merch_uuid: type: string name: type: string - origin_amiami: - $ref: '#/definitions/merch.AmiamiDTO' origin_mandarake: $ref: '#/definitions/merch.MandarakeDTO' origin_surugaya: @@ -88,7 +39,7 @@ definitions: type: object merch.OriginWithPrices: properties: - origins: + origin: type: integer prices: items: @@ -126,22 +77,9 @@ definitions: type: string name: type: string - origins: + origin: type: string type: object - merch.ZeroPrice: - properties: - created_at: - type: string - id: - type: integer - merch_uuid: - type: string - name: - type: string - origins: - type: integer - type: object responses.ErrorResponse400: properties: error: @@ -209,31 +147,7 @@ info: title: Merch Parser version: 2.0.0-alpha paths: - /merch/: - get: - description: Получить все записи мерча - produces: - - application/json - responses: - "200": - description: OK - schema: - items: - $ref: '#/definitions/merch.ListResponse' - 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 + /merch: post: consumes: - application/json @@ -261,9 +175,30 @@ paths: summary: Добавить новый мерч tags: - Merch + /merch/: + get: + description: Получить все записи мерча + responses: + "200": + description: OK + schema: + items: + $ref: '#/definitions/merch.ListResponse' + 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 put: - consumes: - - application/json description: Обновить информацию про мерч по его uuid в json-е parameters: - description: merch_uuid @@ -323,8 +258,6 @@ paths: name: uuid required: true type: string - produces: - - application/json responses: "200": description: OK @@ -381,8 +314,6 @@ paths: name: type required: true type: string - produces: - - application/json responses: "200": description: OK @@ -437,279 +368,6 @@ paths: summary: Загрузить картинку по merch_uuid tags: - Merch images - /merch/labels: - get: - description: Получить все метки товаров - produces: - - application/json - responses: - "200": - description: OK - schema: - items: - $ref: '#/definitions/merch.LabelsList' - 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 labels - post: - consumes: - - application/json - description: Создать новую метку для товара - parameters: - - description: payload - in: body - name: payload - required: true - schema: - $ref: '#/definitions/merch.LabelDTO' - 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 labels - /merch/labels/{uuid}: - delete: - description: Пометить метку как удаленную - parameters: - - description: label uuid - in: path - name: uuid - 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 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 - in: path - name: uuid - required: true - type: string - - description: payload - in: body - name: payload - required: true - schema: - $ref: '#/definitions/merch.LabelDTO' - 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 labels - /merch/labels/attach: - post: - consumes: - - application/json - description: Прикрепить метку к товару - parameters: - - description: payload - in: body - name: payload - required: true - schema: - $ref: '#/definitions/merch.LabelLink' - 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 labels - /merch/labels/detach: - post: - consumes: - - application/json - description: Удалить привязку метки к товару - parameters: - - description: payload - in: body - name: payload - required: true - schema: - $ref: '#/definitions/merch.LabelLink' - 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 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: Получить цены мерча за период @@ -718,8 +376,6 @@ paths: in: query name: days type: string - produces: - - application/json responses: "200": description: OK @@ -753,8 +409,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 994c677..06fd408 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) @@ -41,22 +42,6 @@ func (h *Handler) RegisterRoutes(r *gin.RouterGroup, authMW gin.HandlerFunc, ref imagesGroup.POST("/:uuid", h.controller.uploadMerchImage) imagesGroup.GET("/:uuid", h.controller.getMerchImage) imagesGroup.DELETE("/:uuid", h.controller.deleteMerchImage) - - labelsGroup := merchGroup.Group("/labels", authMW) - labelsGroup.POST("", h.controller.createLabel) - labelsGroup.GET("", h.controller.getLabels) - labelsGroup.PUT("/:uuid", h.controller.updateLabel) - labelsGroup.DELETE("/:uuid", h.controller.deleteLabel) - 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 Добавить новый мерч @@ -68,7 +53,7 @@ func (h *Handler) RegisterRoutes(r *gin.RouterGroup, authMW gin.HandlerFunc, ref // @Success 200 // @Failure 400 {object} responses.ErrorResponse400 // @Failure 500 {object} responses.ErrorResponse500 -// @Router /merch/ [post] +// @Router /merch [post] func (co *controller) addMerch(c *gin.Context) { var payload MerchDTO if err := c.ShouldBind(&payload); err != nil { @@ -98,7 +83,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 +116,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 +142,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 +167,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 +177,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,7 +205,6 @@ 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 @@ -255,7 +234,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 @@ -343,6 +321,7 @@ func (co *controller) uploadMerchImage(c *gin.Context) { return } + //c.Status(http.StatusOK) c.JSON(http.StatusOK, response) } @@ -350,7 +329,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 @@ -397,6 +375,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 @@ -436,357 +415,3 @@ func (co *controller) deleteMerchImage(c *gin.Context) { } c.Status(http.StatusOK) } - -// @Summary Создать новую метку для товара -// @Description Создать новую метку для товара -// @Tags Merch labels -// @Security BearerAuth -// @Accept json -// @Param payload body LabelDTO true "payload" -// @Success 200 -// @Failure 400 {object} responses.ErrorResponse400 -// @Failure 500 {object} responses.ErrorResponse500 -// @Router /merch/labels [post] -func (co *controller) createLabel(c *gin.Context) { - const logMsg = "Merch | Create label" - - 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 LabelDTO - 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.createLabel(payload, userUuid); 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 labels -// @Security BearerAuth -// @Produce json -// @Success 200 {array} LabelsList -// @Failure 400 {object} responses.ErrorResponse400 -// @Failure 500 {object} responses.ErrorResponse500 -// @Router /merch/labels [get] -func (co *controller) getLabels(c *gin.Context) { - const logMsg = "Merch | Get labels" - - 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.getLabels(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 labels -// @Security BearerAuth -// @Accept json -// @Param uuid path string true "label uuid" -// @Param payload body LabelDTO true "payload" -// @Success 200 -// @Failure 400 {object} responses.ErrorResponse400 -// @Failure 500 {object} responses.ErrorResponse500 -// @Router /merch/labels/{uuid} [put] -func (co *controller) updateLabel(c *gin.Context) { - const logMsg = "Merch | Update label" - - userUuid, err := co.utils.GetUserUuidFromContext(c) - if err != nil { - c.JSON(http.StatusInternalServerError, responses.ErrorResponse500{Error: err.Error()}) - log.WithError(err).Error(logMsg) - return - } - - labelUuid := c.Param("uuid") - if labelUuid == "" { - c.JSON(http.StatusBadRequest, responses.ErrorResponse400{Error: "label uuid is empty"}) - log.WithError(err).Error(logMsg) - return - } - - var payload LabelDTO - 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.updateLabel(userUuid, labelUuid, 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 labels -// @Security BearerAuth -// @Param uuid path string true "label uuid" -// @Success 200 -// @Failure 400 {object} responses.ErrorResponse400 -// @Failure 500 {object} responses.ErrorResponse500 -// @Router /merch/labels/{uuid} [delete] -func (co *controller) deleteLabel(c *gin.Context) { - const logMsg = "Merch | Delete label" - - userUuid, err := co.utils.GetUserUuidFromContext(c) - if err != nil { - c.JSON(http.StatusInternalServerError, responses.ErrorResponse500{Error: err.Error()}) - log.WithError(err).Error(logMsg) - return - } - - labelUuid := c.Param("uuid") - if labelUuid == "" { - c.JSON(http.StatusBadRequest, responses.ErrorResponse400{Error: "label uuid is empty"}) - log.WithError(err).Error(logMsg) - return - } - - if err = co.service.deleteLabel(userUuid, labelUuid); 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 labels -// @Security BearerAuth -// @Accept json -// @Param payload body LabelLink true "payload" -// @Success 200 -// @Failure 400 {object} responses.ErrorResponse400 -// @Failure 500 {object} responses.ErrorResponse500 -// @Router /merch/labels/attach [post] -func (co *controller) attachLabel(c *gin.Context) { - const logMsg = "Merch | Attach label" - - 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 LabelLink - 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.attachLabel(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 labels -// @Security BearerAuth -// @Accept json -// @Param payload body LabelLink true "payload" -// @Success 200 -// @Failure 400 {object} responses.ErrorResponse400 -// @Failure 500 {object} responses.ErrorResponse500 -// @Router /merch/labels/detach [post] -func (co *controller) detachLabel(c *gin.Context) { - const logMsg = "Merch | Detach label" - - 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 LabelLink - 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.detachLabel(userUuid, payload); err != nil { - c.JSON(http.StatusInternalServerError, responses.ErrorResponse500{Error: err.Error()}) - log.WithError(err).Error(logMsg) - return - } - c.Status(http.StatusOK) -} - -// @Summary Получить метки товара по его uuid -// @Description Получить метки товара по его uuid -// @Tags Merch labels -// @Security BearerAuth -// @Produce json -// @Param uuid path string true "label uuid" -// @Success 200 -// @Failure 400 {object} responses.ErrorResponse400 -// @Failure 500 {object} responses.ErrorResponse500 -// @Router /merch/labels/{uuid} [get] -func (co *controller) getMerchLabels(c *gin.Context) { - const logMsg = "Merch | Get merch labels" - - userUuid, err := co.utils.GetUserUuidFromContext(c) - if err != nil { - c.JSON(http.StatusInternalServerError, responses.ErrorResponse500{Error: err.Error()}) - log.WithError(err).Error(logMsg) - return - } - - merchUuid := c.Param("uuid") - if merchUuid == "" { - c.JSON(http.StatusBadRequest, responses.ErrorResponse400{Error: "label uuid is empty"}) - log.WithError(err).Error(logMsg) - return - } - - response, err := co.service.getMerchLabels(userUuid, merchUuid) - 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 -// @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 c64787e..bc1646e 100644 --- a/internal/api/merch/dto.go +++ b/internal/api/merch/dto.go @@ -1,52 +1,34 @@ package merch -import ( - "merch-parser-api/internal/api/merch/origins" - "time" -) - type merchBundle struct { Merch *Merch - Surugaya *origins.OriginSurugaya - Mandarake *origins.OriginMandarake - Amiami *origins.OriginAmiami + Surugaya *Surugaya + Mandarake *Mandarake } type MerchDTO struct { MerchUuid string `json:"merch_uuid"` Name string `json:"name"` OriginSurugaya SurugayaDTO `json:"origin_surugaya"` OriginMandarake MandarakeDTO `json:"origin_mandarake"` - OriginAmiami AmiamiDTO `json:"origin_amiami"` - Labels []string `json:"labels,omitempty" gorm:"-"` -} - -type OriginDTO struct { - Link string `json:"link"` - Name origins.Origin `json:"name,omitempty"` } type SurugayaDTO struct { - OriginDTO + Link string `json:"link"` } type MandarakeDTO struct { - OriginDTO -} - -type AmiamiDTO struct { - OriginDTO + Link string `json:"link"` } type SingleMerchResponse struct { - MerchUuid string `json:"merch_uuid"` - Name string `json:"name"` - Origins []OriginDTO `json:"origins"` + MerchUuid string `json:"merch_uuid"` + Name string `json:"name"` + Origins []any `json:"origins"` } type ListResponse struct { - MerchUuid string `json:"merch_uuid"` - Name string `json:"name"` - Labels []string `json:"labels,omitempty" gorm:"-"` + MerchUuid string `json:"merch_uuid"` + Name string `json:"name"` } type PriceEntry struct { @@ -55,7 +37,7 @@ type PriceEntry struct { } type OriginWithPrices struct { - Origin origins.Origin `json:"origin"` + Origin Origin `json:"origin"` Prices []PriceEntry } @@ -76,34 +58,3 @@ type ImageLink struct { Link string `json:"link"` ETag string `json:"etag"` } - -type LabelDTO struct { - Name string `json:"name"` - Color string `json:"color,omitempty"` - BgColor string `json:"bg_color,omitempty"` -} - -type LabelsList struct { - LabelUuid string `json:"label_uuid"` - Name string `json:"name"` - Color string `json:"color,omitempty"` - BgColor string `json:"bg_color,omitempty"` -} - -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 origins.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 702edf0..9322547 100644 --- a/internal/api/merch/model.go +++ b/internal/api/merch/model.go @@ -2,7 +2,6 @@ package merch import ( "database/sql" - "merch-parser-api/internal/api/merch/origins" "time" ) @@ -20,38 +19,34 @@ func (Merch) TableName() string { return "merch" } +type Surugaya struct { + Id uint `gorm:"primary_key" json:"-"` + DeletedAt sql.NullTime `json:"-"` + MerchUuid string `json:"-"` + Link string `json:"link"` +} + +func (Surugaya) TableName() string { + return "origin_surugaya" +} + +type Mandarake struct { + Id uint `gorm:"primary_key" json:"-"` + DeletedAt sql.NullTime `json:"-"` + MerchUuid string `json:"-"` + Link string `json:"link"` +} + +func (Mandarake) TableName() string { + return "origin_mandarake" +} + 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"` - MerchUuid string `json:"merch_uuid" gorm:"column:merch_uuid"` - Price int `json:"price" gorm:"column:price"` - Origin origins.Origin `json:"origin" gorm:"column:origin;type:integer"` -} - -type Label struct { - Id uint `json:"-" gorm:"primary_key"` + Id uint `json:"id" gorm:"primary_key"` CreatedAt time.Time `json:"created_at" gorm:"column:created_at"` - UpdatedAt time.Time `json:"updated_at" gorm:"column:updated_at"` + UpdatedAt sql.NullTime `json:"updated_at" gorm:"column:updated_at"` DeletedAt sql.NullTime `json:"deleted_at" gorm:"column:deleted_at"` - LabelUuid string `json:"label_uuid" gorm:"column:label_uuid"` - UserUuid string `json:"user_uuid" gorm:"column:user_uuid"` - Name string `json:"name" gorm:"column:name"` - Color string `json:"color" gorm:"column:color"` - BgColor string `json:"bg_color" gorm:"column:bg_color"` -} - -func (Label) TableName() string { - return "labels" -} - -type CardLabel struct { - LabelUuid string `json:"label_uuid"` - UserUuid string `json:"user_uuid"` - MerchUuid string `json:"merch_uuid"` -} - -func (CardLabel) TableName() string { - return "card_labels" + 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/origins/types.go b/internal/api/merch/origins.go similarity index 83% rename from internal/api/merch/origins/types.go rename to internal/api/merch/origins.go index 303176c..22175e5 100644 --- a/internal/api/merch/origins/types.go +++ b/internal/api/merch/origins.go @@ -1,4 +1,4 @@ -package origins +package merch import ( "database/sql/driver" @@ -9,15 +9,13 @@ import ( type Origin int const ( - Surugaya = (iota + 1) * 1000 - Mandarake - Amiami + surugaya = (iota + 1) * 1000 + mandarake ) var Origins = [...]string{ "surugaya", "mandarake", - "amiami", } func (o Origin) String() string { @@ -32,7 +30,7 @@ func (o Origin) MarshalJSON() ([]byte, error) { return json.Marshal(o.String()) } -func ParseOrigin(s string) (Origin, bool) { +func parseOrigin(s string) (Origin, bool) { for i, name := range Origins { if name == strings.ToLower(s) { return Origin((i + 1) * 1000), true diff --git a/internal/api/merch/origins/constructor.go b/internal/api/merch/origins/constructor.go deleted file mode 100644 index 2a51534..0000000 --- a/internal/api/merch/origins/constructor.go +++ /dev/null @@ -1,55 +0,0 @@ -package origins - -import "database/sql" - -func AllOriginModels() []interface{} { - return []interface{}{ - &OriginSurugaya{}, - &OriginMandarake{}, - &OriginAmiami{}, - } -} - -func NewSurugaya(merchUuid, link string) *OriginSurugaya { - return &OriginSurugaya{ - BaseOrigin{ - DeletedAt: sql.NullTime{}, - MerchUuid: merchUuid, - Link: link, - }, - } -} - -func NewMandarake(merchUuid, link string) *OriginMandarake { - return &OriginMandarake{ - BaseOrigin{ - DeletedAt: sql.NullTime{}, - MerchUuid: merchUuid, - Link: link, - }, - } -} - -func NewAmiami(merchUuid, link string) *OriginAmiami { - return &OriginAmiami{ - BaseOrigin{ - DeletedAt: sql.NullTime{}, - MerchUuid: merchUuid, - Link: link, - }, - } -} - -type OriginFactory func(merchUuid, link string) interface{} - -var OriginFactories = map[string]OriginFactory{ - "surugaya": func(merchUuid, link string) interface{} { - return &OriginSurugaya{BaseOrigin: BaseOrigin{MerchUuid: merchUuid, Link: link}} - }, - "mandarake": func(merchUuid, link string) interface{} { - return &OriginMandarake{BaseOrigin: BaseOrigin{MerchUuid: merchUuid, Link: link}} - }, - "amiami": func(merchUuid, link string) interface{} { - return &OriginAmiami{BaseOrigin: BaseOrigin{MerchUuid: merchUuid, Link: link}} - }, -} diff --git a/internal/api/merch/origins/model.go b/internal/api/merch/origins/model.go deleted file mode 100644 index d2ee8cf..0000000 --- a/internal/api/merch/origins/model.go +++ /dev/null @@ -1,34 +0,0 @@ -package origins - -import "database/sql" - -type BaseOrigin struct { - Id uint `gorm:"primary_key" json:"-"` - DeletedAt sql.NullTime `json:"-"` - MerchUuid string `json:"-"` - Link string `json:"link"` -} - -type OriginSurugaya struct { - BaseOrigin -} - -func (OriginSurugaya) TableName() string { - return "origin_surugaya" -} - -type OriginMandarake struct { - BaseOrigin -} - -func (OriginMandarake) TableName() string { - return "origin_mandarake" -} - -type OriginAmiami struct { - BaseOrigin -} - -func (OriginAmiami) TableName() string { - return "origin_amiami" -} diff --git a/internal/api/merch/provider.go b/internal/api/merch/provider.go index c70da91..27ab846 100644 --- a/internal/api/merch/provider.go +++ b/internal/api/merch/provider.go @@ -4,14 +4,13 @@ import ( "database/sql" log "github.com/sirupsen/logrus" "gorm.io/gorm" - "merch-parser-api/internal/api/merch/origins" "merch-parser-api/internal/shared" "time" ) type Link struct { - Surugaya []origins.OriginSurugaya - Mandarake []origins.OriginMandarake + Surugaya []Surugaya + Mandarake []Mandarake } type TaskProvider struct { @@ -85,7 +84,7 @@ func (p *TaskProvider) InsertPrices(prices []shared.TaskResult) error { var insertPrices []Price for _, item := range prices { - origin, ok := origins.ParseOrigin(item.Origin) + origin, ok := parseOrigin(item.Origin) if !ok { continue } @@ -108,13 +107,13 @@ func (p *TaskProvider) InsertPrices(prices []shared.TaskResult) error { } func (r *TaskRepo) getLinks() (*Link, error) { - var surugayaList []origins.OriginSurugaya - if err := r.db.Model(&origins.OriginSurugaya{}).Where("deleted_at IS NULL").Find(&surugayaList).Error; err != nil { + var surugayaList []Surugaya + if err := r.db.Model(&Surugaya{}).Where("deleted_at IS NULL").Find(&surugayaList).Error; err != nil { return nil, err } - var mandarakeList []origins.OriginMandarake - if err := r.db.Model(&origins.OriginMandarake{}).Where("deleted_at IS NULL").Find(&mandarakeList).Error; err != nil { + var mandarakeList []Mandarake + if err := r.db.Model(&Mandarake{}).Where("deleted_at IS NULL").Find(&mandarakeList).Error; err != nil { return nil, err } diff --git a/internal/api/merch/repository.go b/internal/api/merch/repository.go index 7283fa9..98d2695 100644 --- a/internal/api/merch/repository.go +++ b/internal/api/merch/repository.go @@ -3,10 +3,8 @@ package merch import ( "database/sql" "errors" - "fmt" "gorm.io/gorm" "gorm.io/gorm/clause" - "merch-parser-api/internal/api/merch/origins" "time" ) @@ -24,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) @@ -35,27 +32,11 @@ type repository interface { getAllUserMerch(userUuid string) ([]Merch, error) prices - labels } 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 { - createLabel(label Label) error - getLabels(userUuid string) ([]Label, error) - updateLabel(userUuid, labelUuid string, label map[string]any) error - deleteLabel(userUuid, labelUuid string) error - attachLabel(label CardLabel) error - detachLabel(label CardLabel) error - getAttachedLabelsByList(list []string) ([]CardLabel, error) - getAttachedLabelsByUuid(userUuid, merchUuid string) ([]CardLabel, error) } func (r *Repo) addMerch(bundle merchBundle) error { @@ -63,15 +44,11 @@ func (r *Repo) addMerch(bundle merchBundle) error { return err } - if err := r.db.Model(&origins.OriginSurugaya{}).Create(bundle.Surugaya).Error; err != nil { + if err := r.db.Model(&Surugaya{}).Create(bundle.Surugaya).Error; err != nil { return err } - if err := r.db.Model(&origins.OriginMandarake{}).Create(bundle.Mandarake).Error; err != nil { - return err - } - - if err := r.db.Model(&origins.OriginAmiami{}).Create(bundle.Amiami).Error; err != nil { + if err := r.db.Model(&Mandarake{}).Create(bundle.Mandarake).Error; err != nil { return err } @@ -92,22 +69,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. @@ -118,7 +79,7 @@ func (r *Repo) getSingleMerch(userUuid, merchUuid string) (merchBundle, error) { return merchBundle{}, err } - var surugaya origins.OriginSurugaya + var surugaya Surugaya if err := r.db. Where("merch_uuid = ?", merchUuid). First(&surugaya).Error; err != nil { @@ -127,7 +88,7 @@ func (r *Repo) getSingleMerch(userUuid, merchUuid string) (merchBundle, error) { } } - var mandarake origins.OriginMandarake + var mandarake Mandarake if err := r.db. Where("merch_uuid = ?", merchUuid). First(&mandarake).Error; err != nil { @@ -136,20 +97,10 @@ func (r *Repo) getSingleMerch(userUuid, merchUuid string) (merchBundle, error) { } } - var amiami origins.OriginAmiami - if err := r.db. - Where("merch_uuid = ?", merchUuid). - First(&amiami).Error; err != nil { - if !errors.Is(err, gorm.ErrRecordNotFound) { - return merchBundle{}, err - } - } - return merchBundle{ Merch: &merch, Surugaya: &surugaya, Mandarake: &mandarake, - Amiami: &amiami, }, nil } @@ -180,13 +131,22 @@ func (r *Repo) updateMerch(payload UpdateMerchDTO, userUuid string) error { return err } - if factory, ok := origins.OriginFactories[payload.Origin]; ok { - model := factory(payload.MerchUuid, payload.Link) - if err := r.upsertOrigin(model); err != nil { + switch payload.Origin { + case "surugaya": + if err := r.upsertOrigin(&Surugaya{ + MerchUuid: payload.MerchUuid, + Link: payload.Link, + }); err != nil { + return err + } + + case "mandarake": + if err := r.upsertOrigin(&Mandarake{ + MerchUuid: payload.MerchUuid, + Link: payload.Link, + }); err != nil { return err } - } else if payload.Origin != "" { - return fmt.Errorf("unsupported origin: %s", payload.Origin) } return nil @@ -203,15 +163,18 @@ func (r *Repo) deleteMerch(userUuid, merchUuid string) error { return err } - ors := origins.AllOriginModels() + if err := r.db. + Model(&Surugaya{}). + Where("merch_uuid = ?", merchUuid). + Update("deleted_at", now).Error; err != nil { + return err + } - for _, origin := range ors { - if err := r.db. - Model(origin). - Where("merch_uuid = ?", merchUuid). - Update("deleted_at", now).Error; err != nil { - return err - } + if err := r.db. + Model(&Mandarake{}). + Where("merch_uuid = ?", merchUuid). + Update("deleted_at", now).Error; err != nil { + return err } return nil @@ -276,119 +239,3 @@ func (r *Repo) upsertOrigin(model any) error { DoUpdates: clause.AssignmentColumns([]string{"link"}), }).Create(model).Error } - -func (r *Repo) createLabel(label Label) error { - return r.db.Model(&Label{}).Create(&label).Error -} - -func (r *Repo) getLabels(userUuid string) ([]Label, error) { - var labelsList []Label - - if err := r.db. - Model(&Label{}). - Where("user_uuid = ?", userUuid). - Where("deleted_at IS NULL"). - Find(&labelsList).Error; err != nil { - return nil, err - } - - return labelsList, nil -} - -func (r *Repo) updateLabel(userUuid, labelUuid string, label map[string]any) error { - return r.db.Model(&Label{}). - Where("user_uuid =? AND label_uuid = ?", userUuid, labelUuid). - Updates(label).Error -} - -func (r *Repo) deleteLabel(userUuid, labelUuid string) error { - return r.db.Model(&Label{}). - Where("user_uuid =? AND label_uuid = ?", userUuid, labelUuid). - Update("deleted_at", time.Now().UTC()).Error -} - -func (r *Repo) attachLabel(label CardLabel) error { - return r.db.Model(&CardLabel{}).Create(&label).Error -} - -func (r *Repo) detachLabel(label CardLabel) error { - return r.db. - Where("user_uuid = ? AND label_uuid = ? AND merch_uuid = ?", label.UserUuid, label.LabelUuid, label.MerchUuid). - Delete(&CardLabel{}).Error -} - -func (r *Repo) getAttachedLabelsByList(list []string) ([]CardLabel, error) { - var labelsList []CardLabel - - if err := r.db.Model(&CardLabel{}).Where("merch_uuid IN ?", list).Find(&labelsList).Error; err != nil { - return nil, err - } - - return labelsList, nil -} - -func (r *Repo) getAttachedLabelsByUuid(userUuid, merchUuid string) ([]CardLabel, error) { - var labelsList []CardLabel - - if err := r.db.Model(&CardLabel{}).Where("user_uuid = ? AND merch_uuid = ?", userUuid, merchUuid).Find(&labelsList).Error; err != nil { - return nil, err - } - - 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.origins, m.name, - LAG(price) OVER (PARTITION BY p.merch_uuid, p.origins ORDER BY p.created_at, p.id) AS prev_price, - LEAD(price) OVER (PARTITION BY p.merch_uuid, p.origins 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, origins, 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 e5ef790..e749d88 100644 --- a/internal/api/merch/service.go +++ b/internal/api/merch/service.go @@ -12,7 +12,6 @@ import ( "image" "image/jpeg" "io" - "merch-parser-api/internal/api/merch/origins" "merch-parser-api/internal/interfaces" is "merch-parser-api/proto/imageStorage" "mime/multipart" @@ -59,7 +58,7 @@ func (s *service) addMerch(payload MerchDTO, userUuid string) error { merchUuid := uuid.NewString() bundle := merchBundle{ - Merch: &Merch{ + &Merch{ CreatedAt: time.Time{}, UpdatedAt: sql.NullTime{Valid: false}, DeletedAt: sql.NullTime{Valid: false}, @@ -68,72 +67,41 @@ func (s *service) addMerch(payload MerchDTO, userUuid string) error { Name: payload.Name, }, - Surugaya: origins.NewSurugaya(merchUuid, payload.OriginSurugaya.Link), - Mandarake: origins.NewMandarake(merchUuid, payload.OriginMandarake.Link), - Amiami: origins.NewAmiami(merchUuid, payload.OriginAmiami.Link), + &Surugaya{ + DeletedAt: sql.NullTime{}, + MerchUuid: merchUuid, + Link: payload.OriginSurugaya.Link, + }, + + &Mandarake{ + DeletedAt: sql.NullTime{}, + MerchUuid: merchUuid, + Link: payload.OriginMandarake.Link, + }, } return s.repo.addMerch(bundle) } -func (s *service) getSingleMerch(userUuid, merchUuid string) (SingleMerchResponse, error) { +func (s *service) getSingleMerch(userUuid, merchUuid string) (MerchDTO, error) { bundle, err := s.repo.getSingleMerch(userUuid, merchUuid) if err != nil { - return SingleMerchResponse{}, err + return MerchDTO{}, err } - var originsSlice []OriginDTO - - originsSlice = append(originsSlice, OriginDTO{ - Link: bundle.Surugaya.Link, - Name: origins.Surugaya, - }) - - originsSlice = append(originsSlice, OriginDTO{ - Link: bundle.Mandarake.Link, - Name: origins.Mandarake, - }) - - originsSlice = append(originsSlice, OriginDTO{ - Link: bundle.Amiami.Link, - Name: origins.Amiami, - }) - - return SingleMerchResponse{ + return MerchDTO{ MerchUuid: bundle.Merch.MerchUuid, Name: bundle.Merch.Name, - Origins: originsSlice, + OriginSurugaya: SurugayaDTO{ + Link: bundle.Surugaya.Link, + }, + OriginMandarake: MandarakeDTO{ + Link: bundle.Mandarake.Link, + }, }, nil } func (s *service) getAllMerch(userUuid string) ([]ListResponse, error) { - const logMsg = "Merch service | Get all merch" - - allMerch, err := s.repo.getAllMerch(userUuid) - if err != nil { - return nil, err - } - - ids := make([]string, 0, len(allMerch)) - for _, m := range allMerch { - ids = append(ids, m.MerchUuid) - } - - cardLabels, err := s.repo.getAttachedLabelsByList(ids) - if err != nil { - return nil, err - } - log.WithField("content", cardLabels).Debug(logMsg) - - clMap := make(map[string][]string) - for _, cl := range cardLabels { - clMap[cl.MerchUuid] = append(clMap[cl.MerchUuid], cl.LabelUuid) - } - - for item := range allMerch { - allMerch[item].Labels = clMap[allMerch[item].MerchUuid] - } - - return allMerch, nil + return s.repo.getAllMerch(userUuid) } func (s *service) updateMerch(payload UpdateMerchDTO, userUuid string) error { @@ -142,7 +110,7 @@ func (s *service) updateMerch(payload UpdateMerchDTO, userUuid string) error { } if payload.Origin == "" { - return errors.New("no origins provided") + return errors.New("no origin provided") } return s.repo.updateMerch(payload, userUuid) @@ -183,10 +151,10 @@ func (s *service) getPrices(userUuid string, days string) ([]PricesResponse, err return nil, err } - pricesMap := make(map[string]map[origins.Origin][]PriceEntry) + pricesMap := make(map[string]map[Origin][]PriceEntry) for _, item := range pricesList { if _, ok := pricesMap[item.MerchUuid]; !ok { - pricesMap[item.MerchUuid] = make(map[origins.Origin][]PriceEntry) + pricesMap[item.MerchUuid] = make(map[Origin][]PriceEntry) } pricesMap[item.MerchUuid][item.Origin] = append(pricesMap[item.MerchUuid][item.Origin], PriceEntry{ @@ -197,22 +165,16 @@ func (s *service) getPrices(userUuid string, days string) ([]PricesResponse, err for i := range response { originSurugaya := OriginWithPrices{ - Origin: origins.Surugaya, - Prices: pricesMap[response[i].MerchUuid][origins.Surugaya], + Origin: surugaya, + Prices: pricesMap[response[i].MerchUuid][surugaya], } response[i].Origins = append(response[i].Origins, originSurugaya) originMandarake := OriginWithPrices{ - Origin: origins.Mandarake, - Prices: pricesMap[response[i].MerchUuid][origins.Mandarake], + Origin: mandarake, + Prices: pricesMap[response[i].MerchUuid][mandarake], } response[i].Origins = append(response[i].Origins, originMandarake) - - originAmiami := OriginWithPrices{ - Origin: origins.Amiami, - Prices: pricesMap[response[i].MerchUuid][origins.Amiami], - } - response[i].Origins = append(response[i].Origins, originAmiami) } return response, nil @@ -229,37 +191,27 @@ func (s *service) getDistinctPrices(userUuid, merchUuid, days string) (PricesRes } originSurugaya := OriginWithPrices{ - Origin: origins.Surugaya, + Origin: surugaya, Prices: []PriceEntry{}, } originMandarake := OriginWithPrices{ - Origin: origins.Mandarake, - Prices: []PriceEntry{}, - } - - originAmiami := OriginWithPrices{ - Origin: origins.Amiami, + Origin: mandarake, Prices: []PriceEntry{}, } for _, item := range result { switch item.Origin { - case origins.Surugaya: + case surugaya: originSurugaya.Prices = append(originSurugaya.Prices, PriceEntry{ CreatedAt: item.CreatedAt.Unix(), Value: item.Price, }) - case origins.Mandarake: + case mandarake: originMandarake.Prices = append(originMandarake.Prices, PriceEntry{ CreatedAt: item.CreatedAt.Unix(), Value: item.Price, }) - case origins.Amiami: - originAmiami.Prices = append(originAmiami.Prices, PriceEntry{ - CreatedAt: item.CreatedAt.Unix(), - Value: item.Price, - }) } } @@ -432,14 +384,13 @@ func (s *service) deleteMerchImage(ctx context.Context, userUuid, merchUuid stri return fmt.Errorf("no merch found for user %s with uuid %s", userUuid, merchUuid) } - //uncomment for MinIO - //if err = s.media.Delete(ctx, s.bucketName, fmt.Sprintf("%s/merch/%s/thumbnail.jpg", userUuid, merchUuid)); err != nil { - // return err - //} - // - //if err = s.media.Delete(ctx, s.bucketName, fmt.Sprintf("%s/merch/%s/full.jpg", userUuid, merchUuid)); err != nil { - // return err - //} + if err = s.media.Delete(ctx, s.bucketName, fmt.Sprintf("%s/merch/%s/thumbnail.jpg", userUuid, merchUuid)); err != nil { + return err + } + + if err = s.media.Delete(ctx, s.bucketName, fmt.Sprintf("%s/merch/%s/full.jpg", userUuid, merchUuid)); err != nil { + return err + } return nil } @@ -532,158 +483,3 @@ func (s *service) mtDeleteMerchImage(ctx context.Context, userUuid, merchUuid st }) return nil } - -func (s *service) createLabel(label LabelDTO, userUuid string) error { - now := time.Now().UTC() - - if label.Name == "" { - return fmt.Errorf("label name is required") - } - - newLabel := Label{ - CreatedAt: now, - UpdatedAt: now, - DeletedAt: sql.NullTime{Time: time.Time{}, Valid: false}, - LabelUuid: uuid.NewString(), - UserUuid: userUuid, - Name: label.Name, - Color: label.Color, - BgColor: label.BgColor, - } - - return s.repo.createLabel(newLabel) -} -func (s *service) getLabels(userUuid string) ([]LabelsList, error) { - stored, err := s.repo.getLabels(userUuid) - if err != nil { - return nil, err - } - - response := make([]LabelsList, 0, len(stored)) - for _, label := range stored { - response = append(response, LabelsList{ - LabelUuid: label.LabelUuid, - Name: label.Name, - Color: label.Color, - BgColor: label.BgColor, - }) - } - - return response, nil -} -func (s *service) updateLabel(userUuid, labelUuid string, label LabelDTO) error { - updateMap := make(map[string]any, 3) - - if label.Name != "" { - updateMap["name"] = label.Name - } - - if label.Color != "" { - updateMap["color"] = label.Color - } - - if label.BgColor != "" { - updateMap["bg_color"] = label.BgColor - } - - return s.repo.updateLabel(userUuid, labelUuid, updateMap) -} - -func (s *service) deleteLabel(userUuid, labelUuid string) error { - return s.repo.deleteLabel(userUuid, labelUuid) -} - -func (s *service) attachLabel(userUuid string, label LabelLink) error { - if label.LabelUuid == "" || label.MerchUuid == "" { - return fmt.Errorf("both label and merch uuid-s are required") - } - - attach := CardLabel{ - LabelUuid: label.LabelUuid, - UserUuid: userUuid, - MerchUuid: label.MerchUuid, - } - - return s.repo.attachLabel(attach) -} - -func (s *service) detachLabel(userUuid string, label LabelLink) error { - if label.LabelUuid == "" || label.MerchUuid == "" { - return fmt.Errorf("both label and merch uuid-s are required") - } - - detach := CardLabel{ - LabelUuid: label.LabelUuid, - UserUuid: userUuid, - MerchUuid: label.MerchUuid, - } - return s.repo.detachLabel(detach) -} - -func (s *service) getMerchLabels(userUuid, merchUuid string) ([]string, error) { - getLabels, err := s.repo.getAttachedLabelsByUuid(userUuid, merchUuid) - if err != nil { - return nil, err - } - - response := make([]string, 0, len(getLabels)) - for _, label := range getLabels { - response = append(response, label.LabelUuid) - } - - 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/migrations.sql b/migrations.sql index 69e7a93..c4df99c 100644 --- a/migrations.sql +++ b/migrations.sql @@ -46,13 +46,6 @@ CREATE TABLE origin_mandarake( link TEXT ); -CREATE TABLE origin_amiami( - id BIGSERIAL PRIMARY KEY, - deleted_at TIMESTAMP WITH TIME ZONE NULL, - merch_uuid VARCHAR(36) NOT NULL UNIQUE, - link TEXT -); - CREATE TABLE prices( id BIGSERIAL PRIMARY KEY, @@ -62,27 +55,4 @@ CREATE TABLE prices( merch_uuid VARCHAR(36) NOT NULL, price INT NULL, origin INT -); - -CREATE TABLE labels( - id BIGSERIAL PRIMARY KEY, - created_at TIMESTAMP WITH TIME ZONE NOT NULL, - updated_at TIMESTAMP WITH TIME ZONE NULL, - deleted_at TIMESTAMP WITH TIME ZONE NULL, - user_uuid VARCHAR(36) NOT NULL, - label_uuid VARCHAR(36) NOT NULL, - name VARCHAR(255), - color VARCHAR(32), - bg_color VARCHAR(32) -); - -CREATE TABLE card_labels ( - id BIGSERIAL PRIMARY KEY, - user_uuid VARCHAR(36) NOT NULL, - label_uuid VARCHAR(36) NOT NULL, - merch_uuid VARCHAR(36) NOT NULL -); - -ALTER TABLE card_labels - ADD CONSTRAINT card_labels_unique_user_label_merch - UNIQUE (user_uuid, label_uuid, merch_uuid); \ No newline at end of file +); \ No newline at end of file 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 -}