Files
2026-01-05 11:56:19 +07:00

108 lines
4.0 KiB
Go

package component
import (
"api-service/internal/models"
"database/sql"
"encoding/json"
"time"
)
// Rol_component represents the data structure for the role_access.rol_component table
// with proper null handling and optimized JSON marshaling.
type Rol_component struct {
ID int64 `json:"id" db:"id"`
Name string `json:"name" db:"name"`
Description sql.NullString `json:"description,omitempty" db:"description"`
Directory string `json:"directory" db:"directory"`
Active bool `json:"active" db:"active"`
FkRolPagesID int64 `json:"fk_rol_pages_id" db:"fk_rol_pages_id"`
Sort int64 `json:"sort" db:"sort"`
}
// MarshalJSON for Rol_component handles the sql.NullString field 'Description'
// to ensure it appears as null, an empty string, or the string value in JSON.
func (r Rol_component) MarshalJSON() ([]byte, error) {
type Alias Rol_component
aux := &struct {
*Alias
Description *string `json:"description,omitempty"`
}{
Alias: (*Alias)(&r),
}
if r.Description.Valid {
aux.Description = &r.Description.String
}
return json.Marshal(aux)
}
// Helper method to safely get Description
func (r *Rol_component) GetDescription() string {
if r.Description.Valid {
return r.Description.String
}
return ""
}
// =============================================================================
// REQUEST & RESPONSE STRUCTS FOR ROL_COMPONENT
// =============================================================================
// ComponentCreateRequest defines the structure for creating a new component.
type ComponentCreateRequest struct {
Name string `json:"name" validate:"required,min=1,max=100"`
Description *string `json:"description" validate:"omitempty,max=255"`
Directory string `json:"directory" validate:"required,min=1,max=255"`
Active bool `json:"active"`
Sort int64 `json:"sort"`
FkRolPagesID int64 `json:"fk_rol_pages_id" validate:"required,min=1"`
}
// ComponentUpdateRequest defines the structure for updating an existing component.
// ID is handled via URL parameter, so it's omitted from JSON with `json:"-"`.
type ComponentUpdateRequest struct {
ID *int `json:"-" validate:"required"` // ID is from URL param
Name *string `json:"name" validate:"omitempty,min=1,max=100"`
Description *string `json:"description" validate:"omitempty,max=255"`
Directory *string `json:"directory" validate:"omitempty,min=1,max=255"`
Active *bool `json:"active" validate:"omitempty"`
Sort *int `json:"sort" validate:"omitempty,min=1"`
FkRolPagesID *int `json:"fk_rol_pages_id" validate:"omitempty,min=1"`
}
// ComponentsGetResponse defines the response structure for getting a list of components.
type ComponentsGetResponse struct {
Code int `json:"code"`
Message string `json:"message"`
Data []Rol_component `json:"data"`
Meta models.MetaResponse `json:"meta"`
}
// ComponentCreateResponse defines the response structure for creating a component.
type ComponentCreateResponse struct {
Message string `json:"message"`
Data *Rol_component `json:"data"`
}
// ComponentUpdateResponse defines the response structure for updating a component.
type ComponentUpdateResponse struct {
Message string `json:"message"`
Data *Rol_component `json:"data"`
}
// ComponentDeleteResponse defines the response structure for deleting a component.
type ComponentDeleteResponse struct {
Message string `json:"message"`
ID string `json:"id"`
}
// Rol_componentFilter defines the structure for query parameters when filtering components.
type Rol_componentFilter struct {
PageID *int64 `json:"page_id,omitempty" form:"page_id"`
Active *bool `json:"active,omitempty" form:"active"`
Search *string `json:"search,omitempty" form:"search"`
DateFrom *time.Time `json:"date_from,omitempty" form:"date_from"`
DateTo *time.Time `json:"date_to,omitempty" form:"date_to"`
Status *string `json:"status,omitempty" form:"status"`
}