From 57edd831ba3731a3cf511c8363381cf941496129 Mon Sep 17 00:00:00 2001 From: Pawin Nakvisai Date: Sun, 13 Oct 2024 14:46:41 +0700 Subject: [PATCH 1/2] [ADD] Delete ingredient stock endpoint --- docs/docs.go | 110 ++++++++++++++++++ docs/swagger.json | 110 ++++++++++++++++++ docs/swagger.yaml | 72 ++++++++++++ internal/adapter/handler/http/ingredient.go | 23 ++++ internal/adapter/handler/http/router.go | 1 + .../storage/postgres/repository/ingredient.go | 11 ++ internal/core/port/ingredient.go | 2 + internal/core/service/ingredient.go | 9 ++ internal/core/util/ingredient.go | 2 +- 9 files changed, 339 insertions(+), 1 deletion(-) diff --git a/docs/docs.go b/docs/docs.go index 801748f..380119e 100644 --- a/docs/docs.go +++ b/docs/docs.go @@ -131,6 +131,46 @@ const docTemplate = `{ } } }, + "/ingredient/addIngredientStock": { + "post": { + "description": "Add ingredient stock by using ingredient stock request", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "ingredient" + ], + "summary": "Add ingredient stock", + "parameters": [ + { + "description": "Ingredient Stock Request", + "name": "AddIngredientStockRequest", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/domain.AddIngredientStockRequest" + } + } + ], + "responses": { + "200": { + "description": "Success", + "schema": { + "$ref": "#/definitions/http.response" + } + }, + "400": { + "description": "Cannot add ingredient stock\"'", + "schema": { + "$ref": "#/definitions/http.response" + } + } + } + } + }, "/ingredient/addIngredients": { "post": { "description": "Add ingredient by using ingredient request", @@ -247,6 +287,44 @@ const docTemplate = `{ } } }, + "/ingredient/deleteIngredientStock": { + "delete": { + "description": "Delete an ingredient stock by using ingredient stock id", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "ingredient" + ], + "summary": "Delete an ingredient stock", + "parameters": [ + { + "type": "string", + "description": "Ingredient Stock ID", + "name": "ingredient_stock_id", + "in": "query", + "required": true + } + ], + "responses": { + "200": { + "description": "Success", + "schema": { + "$ref": "#/definitions/http.response" + } + }, + "400": { + "description": "Cannot delete an ingredient stock", + "schema": { + "$ref": "#/definitions/http.response" + } + } + } + } + }, "/ingredient/getAllIngredients": { "get": { "description": "Get all ingredients by user ID", @@ -1124,6 +1202,38 @@ const docTemplate = `{ } } }, + "domain.AddIngredientStockRequest": { + "type": "object", + "properties": { + "expiration_date": { + "type": "string" + }, + "img": { + "type": "string" + }, + "ingredient_brand": { + "type": "string" + }, + "ingredient_id": { + "type": "string" + }, + "note": { + "type": "string" + }, + "price": { + "type": "string" + }, + "quantity": { + "type": "string" + }, + "supplier": { + "type": "string" + }, + "user_id": { + "type": "string" + } + } + }, "domain.ChangeExpirationDateSetting": { "type": "object", "properties": { diff --git a/docs/swagger.json b/docs/swagger.json index cd6f4f9..eca0a71 100644 --- a/docs/swagger.json +++ b/docs/swagger.json @@ -125,6 +125,46 @@ } } }, + "/ingredient/addIngredientStock": { + "post": { + "description": "Add ingredient stock by using ingredient stock request", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "ingredient" + ], + "summary": "Add ingredient stock", + "parameters": [ + { + "description": "Ingredient Stock Request", + "name": "AddIngredientStockRequest", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/domain.AddIngredientStockRequest" + } + } + ], + "responses": { + "200": { + "description": "Success", + "schema": { + "$ref": "#/definitions/http.response" + } + }, + "400": { + "description": "Cannot add ingredient stock\"'", + "schema": { + "$ref": "#/definitions/http.response" + } + } + } + } + }, "/ingredient/addIngredients": { "post": { "description": "Add ingredient by using ingredient request", @@ -241,6 +281,44 @@ } } }, + "/ingredient/deleteIngredientStock": { + "delete": { + "description": "Delete an ingredient stock by using ingredient stock id", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "ingredient" + ], + "summary": "Delete an ingredient stock", + "parameters": [ + { + "type": "string", + "description": "Ingredient Stock ID", + "name": "ingredient_stock_id", + "in": "query", + "required": true + } + ], + "responses": { + "200": { + "description": "Success", + "schema": { + "$ref": "#/definitions/http.response" + } + }, + "400": { + "description": "Cannot delete an ingredient stock", + "schema": { + "$ref": "#/definitions/http.response" + } + } + } + } + }, "/ingredient/getAllIngredients": { "get": { "description": "Get all ingredients by user ID", @@ -1118,6 +1196,38 @@ } } }, + "domain.AddIngredientStockRequest": { + "type": "object", + "properties": { + "expiration_date": { + "type": "string" + }, + "img": { + "type": "string" + }, + "ingredient_brand": { + "type": "string" + }, + "ingredient_id": { + "type": "string" + }, + "note": { + "type": "string" + }, + "price": { + "type": "string" + }, + "quantity": { + "type": "string" + }, + "supplier": { + "type": "string" + }, + "user_id": { + "type": "string" + } + } + }, "domain.ChangeExpirationDateSetting": { "type": "object", "properties": { diff --git a/docs/swagger.yaml b/docs/swagger.yaml index b1051f8..eb0f1e0 100644 --- a/docs/swagger.yaml +++ b/docs/swagger.yaml @@ -19,6 +19,27 @@ definitions: user_id: type: string type: object + domain.AddIngredientStockRequest: + properties: + expiration_date: + type: string + img: + type: string + ingredient_brand: + type: string + ingredient_id: + type: string + note: + type: string + price: + type: string + quantity: + type: string + supplier: + type: string + user_id: + type: string + type: object domain.ChangeExpirationDateSetting: properties: black_expiration_date: @@ -511,6 +532,32 @@ paths: summary: Get unread notification amount of user tags: - home + /ingredient/addIngredientStock: + post: + consumes: + - application/json + description: Add ingredient stock by using ingredient stock request + parameters: + - description: Ingredient Stock Request + in: body + name: AddIngredientStockRequest + required: true + schema: + $ref: '#/definitions/domain.AddIngredientStockRequest' + produces: + - application/json + responses: + "200": + description: Success + schema: + $ref: '#/definitions/http.response' + "400": + description: Cannot add ingredient stock"' + schema: + $ref: '#/definitions/http.response' + summary: Add ingredient stock + tags: + - ingredient /ingredient/addIngredients: post: consumes: @@ -587,6 +634,31 @@ paths: summary: Delete ingredient batch note tags: - ingredient + /ingredient/deleteIngredientStock: + delete: + consumes: + - application/json + description: Delete an ingredient stock by using ingredient stock id + parameters: + - description: Ingredient Stock ID + in: query + name: ingredient_stock_id + required: true + type: string + produces: + - application/json + responses: + "200": + description: Success + schema: + $ref: '#/definitions/http.response' + "400": + description: Cannot delete an ingredient stock + schema: + $ref: '#/definitions/http.response' + summary: Delete an ingredient stock + tags: + - ingredient /ingredient/getAllIngredients: get: consumes: diff --git a/internal/adapter/handler/http/ingredient.go b/internal/adapter/handler/http/ingredient.go index 0967782..e951eb9 100644 --- a/internal/adapter/handler/http/ingredient.go +++ b/internal/adapter/handler/http/ingredient.go @@ -131,6 +131,29 @@ func (ih *IngredientHandler) DeleteIngredient(c *fiber.Ctx) error { return nil } +// DeleteIngredientStock godoc +// @Summary Delete an ingredient stock +// @Description Delete an ingredient stock by using ingredient stock id +// @Tags ingredient +// @Accept json +// @Produce json +// @Param ingredient_stock_id query string true "Ingredient Stock ID" +// @Success 200 {object} response "Success" +// @Failure 400 {object} response "Cannot delete an ingredient stock" +// @Router /ingredient/deleteIngredientStock [delete] +func (ih *IngredientHandler) DeleteIngredientStock(c *fiber.Ctx) error { + ingredientStockID := c.Query("ingredient_stock_id") + + err := ih.svc.DeleteIngredientStock(c, ingredientStockID) + if err != nil { + handleError(c, 400, "Cannot delete an ingredient stock", err.Error()) + return nil + } + + handleSuccess(c, nil) + return nil +} + // AddIngredient godoc // @Summary Add ingredient // @Description Add ingredient by using ingredient request diff --git a/internal/adapter/handler/http/router.go b/internal/adapter/handler/http/router.go index 288d22a..d834475 100644 --- a/internal/adapter/handler/http/router.go +++ b/internal/adapter/handler/http/router.go @@ -41,6 +41,7 @@ func NewRouter(a *fiber.App, ingredientHandler IngredientHandler, recipeHandler ingredient.Get("/getIngredientStockDetail", ingredientHandler.GetIngredientStockDetail) ingredient.Delete("/deleteIngredientBatchNote", ingredientHandler.DeleteIngredientBatchNote) ingredient.Delete("/deleteIngredient", ingredientHandler.DeleteIngredient) + ingredient.Delete("/deleteIngredientStock", ingredientHandler.DeleteIngredientStock) ingredient.Post("/addIngredient", ingredientHandler.AddIngredient) ingredient.Post("/addIngredientStock", ingredientHandler.AddIngredientStock) } diff --git a/internal/adapter/storage/postgres/repository/ingredient.go b/internal/adapter/storage/postgres/repository/ingredient.go index ad87114..b487a84 100644 --- a/internal/adapter/storage/postgres/repository/ingredient.go +++ b/internal/adapter/storage/postgres/repository/ingredient.go @@ -84,6 +84,17 @@ func (ir *IngredientRepository) DeleteIngredient(c *fiber.Ctx, ingredientID stri return nil } +func (ir *IngredientRepository) DeleteIngredientStock(c *fiber.Ctx, ingredientStockID string) error { + _, err := ir.db.IngredientDetail.FindMany( + db.IngredientDetail.IngredientStockID.Equals(ingredientStockID), + ).Delete().Exec(c.Context()) + if err != nil { + return err + } + + return nil +} + func (ir *IngredientRepository) AddIngredient(c *fiber.Ctx, ingredient *domain.AddIngredientPayload) error { _, err := ir.db.Ingredients.CreateOne( db.Ingredients.IngredientID.Set(ingredient.IngredientID), diff --git a/internal/core/port/ingredient.go b/internal/core/port/ingredient.go index df9f9a8..446a3ac 100644 --- a/internal/core/port/ingredient.go +++ b/internal/core/port/ingredient.go @@ -12,6 +12,7 @@ type IngredientRepository interface { GetIngredientStockDetail(c *fiber.Ctx, ingredientStockID string) (*db.IngredientDetailModel, error) DeleteIngredientBatchNote(c *fiber.Ctx, ingredientNoteID string) error DeleteIngredient(c *fiber.Ctx, ingredientID string) error + DeleteIngredientStock(c *fiber.Ctx, ingredientStockID string) error AddIngredient(c *fiber.Ctx, ingredients *domain.AddIngredientPayload) error AddIngredientImage(c *fiber.Ctx, ingredientImage *domain.AddIngredientImagePayload) error AddIngredientStock(c *fiber.Ctx, ingredientStock *domain.AddIngredientStockPayload) error @@ -24,6 +25,7 @@ type IngredientService interface { GetIngredientStockDetail(c *fiber.Ctx, ingredientStockID string) (*domain.IngredientStockDetail, error) DeleteIngredientBatchNote(c *fiber.Ctx, ingredientNoteID string) error DeleteIngredient(c *fiber.Ctx, ingredientID string) error + DeleteIngredientStock(c *fiber.Ctx, ingredientStockID string) error AddIngredient(c *fiber.Ctx, ingredients *domain.AddIngredientRequest) error AddIngredientStock(c *fiber.Ctx, ingredientStock *domain.AddIngredientStockRequest) error } diff --git a/internal/core/service/ingredient.go b/internal/core/service/ingredient.go index 5fcd59e..513daca 100644 --- a/internal/core/service/ingredient.go +++ b/internal/core/service/ingredient.go @@ -201,6 +201,15 @@ func (s *IngredientService) DeleteIngredient(c *fiber.Ctx, ingredientID string) return nil } +func (s *IngredientService) DeleteIngredientStock(c *fiber.Ctx, ingredientStockID string) error { + err := s.ingredientRepo.DeleteIngredientStock(c, ingredientStockID) + if err != nil { + return err + } + + return nil +} + func (s *IngredientService) AddIngredient(c *fiber.Ctx, ingredients *domain.AddIngredientRequest) error { userID := ingredients.UserID ingredientID := uuid.NewString() diff --git a/internal/core/util/ingredient.go b/internal/core/util/ingredient.go index 4c0d169..b064e51 100644 --- a/internal/core/util/ingredient.go +++ b/internal/core/util/ingredient.go @@ -131,7 +131,7 @@ func UploadIngredientStockImage(userId string, ingredientId string, ingredientSt // Generate a unique filename based on the current timestamp filename := fmt.Sprintf("%d.jpg", time.Now().UnixNano()) // Create the path based on userId, and ingredientId - filePath := filepath.Join(fmt.Sprintf("images/%s/ingredients/%s/%s", userId, ingredientId, ingredientStockId), filename) + filePath := filepath.Join(fmt.Sprintf("images/%s/ingredient/%s/%s", userId, ingredientId, ingredientStockId), filename) // Create the directory if it doesn't exist if err := os.MkdirAll(filepath.Dir(filePath), os.ModePerm); err != nil { From 8396f1c600b18cb8793123e98410348377f8da01 Mon Sep 17 00:00:00 2001 From: Pawin Nakvisai Date: Sun, 13 Oct 2024 14:49:32 +0700 Subject: [PATCH 2/2] [UPDATE] ingredient.go in util --- internal/core/util/ingredient.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/core/util/ingredient.go b/internal/core/util/ingredient.go index b064e51..4c0d169 100644 --- a/internal/core/util/ingredient.go +++ b/internal/core/util/ingredient.go @@ -131,7 +131,7 @@ func UploadIngredientStockImage(userId string, ingredientId string, ingredientSt // Generate a unique filename based on the current timestamp filename := fmt.Sprintf("%d.jpg", time.Now().UnixNano()) // Create the path based on userId, and ingredientId - filePath := filepath.Join(fmt.Sprintf("images/%s/ingredient/%s/%s", userId, ingredientId, ingredientStockId), filename) + filePath := filepath.Join(fmt.Sprintf("images/%s/ingredients/%s/%s", userId, ingredientId, ingredientStockId), filename) // Create the directory if it doesn't exist if err := os.MkdirAll(filepath.Dir(filePath), os.ModePerm); err != nil {