123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105 |
- package models
- import (
- "encoding/json"
- "time"
- "gorm.io/gorm"
- )
- type App struct {
- ID string `json:"id" gorm:"primaryKey"`
- Name string `json:"name" gorm:"not null"`
- Description string `json:"description"`
- Type string `json:"type" gorm:"index"` // frontend, backend, api, database, or microservice
- Language string `json:"language"` // Programming language or framework
- Version string `json:"version"` // Version number (e.g., 1.0.0)
- // Configuration details
- ConfigFile string `json:"configFile" gorm:"type:text"` // JSON configuration as a string
- EnvVariables string `json:"envVariables" gorm:"type:text"` // Environment variables as a string
- // Source code details
- Repository string `json:"repository"` // Git repository URL
- Branch string `json:"branch" gorm:"default:'main'"` // Git branch (default: main)
- BuildCommand string `json:"buildCommand"` // Command to build the app
- // Resource allocation - stored as JSON
- ResourcesJSON string `json:"-" gorm:"column:resources;type:text"`
- ScaleSettingsJSON string `json:"-" gorm:"column:scale_settings;type:text"`
- // Virtual fields for ORM serialization/deserialization
- Resources ResourceRequirements `json:"resources" gorm:"-"`
- ScaleSettings ScaleSettings `json:"scaleSettings" gorm:"-"`
- CreatedAt time.Time `json:"createdAt" gorm:"autoCreateTime"`
- UpdatedAt time.Time `json:"updatedAt" gorm:"autoUpdateTime"`
- CreatedBy string `json:"createdBy" gorm:"index"` // User ID who created the app
- DeletedAt gorm.DeletedAt `json:"-" gorm:"index"` // Soft delete support
- // Relationships
- Deployments []DeployedApp `json:"deployments" gorm:"foreignKey:AppID"` // Apps deployed in deployments
- }
- type ResourceRequirements struct {
- CPU string `json:"cpu"` // e.g., "0.5"
- Memory string `json:"memory"` // e.g., "512Mi"
- Storage string `json:"storage"` // e.g., "1Gi"
- }
- type ScaleSettings struct {
- MinInstances int `json:"minInstances"` // Minimum number of instances
- MaxInstances int `json:"maxInstances"` // Maximum number of instances
- CPUThreshold int `json:"cpuThreshold"` // CPU threshold for scaling (percentage)
- }
- // AppType represents the type of application
- type AppType string
- const (
- Frontend AppType = "frontend"
- Backend AppType = "backend"
- API AppType = "api"
- Database AppType = "database"
- Microservice AppType = "microservice"
- )
- // BeforeSave serializes the embedded JSON fields
- func (a *App) BeforeSave(tx *gorm.DB) error {
- var err error
- // Marshal Resources to JSON
- resourcesJSON, err := json.Marshal(a.Resources)
- if err != nil {
- return err
- }
- a.ResourcesJSON = string(resourcesJSON)
- // Marshal ScaleSettings to JSON
- scaleSettingsJSON, err := json.Marshal(a.ScaleSettings)
- if err != nil {
- return err
- }
- a.ScaleSettingsJSON = string(scaleSettingsJSON)
- return nil
- }
- // AfterFind deserializes the JSON fields
- func (a *App) AfterFind(tx *gorm.DB) error {
- // Unmarshal Resources from JSON
- if a.ResourcesJSON != "" {
- if err := json.Unmarshal([]byte(a.ResourcesJSON), &a.Resources); err != nil {
- return err
- }
- }
- // Unmarshal ScaleSettings from JSON
- if a.ScaleSettingsJSON != "" {
- if err := json.Unmarshal([]byte(a.ScaleSettingsJSON), &a.ScaleSettings); err != nil {
- return err
- }
- }
- return nil
- }
|