From dc5a823508f7136efbbea76a76a6f972b5eb6fd7 Mon Sep 17 00:00:00 2001 From: ryan Date: Wed, 13 May 2026 15:22:23 +0700 Subject: [PATCH] add migration for outlet --- internal/contract/category_contract.go | 10 ++++---- internal/entities/category.go | 20 ++++++++-------- internal/models/category.go | 24 +++++++++---------- internal/processor/category_processor.go | 2 +- internal/validator/category_validator.go | 6 ----- ...00068_add_outlet_id_to_categories.down.sql | 3 +++ .../000068_add_outlet_id_to_categories.up.sql | 3 +++ 7 files changed, 34 insertions(+), 34 deletions(-) create mode 100644 migrations/000068_add_outlet_id_to_categories.down.sql create mode 100644 migrations/000068_add_outlet_id_to_categories.up.sql diff --git a/internal/contract/category_contract.go b/internal/contract/category_contract.go index 6bffa75..551c268 100644 --- a/internal/contract/category_contract.go +++ b/internal/contract/category_contract.go @@ -8,10 +8,10 @@ import ( type CreateCategoryRequest struct { Name string `json:"name" validate:"required,min=1,max=255"` - OutletID uuid.UUID `json:"outlet_id" validate:"required"` + OutletID *uuid.UUID `json:"outlet_id,omitempty"` Description *string `json:"description,omitempty"` BusinessType *string `json:"business_type,omitempty"` - Order *int `json:"order,omitempty"` + Order *int `json:"order,omitempty"` Metadata map[string]interface{} `json:"metadata,omitempty"` } @@ -20,7 +20,7 @@ type UpdateCategoryRequest struct { OutletID *uuid.UUID `json:"outlet_id,omitempty"` Description *string `json:"description,omitempty"` BusinessType *string `json:"business_type,omitempty"` - Order *int `json:"order,omitempty"` + Order *int `json:"order,omitempty"` Metadata map[string]interface{} `json:"metadata,omitempty"` } @@ -37,11 +37,11 @@ type ListCategoriesRequest struct { type CategoryResponse struct { ID uuid.UUID `json:"id"` OrganizationID uuid.UUID `json:"organization_id"` - OutletID uuid.UUID `json:"outlet_id"` + OutletID *uuid.UUID `json:"outlet_id,omitempty"` Name string `json:"name"` Description *string `json:"description"` BusinessType string `json:"business_type"` - Order int `json:"order"` + Order int `json:"order"` Metadata map[string]interface{} `json:"metadata"` CreatedAt time.Time `json:"created_at"` UpdatedAt time.Time `json:"updated_at"` diff --git a/internal/entities/category.go b/internal/entities/category.go index 7b186a6..20961ae 100644 --- a/internal/entities/category.go +++ b/internal/entities/category.go @@ -31,16 +31,16 @@ func (m *Metadata) Scan(value interface{}) error { } type Category struct { - ID uuid.UUID `gorm:"type:uuid;primary_key;default:gen_random_uuid()" json:"id"` - OrganizationID uuid.UUID `gorm:"type:uuid;not null;index" json:"organization_id" validate:"required"` - OutletID uuid.UUID `gorm:"type:uuid;not null;index" json:"outlet_id" validate:"required"` - Name string `gorm:"not null;size:255" json:"name" validate:"required,min=1,max=255"` - Description *string `gorm:"type:text" json:"description"` - Order int `gorm:"default:0" json:"order"` - BusinessType string `gorm:"size:50;default:'restaurant'" json:"business_type"` - Metadata Metadata `gorm:"type:jsonb;default:'{}'" json:"metadata"` - CreatedAt time.Time `gorm:"autoCreateTime" json:"created_at"` - UpdatedAt time.Time `gorm:"autoUpdateTime" json:"updated_at"` + ID uuid.UUID `gorm:"type:uuid;primary_key;default:gen_random_uuid()" json:"id"` + OrganizationID uuid.UUID `gorm:"type:uuid;not null;index" json:"organization_id" validate:"required"` + OutletID *uuid.UUID `gorm:"type:uuid;index" json:"outlet_id,omitempty"` + Name string `gorm:"not null;size:255" json:"name" validate:"required,min=1,max=255"` + Description *string `gorm:"type:text" json:"description"` + Order int `gorm:"default:0" json:"order"` + BusinessType string `gorm:"size:50;default:'restaurant'" json:"business_type"` + Metadata Metadata `gorm:"type:jsonb;default:'{}'" json:"metadata"` + CreatedAt time.Time `gorm:"autoCreateTime" json:"created_at"` + UpdatedAt time.Time `gorm:"autoUpdateTime" json:"updated_at"` Organization Organization `gorm:"foreignKey:OrganizationID" json:"organization,omitempty"` Outlet Outlet `gorm:"foreignKey:OutletID" json:"outlet,omitempty"` diff --git a/internal/models/category.go b/internal/models/category.go index 00982c1..7d3db75 100644 --- a/internal/models/category.go +++ b/internal/models/category.go @@ -9,11 +9,11 @@ import ( type Category struct { ID uuid.UUID OrganizationID uuid.UUID - OutletID uuid.UUID + OutletID *uuid.UUID Name string Description *string ImageURL *string - Order int + Order int IsActive bool CreatedAt time.Time UpdatedAt time.Time @@ -21,30 +21,30 @@ type Category struct { type CreateCategoryRequest struct { OrganizationID uuid.UUID `validate:"required"` - OutletID uuid.UUID `validate:"required"` - Name string `validate:"required,min=1,max=255"` - Description *string `validate:"omitempty,max=1000"` - ImageURL *string `validate:"omitempty,url"` - Order int `validate:"min=0"` + OutletID *uuid.UUID + Name string `validate:"required,min=1,max=255"` + Description *string `validate:"omitempty,max=1000"` + ImageURL *string `validate:"omitempty,url"` + Order int `validate:"min=0"` } type UpdateCategoryRequest struct { OutletID *uuid.UUID `validate:"omitempty,required"` Name *string `validate:"omitempty,min=1,max=255"` - Description *string `validate:"omitempty,max=1000"` - ImageURL *string `validate:"omitempty,url"` - Order *int `validate:"omitempty,min=0"` + Description *string `validate:"omitempty,max=1000"` + ImageURL *string `validate:"omitempty,url"` + Order *int `validate:"omitempty,min=0"` IsActive *bool } type CategoryResponse struct { ID uuid.UUID OrganizationID uuid.UUID - OutletID uuid.UUID + OutletID *uuid.UUID Name string Description *string ImageURL *string - Order int + Order int IsActive bool CreatedAt time.Time UpdatedAt time.Time diff --git a/internal/processor/category_processor.go b/internal/processor/category_processor.go index dddfc06..0e9a560 100644 --- a/internal/processor/category_processor.go +++ b/internal/processor/category_processor.go @@ -88,7 +88,7 @@ func (p *CategoryProcessorImpl) UpdateCategory(ctx context.Context, id uuid.UUID // Apply updates to entity mappers.UpdateCategoryEntityFromRequest(existingCategory, req) if req.OutletID != nil { - existingCategory.OutletID = *req.OutletID + existingCategory.OutletID = req.OutletID } // Update category diff --git a/internal/validator/category_validator.go b/internal/validator/category_validator.go index 3b6ec64..0399176 100644 --- a/internal/validator/category_validator.go +++ b/internal/validator/category_validator.go @@ -6,8 +6,6 @@ import ( "apskel-pos-be/internal/constants" "apskel-pos-be/internal/contract" - - "github.com/google/uuid" ) type CategoryValidator interface { @@ -27,10 +25,6 @@ func (v *CategoryValidatorImpl) ValidateCreateCategoryRequest(req *contract.Crea return errors.New("request body is required"), constants.MissingFieldErrorCode } - if req.OutletID == uuid.Nil { - return errors.New("outlet_id is required"), constants.MissingFieldErrorCode - } - if strings.TrimSpace(req.Name) == "" { return errors.New("name is required"), constants.MissingFieldErrorCode } diff --git a/migrations/000068_add_outlet_id_to_categories.down.sql b/migrations/000068_add_outlet_id_to_categories.down.sql new file mode 100644 index 0000000..d28336e --- /dev/null +++ b/migrations/000068_add_outlet_id_to_categories.down.sql @@ -0,0 +1,3 @@ +DROP INDEX IF EXISTS idx_categories_outlet_id; +ALTER TABLE categories DROP CONSTRAINT IF EXISTS fk_categories_outlet; +ALTER TABLE categories DROP COLUMN IF EXISTS outlet_id; diff --git a/migrations/000068_add_outlet_id_to_categories.up.sql b/migrations/000068_add_outlet_id_to_categories.up.sql new file mode 100644 index 0000000..cd4d519 --- /dev/null +++ b/migrations/000068_add_outlet_id_to_categories.up.sql @@ -0,0 +1,3 @@ +ALTER TABLE categories ADD COLUMN outlet_id UUID; +ALTER TABLE categories ADD CONSTRAINT fk_categories_outlet FOREIGN KEY (outlet_id) REFERENCES outlets(id) ON DELETE SET NULL; +CREATE INDEX idx_categories_outlet_id ON categories(outlet_id);