From f99db54c0352df3a7afacd0eb0693026bd7f9b97 Mon Sep 17 00:00:00 2001 From: Andrey Epifantsev Date: Wed, 27 Aug 2025 15:22:47 +0400 Subject: [PATCH] =?UTF-8?q?style:=20=D1=84=D0=BE=D1=80=D0=BC=D0=B0=D1=82?= =?UTF-8?q?=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5=20=D0=BA=D0=BE?= =?UTF-8?q?=D0=B4=D0=B0=20-=20=D1=83=D0=B1=D1=80=D0=B0=D0=BD=D1=8B=20?= =?UTF-8?q?=D0=BB=D0=B8=D1=88=D0=BD=D0=B8=D0=B5=20=D0=BF=D1=83=D1=81=D1=82?= =?UTF-8?q?=D1=8B=D0=B5=20=D1=81=D1=82=D1=80=D0=BE=D0=BA=D0=B8=20=D0=B8=20?= =?UTF-8?q?=D0=B8=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D1=8B=20?= =?UTF-8?q?=D0=B8=D0=BC=D0=BF=D0=BE=D1=80=D1=82=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core-service/internal/api/middleware/auth.go | 9 ++- core-service/internal/api/server.go | 18 ++--- core-service/internal/repository/items.go | 55 ++++++------- core-service/internal/repository/locations.go | 57 ++++++------- .../internal/repository/operations.go | 79 ++++++++++--------- core-service/internal/service/item_service.go | 30 +++---- .../internal/service/location_service.go | 30 +++---- .../internal/service/operations_service.go | 48 +++++------ 8 files changed, 165 insertions(+), 161 deletions(-) diff --git a/core-service/internal/api/middleware/auth.go b/core-service/internal/api/middleware/auth.go index 613f108..5b4b5a0 100644 --- a/core-service/internal/api/middleware/auth.go +++ b/core-service/internal/api/middleware/auth.go @@ -5,6 +5,7 @@ import ( "strings" "erp-mvp/core-service/internal/auth" + "github.com/gin-gonic/gin" "github.com/google/uuid" ) @@ -63,22 +64,22 @@ func GetClaims(c *gin.Context) *auth.Claims { if !exists { return nil } - + orgID, exists := c.Get("organization_id") if !exists { return nil } - + email, exists := c.Get("email") if !exists { return nil } - + role, exists := c.Get("role") if !exists { return nil } - + return &auth.Claims{ UserID: userID.(uuid.UUID), OrganizationID: orgID.(uuid.UUID), diff --git a/core-service/internal/api/server.go b/core-service/internal/api/server.go index 6b397dc..25e888d 100644 --- a/core-service/internal/api/server.go +++ b/core-service/internal/api/server.go @@ -5,13 +5,13 @@ import ( "database/sql" "net/http" + "erp-mvp/core-service/internal/api/handlers" + "erp-mvp/core-service/internal/api/middleware" "erp-mvp/core-service/internal/auth" "erp-mvp/core-service/internal/config" "erp-mvp/core-service/internal/logger" "erp-mvp/core-service/internal/repository" "erp-mvp/core-service/internal/service" - "erp-mvp/core-service/internal/api/handlers" - "erp-mvp/core-service/internal/api/middleware" "github.com/gin-gonic/gin" ) @@ -23,15 +23,15 @@ type Server struct { router *gin.Engine // Services - authService service.AuthService - locationService service.LocationService - itemService service.ItemService + authService service.AuthService + locationService service.LocationService + itemService service.ItemService operationsService service.OperationsService // Handlers - authHandler *handlers.AuthHandler - locationHandler *handlers.LocationHandler - itemHandler *handlers.ItemHandler + authHandler *handlers.AuthHandler + locationHandler *handlers.LocationHandler + itemHandler *handlers.ItemHandler operationsHandler *handlers.OperationsHandler // Middleware @@ -140,7 +140,7 @@ func (s *Server) setupRoutes() { func (s *Server) healthCheck(c *gin.Context) { c.JSON(http.StatusOK, gin.H{ - "status": "ok", + "status": "ok", "service": "erp-mvp-core", }) } diff --git a/core-service/internal/repository/items.go b/core-service/internal/repository/items.go index 86aecc3..1869a6b 100644 --- a/core-service/internal/repository/items.go +++ b/core-service/internal/repository/items.go @@ -6,6 +6,7 @@ import ( "fmt" "erp-mvp/core-service/internal/models" + "github.com/google/uuid" ) @@ -31,7 +32,7 @@ func (r *itemRepository) Create(ctx context.Context, item *models.Item) error { INSERT INTO items (id, organization_id, name, description, category, created_at) VALUES ($1, $2, $3, $4, $5, $6) ` - + _, err := r.db.ExecContext(ctx, query, item.ID, item.OrganizationID, @@ -43,7 +44,7 @@ func (r *itemRepository) Create(ctx context.Context, item *models.Item) error { if err != nil { return fmt.Errorf("failed to create item: %w", err) } - + return nil } @@ -53,7 +54,7 @@ func (r *itemRepository) GetByID(ctx context.Context, id uuid.UUID, orgID uuid.U FROM items WHERE id = $1 AND organization_id = $2 ` - + item := &models.Item{} err := r.db.QueryRowContext(ctx, query, id, orgID).Scan( &item.ID, @@ -63,14 +64,14 @@ func (r *itemRepository) GetByID(ctx context.Context, id uuid.UUID, orgID uuid.U &item.Category, &item.CreatedAt, ) - + if err != nil { if err == sql.ErrNoRows { return nil, fmt.Errorf("item not found") } return nil, fmt.Errorf("failed to get item: %w", err) } - + return item, nil } @@ -81,13 +82,13 @@ func (r *itemRepository) GetByOrganization(ctx context.Context, orgID uuid.UUID) WHERE organization_id = $1 ORDER BY name ` - + rows, err := r.db.QueryContext(ctx, query, orgID) if err != nil { return nil, fmt.Errorf("failed to query items: %w", err) } defer rows.Close() - + var items []*models.Item for rows.Next() { item := &models.Item{} @@ -102,14 +103,14 @@ func (r *itemRepository) GetByOrganization(ctx context.Context, orgID uuid.UUID) if err != nil { return nil, fmt.Errorf("failed to scan item: %w", err) } - + items = append(items, item) } - + if err = rows.Err(); err != nil { return nil, fmt.Errorf("error iterating items: %w", err) } - + return items, nil } @@ -119,7 +120,7 @@ func (r *itemRepository) Update(ctx context.Context, item *models.Item) error { SET name = $3, description = $4, category = $5 WHERE id = $1 AND organization_id = $2 ` - + result, err := r.db.ExecContext(ctx, query, item.ID, item.OrganizationID, @@ -130,16 +131,16 @@ func (r *itemRepository) Update(ctx context.Context, item *models.Item) error { if err != nil { return fmt.Errorf("failed to update item: %w", err) } - + rowsAffected, err := result.RowsAffected() if err != nil { return fmt.Errorf("failed to get rows affected: %w", err) } - + if rowsAffected == 0 { return fmt.Errorf("item not found") } - + return nil } @@ -148,21 +149,21 @@ func (r *itemRepository) Delete(ctx context.Context, id uuid.UUID, orgID uuid.UU DELETE FROM items WHERE id = $1 AND organization_id = $2 ` - + result, err := r.db.ExecContext(ctx, query, id, orgID) if err != nil { return fmt.Errorf("failed to delete item: %w", err) } - + rowsAffected, err := result.RowsAffected() if err != nil { return fmt.Errorf("failed to get rows affected: %w", err) } - + if rowsAffected == 0 { return fmt.Errorf("item not found") } - + return nil } @@ -172,31 +173,31 @@ func (r *itemRepository) Search(ctx context.Context, orgID uuid.UUID, query stri FROM items WHERE organization_id = $1 ` - + var args []interface{} args = append(args, orgID) argIndex := 2 - + if query != "" { baseQuery += fmt.Sprintf(" AND (name ILIKE $%d OR description ILIKE $%d)", argIndex, argIndex) args = append(args, "%"+query+"%") argIndex++ } - + if category != "" { baseQuery += fmt.Sprintf(" AND category = $%d", argIndex) args = append(args, category) argIndex++ } - + baseQuery += " ORDER BY name" - + rows, err := r.db.QueryContext(ctx, baseQuery, args...) if err != nil { return nil, fmt.Errorf("failed to search items: %w", err) } defer rows.Close() - + var items []*models.Item for rows.Next() { item := &models.Item{} @@ -211,13 +212,13 @@ func (r *itemRepository) Search(ctx context.Context, orgID uuid.UUID, query stri if err != nil { return nil, fmt.Errorf("failed to scan item: %w", err) } - + items = append(items, item) } - + if err = rows.Err(); err != nil { return nil, fmt.Errorf("error iterating search results: %w", err) } - + return items, nil } diff --git a/core-service/internal/repository/locations.go b/core-service/internal/repository/locations.go index 6b2f00c..4fe5a8f 100644 --- a/core-service/internal/repository/locations.go +++ b/core-service/internal/repository/locations.go @@ -7,6 +7,7 @@ import ( "fmt" "erp-mvp/core-service/internal/models" + "github.com/google/uuid" ) @@ -32,7 +33,7 @@ func (r *locationRepository) Create(ctx context.Context, location *models.Storag INSERT INTO storage_locations (id, organization_id, parent_id, name, address, type, coordinates, created_at) VALUES ($1, $2, $3, $4, $5, $6, $7, $8) ` - + // Конвертируем JSON в строку var coordinatesJSON string if location.Coordinates != nil { @@ -42,7 +43,7 @@ func (r *locationRepository) Create(ctx context.Context, location *models.Storag } coordinatesJSON = string(coords) } - + _, err := r.db.ExecContext(ctx, query, location.ID, location.OrganizationID, @@ -56,7 +57,7 @@ func (r *locationRepository) Create(ctx context.Context, location *models.Storag if err != nil { return fmt.Errorf("failed to create storage location: %w", err) } - + return nil } @@ -66,7 +67,7 @@ func (r *locationRepository) GetByID(ctx context.Context, id uuid.UUID, orgID uu FROM storage_locations WHERE id = $1 AND organization_id = $2 ` - + var coordinatesJSON []byte location := &models.StorageLocation{} err := r.db.QueryRowContext(ctx, query, id, orgID).Scan( @@ -79,14 +80,14 @@ func (r *locationRepository) GetByID(ctx context.Context, id uuid.UUID, orgID uu &coordinatesJSON, &location.CreatedAt, ) - + if err != nil { if err == sql.ErrNoRows { return nil, fmt.Errorf("storage location not found") } return nil, fmt.Errorf("failed to get storage location: %w", err) } - + // Конвертируем JSON строку в map if len(coordinatesJSON) > 0 { err = json.Unmarshal(coordinatesJSON, &location.Coordinates) @@ -96,7 +97,7 @@ func (r *locationRepository) GetByID(ctx context.Context, id uuid.UUID, orgID uu } else { location.Coordinates = make(models.JSON) } - + return location, nil } @@ -107,13 +108,13 @@ func (r *locationRepository) GetByOrganization(ctx context.Context, orgID uuid.U WHERE organization_id = $1 ORDER BY name ` - + rows, err := r.db.QueryContext(ctx, query, orgID) if err != nil { return nil, fmt.Errorf("failed to query storage locations: %w", err) } defer rows.Close() - + var locations []*models.StorageLocation for rows.Next() { var coordinatesJSON []byte @@ -131,7 +132,7 @@ func (r *locationRepository) GetByOrganization(ctx context.Context, orgID uuid.U if err != nil { return nil, fmt.Errorf("failed to scan storage location: %w", err) } - + // Конвертируем JSON строку в map if len(coordinatesJSON) > 0 { err = json.Unmarshal(coordinatesJSON, &location.Coordinates) @@ -141,14 +142,14 @@ func (r *locationRepository) GetByOrganization(ctx context.Context, orgID uuid.U } else { location.Coordinates = make(models.JSON) } - + locations = append(locations, location) } - + if err = rows.Err(); err != nil { return nil, fmt.Errorf("error iterating storage locations: %w", err) } - + return locations, nil } @@ -158,7 +159,7 @@ func (r *locationRepository) Update(ctx context.Context, location *models.Storag SET parent_id = $3, name = $4, address = $5, type = $6, coordinates = $7 WHERE id = $1 AND organization_id = $2 ` - + // Конвертируем JSON в строку var coordinatesJSON string if location.Coordinates != nil { @@ -168,7 +169,7 @@ func (r *locationRepository) Update(ctx context.Context, location *models.Storag } coordinatesJSON = string(coords) } - + result, err := r.db.ExecContext(ctx, query, location.ID, location.OrganizationID, @@ -181,16 +182,16 @@ func (r *locationRepository) Update(ctx context.Context, location *models.Storag if err != nil { return fmt.Errorf("failed to update storage location: %w", err) } - + rowsAffected, err := result.RowsAffected() if err != nil { return fmt.Errorf("failed to get rows affected: %w", err) } - + if rowsAffected == 0 { return fmt.Errorf("storage location not found") } - + return nil } @@ -199,21 +200,21 @@ func (r *locationRepository) Delete(ctx context.Context, id uuid.UUID, orgID uui DELETE FROM storage_locations WHERE id = $1 AND organization_id = $2 ` - + result, err := r.db.ExecContext(ctx, query, id, orgID) if err != nil { return fmt.Errorf("failed to delete storage location: %w", err) } - + rowsAffected, err := result.RowsAffected() if err != nil { return fmt.Errorf("failed to get rows affected: %w", err) } - + if rowsAffected == 0 { return fmt.Errorf("storage location not found") } - + return nil } @@ -224,13 +225,13 @@ func (r *locationRepository) GetChildren(ctx context.Context, parentID uuid.UUID WHERE parent_id = $1 AND organization_id = $2 ORDER BY name ` - + rows, err := r.db.QueryContext(ctx, query, parentID, orgID) if err != nil { return nil, fmt.Errorf("failed to query child locations: %w", err) } defer rows.Close() - + var locations []*models.StorageLocation for rows.Next() { var coordinatesJSON []byte @@ -248,7 +249,7 @@ func (r *locationRepository) GetChildren(ctx context.Context, parentID uuid.UUID if err != nil { return nil, fmt.Errorf("failed to scan child location: %w", err) } - + // Конвертируем JSON строку в map if len(coordinatesJSON) > 0 { err = json.Unmarshal(coordinatesJSON, &location.Coordinates) @@ -258,13 +259,13 @@ func (r *locationRepository) GetChildren(ctx context.Context, parentID uuid.UUID } else { location.Coordinates = make(models.JSON) } - + locations = append(locations, location) } - + if err = rows.Err(); err != nil { return nil, fmt.Errorf("error iterating child locations: %w", err) } - + return locations, nil } diff --git a/core-service/internal/repository/operations.go b/core-service/internal/repository/operations.go index 5cf26db..fc4be18 100644 --- a/core-service/internal/repository/operations.go +++ b/core-service/internal/repository/operations.go @@ -7,6 +7,7 @@ import ( "fmt" "erp-mvp/core-service/internal/models" + "github.com/google/uuid" ) @@ -34,7 +35,7 @@ func (r *operationsRepository) PlaceItem(ctx context.Context, placement *models. INSERT INTO item_placements (id, organization_id, item_id, location_id, quantity, created_at) VALUES ($1, $2, $3, $4, $5, $6) ` - + _, err := r.db.ExecContext(ctx, query, placement.ID, placement.OrganizationID, @@ -46,7 +47,7 @@ func (r *operationsRepository) PlaceItem(ctx context.Context, placement *models. if err != nil { return fmt.Errorf("failed to place item: %w", err) } - + return nil } @@ -56,21 +57,21 @@ func (r *operationsRepository) MoveItem(ctx context.Context, placementID uuid.UU SET location_id = $2 WHERE id = $1 AND organization_id = $3 ` - + result, err := r.db.ExecContext(ctx, query, placementID, newLocationID, orgID) if err != nil { return fmt.Errorf("failed to move item: %w", err) } - + rowsAffected, err := result.RowsAffected() if err != nil { return fmt.Errorf("failed to get rows affected: %w", err) } - + if rowsAffected == 0 { return fmt.Errorf("item placement not found") } - + return nil } @@ -81,13 +82,13 @@ func (r *operationsRepository) GetByItem(ctx context.Context, itemID uuid.UUID, WHERE item_id = $1 AND organization_id = $2 ORDER BY created_at DESC ` - + rows, err := r.db.QueryContext(ctx, query, itemID, orgID) if err != nil { return nil, fmt.Errorf("failed to query item placements: %w", err) } defer rows.Close() - + var placements []*models.ItemPlacement for rows.Next() { placement := &models.ItemPlacement{} @@ -102,14 +103,14 @@ func (r *operationsRepository) GetByItem(ctx context.Context, itemID uuid.UUID, if err != nil { return nil, fmt.Errorf("failed to scan item placement: %w", err) } - + placements = append(placements, placement) } - + if err = rows.Err(); err != nil { return nil, fmt.Errorf("error iterating item placements: %w", err) } - + return placements, nil } @@ -120,13 +121,13 @@ func (r *operationsRepository) GetByLocation(ctx context.Context, locationID uui WHERE location_id = $1 AND organization_id = $2 ORDER BY created_at DESC ` - + rows, err := r.db.QueryContext(ctx, query, locationID, orgID) if err != nil { return nil, fmt.Errorf("failed to query location placements: %w", err) } defer rows.Close() - + var placements []*models.ItemPlacement for rows.Next() { placement := &models.ItemPlacement{} @@ -141,14 +142,14 @@ func (r *operationsRepository) GetByLocation(ctx context.Context, locationID uui if err != nil { return nil, fmt.Errorf("failed to scan item placement: %w", err) } - + placements = append(placements, placement) } - + if err = rows.Err(); err != nil { return nil, fmt.Errorf("error iterating location placements: %w", err) } - + return placements, nil } @@ -158,7 +159,7 @@ func (r *operationsRepository) GetByID(ctx context.Context, id uuid.UUID, orgID FROM item_placements WHERE id = $1 AND organization_id = $2 ` - + placement := &models.ItemPlacement{} err := r.db.QueryRowContext(ctx, query, id, orgID).Scan( &placement.ID, @@ -168,14 +169,14 @@ func (r *operationsRepository) GetByID(ctx context.Context, id uuid.UUID, orgID &placement.Quantity, &placement.CreatedAt, ) - + if err != nil { if err == sql.ErrNoRows { return nil, fmt.Errorf("item placement not found") } return nil, fmt.Errorf("failed to get item placement: %w", err) } - + return placement, nil } @@ -185,21 +186,21 @@ func (r *operationsRepository) UpdateQuantity(ctx context.Context, id uuid.UUID, SET quantity = $2 WHERE id = $1 AND organization_id = $3 ` - + result, err := r.db.ExecContext(ctx, query, id, quantity, orgID) if err != nil { return fmt.Errorf("failed to update quantity: %w", err) } - + rowsAffected, err := result.RowsAffected() if err != nil { return fmt.Errorf("failed to get rows affected: %w", err) } - + if rowsAffected == 0 { return fmt.Errorf("item placement not found") } - + return nil } @@ -208,21 +209,21 @@ func (r *operationsRepository) Delete(ctx context.Context, id uuid.UUID, orgID u DELETE FROM item_placements WHERE id = $1 AND organization_id = $2 ` - + result, err := r.db.ExecContext(ctx, query, id, orgID) if err != nil { return fmt.Errorf("failed to delete item placement: %w", err) } - + rowsAffected, err := result.RowsAffected() if err != nil { return fmt.Errorf("failed to get rows affected: %w", err) } - + if rowsAffected == 0 { return fmt.Errorf("item placement not found") } - + return nil } @@ -237,42 +238,42 @@ func (r *operationsRepository) Search(ctx context.Context, orgID uuid.UUID, quer JOIN storage_locations sl ON ip.location_id = sl.id WHERE i.organization_id = $1 AND sl.organization_id = $1 ` - + var args []interface{} args = append(args, orgID) argIndex := 2 - + if query != "" { baseQuery += fmt.Sprintf(" AND (i.name ILIKE $%d OR i.description ILIKE $%d)", argIndex, argIndex) args = append(args, "%"+query+"%") argIndex++ } - + if category != "" { baseQuery += fmt.Sprintf(" AND i.category = $%d", argIndex) args = append(args, category) argIndex++ } - + if address != "" { baseQuery += fmt.Sprintf(" AND sl.address ILIKE $%d", argIndex) args = append(args, "%"+address+"%") argIndex++ } - + baseQuery += " ORDER BY i.name, sl.name" - + rows, err := r.db.QueryContext(ctx, baseQuery, args...) if err != nil { return nil, fmt.Errorf("failed to search items with locations: %w", err) } defer rows.Close() - + var results []*models.ItemWithLocation for rows.Next() { var coordinatesJSON []byte itemWithLocation := &models.ItemWithLocation{} - + err := rows.Scan( &itemWithLocation.Item.ID, &itemWithLocation.Item.OrganizationID, @@ -293,7 +294,7 @@ func (r *operationsRepository) Search(ctx context.Context, orgID uuid.UUID, quer if err != nil { return nil, fmt.Errorf("failed to scan item with location: %w", err) } - + // Конвертируем JSON строку в map if len(coordinatesJSON) > 0 { err = json.Unmarshal(coordinatesJSON, &itemWithLocation.Location.Coordinates) @@ -303,13 +304,13 @@ func (r *operationsRepository) Search(ctx context.Context, orgID uuid.UUID, quer } else { itemWithLocation.Location.Coordinates = make(models.JSON) } - + results = append(results, itemWithLocation) } - + if err = rows.Err(); err != nil { return nil, fmt.Errorf("error iterating search results: %w", err) } - + return results, nil } diff --git a/core-service/internal/service/item_service.go b/core-service/internal/service/item_service.go index 0559a49..d70a0e7 100644 --- a/core-service/internal/service/item_service.go +++ b/core-service/internal/service/item_service.go @@ -34,7 +34,7 @@ func NewItemService(itemRepo repository.ItemRepository) ItemService { func (s *itemService) CreateItem(ctx context.Context, orgID uuid.UUID, req *models.CreateItemRequest) (*models.Item, error) { s.logger.Info("Creating item for organization: ", orgID) - + item := &models.Item{ ID: uuid.New(), OrganizationID: orgID, @@ -43,84 +43,84 @@ func (s *itemService) CreateItem(ctx context.Context, orgID uuid.UUID, req *mode Category: req.Category, CreatedAt: time.Now(), } - + if err := s.itemRepo.Create(ctx, item); err != nil { s.logger.Error("Failed to create item: ", err) return nil, err } - + s.logger.Info("Item created successfully: ", item.ID) return item, nil } func (s *itemService) GetItem(ctx context.Context, id uuid.UUID, orgID uuid.UUID) (*models.Item, error) { s.logger.Info("Getting item: ", id, " for organization: ", orgID) - + item, err := s.itemRepo.GetByID(ctx, id, orgID) if err != nil { s.logger.Error("Failed to get item: ", err) return nil, err } - + return item, nil } func (s *itemService) GetItems(ctx context.Context, orgID uuid.UUID) ([]*models.Item, error) { s.logger.Info("Getting all items for organization: ", orgID) - + items, err := s.itemRepo.GetByOrganization(ctx, orgID) if err != nil { s.logger.Error("Failed to get items: ", err) return nil, err } - + return items, nil } func (s *itemService) UpdateItem(ctx context.Context, id uuid.UUID, orgID uuid.UUID, req *models.CreateItemRequest) (*models.Item, error) { s.logger.Info("Updating item: ", id, " for organization: ", orgID) - + // Сначала получаем существующий товар item, err := s.itemRepo.GetByID(ctx, id, orgID) if err != nil { s.logger.Error("Failed to get item for update: ", err) return nil, err } - + // Обновляем поля item.Name = req.Name item.Description = req.Description item.Category = req.Category - + if err := s.itemRepo.Update(ctx, item); err != nil { s.logger.Error("Failed to update item: ", err) return nil, err } - + s.logger.Info("Item updated successfully: ", item.ID) return item, nil } func (s *itemService) DeleteItem(ctx context.Context, id uuid.UUID, orgID uuid.UUID) error { s.logger.Info("Deleting item: ", id, " for organization: ", orgID) - + if err := s.itemRepo.Delete(ctx, id, orgID); err != nil { s.logger.Error("Failed to delete item: ", err) return err } - + s.logger.Info("Item deleted successfully: ", id) return nil } func (s *itemService) SearchItems(ctx context.Context, orgID uuid.UUID, query string, category string) ([]*models.Item, error) { s.logger.Info("Searching items for organization: ", orgID, " query: ", query, " category: ", category) - + items, err := s.itemRepo.Search(ctx, orgID, query, category) if err != nil { s.logger.Error("Failed to search items: ", err) return nil, err } - + return items, nil } diff --git a/core-service/internal/service/location_service.go b/core-service/internal/service/location_service.go index cdcd136..94b0dc7 100644 --- a/core-service/internal/service/location_service.go +++ b/core-service/internal/service/location_service.go @@ -34,7 +34,7 @@ func NewLocationService(locationRepo repository.LocationRepository) LocationServ func (s *locationService) CreateLocation(ctx context.Context, orgID uuid.UUID, req *models.CreateLocationRequest) (*models.StorageLocation, error) { s.logger.Info("Creating location for organization: ", orgID) - + location := &models.StorageLocation{ ID: uuid.New(), OrganizationID: orgID, @@ -45,86 +45,86 @@ func (s *locationService) CreateLocation(ctx context.Context, orgID uuid.UUID, r Coordinates: req.Coordinates, CreatedAt: time.Now(), } - + if err := s.locationRepo.Create(ctx, location); err != nil { s.logger.Error("Failed to create location: ", err) return nil, err } - + s.logger.Info("Location created successfully: ", location.ID) return location, nil } func (s *locationService) GetLocation(ctx context.Context, id uuid.UUID, orgID uuid.UUID) (*models.StorageLocation, error) { s.logger.Info("Getting location: ", id, " for organization: ", orgID) - + location, err := s.locationRepo.GetByID(ctx, id, orgID) if err != nil { s.logger.Error("Failed to get location: ", err) return nil, err } - + return location, nil } func (s *locationService) GetLocations(ctx context.Context, orgID uuid.UUID) ([]*models.StorageLocation, error) { s.logger.Info("Getting all locations for organization: ", orgID) - + locations, err := s.locationRepo.GetByOrganization(ctx, orgID) if err != nil { s.logger.Error("Failed to get locations: ", err) return nil, err } - + return locations, nil } func (s *locationService) UpdateLocation(ctx context.Context, id uuid.UUID, orgID uuid.UUID, req *models.CreateLocationRequest) (*models.StorageLocation, error) { s.logger.Info("Updating location: ", id, " for organization: ", orgID) - + // Сначала получаем существующую локацию location, err := s.locationRepo.GetByID(ctx, id, orgID) if err != nil { s.logger.Error("Failed to get location for update: ", err) return nil, err } - + // Обновляем поля location.ParentID = req.ParentID location.Name = req.Name location.Address = req.Address location.Type = req.Type location.Coordinates = req.Coordinates - + if err := s.locationRepo.Update(ctx, location); err != nil { s.logger.Error("Failed to update location: ", err) return nil, err } - + s.logger.Info("Location updated successfully: ", location.ID) return location, nil } func (s *locationService) DeleteLocation(ctx context.Context, id uuid.UUID, orgID uuid.UUID) error { s.logger.Info("Deleting location: ", id, " for organization: ", orgID) - + if err := s.locationRepo.Delete(ctx, id, orgID); err != nil { s.logger.Error("Failed to delete location: ", err) return err } - + s.logger.Info("Location deleted successfully: ", id) return nil } func (s *locationService) GetChildren(ctx context.Context, parentID uuid.UUID, orgID uuid.UUID) ([]*models.StorageLocation, error) { s.logger.Info("Getting children for location: ", parentID, " in organization: ", orgID) - + children, err := s.locationRepo.GetChildren(ctx, parentID, orgID) if err != nil { s.logger.Error("Failed to get children: ", err) return nil, err } - + return children, nil } diff --git a/core-service/internal/service/operations_service.go b/core-service/internal/service/operations_service.go index 6cf149c..ed62e31 100644 --- a/core-service/internal/service/operations_service.go +++ b/core-service/internal/service/operations_service.go @@ -39,21 +39,21 @@ func NewOperationsService(operationsRepo repository.OperationsRepository, itemRe func (s *operationsService) PlaceItem(ctx context.Context, orgID uuid.UUID, req *models.PlaceItemRequest) (*models.ItemPlacement, error) { s.logger.Info("Placing item: ", req.ItemID, " in location: ", req.LocationID, " for organization: ", orgID) - + // Проверяем, что товар существует и принадлежит организации _, err := s.itemRepo.GetByID(ctx, req.ItemID, orgID) if err != nil { s.logger.Error("Item not found or not accessible: ", err) return nil, err } - + // Проверяем, что место хранения существует и принадлежит организации _, err = s.locationRepo.GetByID(ctx, req.LocationID, orgID) if err != nil { s.logger.Error("Location not found or not accessible: ", err) return nil, err } - + placement := &models.ItemPlacement{ ID: uuid.New(), OrganizationID: orgID, @@ -62,131 +62,131 @@ func (s *operationsService) PlaceItem(ctx context.Context, orgID uuid.UUID, req Quantity: req.Quantity, CreatedAt: time.Now(), } - + if err := s.operationsRepo.PlaceItem(ctx, placement); err != nil { s.logger.Error("Failed to place item: ", err) return nil, err } - + s.logger.Info("Item placed successfully: ", placement.ID) return placement, nil } func (s *operationsService) MoveItem(ctx context.Context, placementID uuid.UUID, newLocationID uuid.UUID, orgID uuid.UUID) error { s.logger.Info("Moving item placement: ", placementID, " to location: ", newLocationID, " for organization: ", orgID) - + // Проверяем, что размещение существует и принадлежит организации placement, err := s.operationsRepo.GetByID(ctx, placementID, orgID) if err != nil { s.logger.Error("Item placement not found or not accessible: ", err) return err } - + // Проверяем, что новое место хранения существует и принадлежит организации _, err = s.locationRepo.GetByID(ctx, newLocationID, orgID) if err != nil { s.logger.Error("New location not found or not accessible: ", err) return err } - + if err := s.operationsRepo.MoveItem(ctx, placementID, newLocationID, orgID); err != nil { s.logger.Error("Failed to move item: ", err) return err } - + s.logger.Info("Item moved successfully from location: ", placement.LocationID, " to: ", newLocationID) return nil } func (s *operationsService) GetItemPlacements(ctx context.Context, itemID uuid.UUID, orgID uuid.UUID) ([]*models.ItemPlacement, error) { s.logger.Info("Getting placements for item: ", itemID, " in organization: ", orgID) - + // Проверяем, что товар существует и принадлежит организации _, err := s.itemRepo.GetByID(ctx, itemID, orgID) if err != nil { s.logger.Error("Item not found or not accessible: ", err) return nil, err } - + placements, err := s.operationsRepo.GetByItem(ctx, itemID, orgID) if err != nil { s.logger.Error("Failed to get item placements: ", err) return nil, err } - + return placements, nil } func (s *operationsService) GetLocationPlacements(ctx context.Context, locationID uuid.UUID, orgID uuid.UUID) ([]*models.ItemPlacement, error) { s.logger.Info("Getting placements for location: ", locationID, " in organization: ", orgID) - + // Проверяем, что место хранения существует и принадлежит организации _, err := s.locationRepo.GetByID(ctx, locationID, orgID) if err != nil { s.logger.Error("Location not found or not accessible: ", err) return nil, err } - + placements, err := s.operationsRepo.GetByLocation(ctx, locationID, orgID) if err != nil { s.logger.Error("Failed to get location placements: ", err) return nil, err } - + return placements, nil } func (s *operationsService) UpdateQuantity(ctx context.Context, placementID uuid.UUID, quantity int, orgID uuid.UUID) error { s.logger.Info("Updating quantity for placement: ", placementID, " to: ", quantity, " in organization: ", orgID) - + // Проверяем, что размещение существует и принадлежит организации _, err := s.operationsRepo.GetByID(ctx, placementID, orgID) if err != nil { s.logger.Error("Item placement not found or not accessible: ", err) return err } - + if err := s.operationsRepo.UpdateQuantity(ctx, placementID, quantity, orgID); err != nil { s.logger.Error("Failed to update quantity: ", err) return err } - + s.logger.Info("Quantity updated successfully for placement: ", placementID) return nil } func (s *operationsService) DeletePlacement(ctx context.Context, placementID uuid.UUID, orgID uuid.UUID) error { s.logger.Info("Deleting placement: ", placementID, " for organization: ", orgID) - + // Проверяем, что размещение существует и принадлежит организации _, err := s.operationsRepo.GetByID(ctx, placementID, orgID) if err != nil { s.logger.Error("Item placement not found or not accessible: ", err) return err } - + if err := s.operationsRepo.Delete(ctx, placementID, orgID); err != nil { s.logger.Error("Failed to delete placement: ", err) return err } - + s.logger.Info("Placement deleted successfully: ", placementID) return nil } func (s *operationsService) Search(ctx context.Context, orgID uuid.UUID, req *models.SearchRequest) (*models.SearchResponse, error) { s.logger.Info("Searching items with locations for organization: ", orgID, " query: ", req.Query) - + results, err := s.operationsRepo.Search(ctx, orgID, req.Query, req.Category, req.Address) if err != nil { s.logger.Error("Failed to search items with locations: ", err) return nil, err } - + response := &models.SearchResponse{ Items: results, TotalCount: len(results), } - + return response, nil }