package models import ( "time" gonanoid "github.com/matoous/go-nanoid/v2" "gorm.io/gorm" ) type ID interface { UserID | SourceID | PostID | UserSourceID | UserFavoriteID | PoolID } type BaseModel[T ID] struct { ID T `json:"id" gorm:"primaryKey"` CreatedAt time.Time `json:"created_at"` UpdatedAt time.Time `json:"updated_at"` DeletedAt gorm.DeletedAt `json:"-" gorm:"index"` } func (base *BaseModel[T]) BeforeCreate(db *gorm.DB) error { var defaultVar T if base.ID == defaultVar { id, err := gonanoid.New(25) if err != nil { return err } base.ID = T(id) } return nil }