You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
126 lines
3.0 KiB
126 lines
3.0 KiB
package common
|
|
|
|
import (
|
|
"database/sql/driver"
|
|
"time"
|
|
|
|
"github.com/google/uuid"
|
|
"gorm.io/gorm"
|
|
)
|
|
|
|
type UsernameContextKey string
|
|
|
|
// GUID -> new datatype
|
|
type GUID uuid.UUID
|
|
|
|
// StringToGUID -> parse string to GUID
|
|
func StringToGUID(s string) (GUID, error) {
|
|
id, err := uuid.Parse(s)
|
|
return GUID(id), err
|
|
}
|
|
|
|
// String -> String Representation of Binary16
|
|
func (guid GUID) String() string {
|
|
return uuid.UUID(guid).String()
|
|
}
|
|
|
|
// GormDataType -> sets type to binary(16)
|
|
func (guid GUID) GormDataType() string {
|
|
return "binary(16)"
|
|
}
|
|
|
|
func (guid GUID) MarshalJSON() ([]byte, error) {
|
|
s := uuid.UUID(guid)
|
|
str := "\"" + s.String() + "\""
|
|
return []byte(str), nil
|
|
}
|
|
|
|
func (guid *GUID) UnmarshalJSON(by []byte) error {
|
|
s, err := uuid.ParseBytes(by)
|
|
*guid = GUID(s)
|
|
return err
|
|
}
|
|
|
|
// Scan --> tells GORM how to receive from the database
|
|
func (guid *GUID) Scan(value interface{}) error {
|
|
bytes, _ := value.([]byte)
|
|
parseByte, err := uuid.FromBytes(bytes)
|
|
*guid = GUID(parseByte)
|
|
return err
|
|
}
|
|
|
|
// Value -> tells GORM how to save into the database
|
|
func (guid GUID) Value() (driver.Value, error) {
|
|
return uuid.UUID(guid).MarshalBinary()
|
|
}
|
|
|
|
type BasicFields struct {
|
|
CreatedAt time.Time `gorm:"column:created_at" json:"created_at"`
|
|
CreatedByDB GUID `gorm:"column:created_by" json:"-"`
|
|
CreatedByJSON string `gorm:"-" json:"created_by"`
|
|
UpdatedAt time.Time `gorm:"column:updated_at" json:"updated_at"`
|
|
UpdatedByDB GUID `gorm:"column:updated_by" json:"-"`
|
|
UpdatedByJSON string `gorm:"-" json:"updated_by"`
|
|
DeletedAtDB gorm.DeletedAt `gorm:"column:deleted_at" json:"-"`
|
|
DeletedAtJSON *time.Time `gorm:"-" json:"deleted_at,omitempty"`
|
|
DeletedBy string `gorm:"column:deleted_by" json:"deleted_by,omitempty"`
|
|
}
|
|
|
|
func (basicFields *BasicFields) BeforeCreate(tx *gorm.DB) error {
|
|
if userID, ok := tx.Get("userID"); ok {
|
|
if guid, ok := userID.(GUID); ok {
|
|
basicFields.CreatedByDB = guid
|
|
basicFields.UpdatedByDB = guid
|
|
}
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (basicFields *BasicFields) AfterCreate(tx *gorm.DB) error {
|
|
if username, ok := tx.Get("username"); ok {
|
|
if name, ok := username.(string); ok {
|
|
basicFields.CreatedByJSON = name
|
|
basicFields.UpdatedByJSON = name
|
|
}
|
|
}
|
|
return nil
|
|
}
|
|
|
|
type GUIDPKicPK struct {
|
|
ID uint64 `gorm:"primaryKey;column:id" json:"id"`
|
|
BasicFields
|
|
}
|
|
|
|
type ModelGUIDPK struct {
|
|
ID GUID `gorm:"primaryKey;column:id" json:"id"`
|
|
BasicFields
|
|
}
|
|
|
|
func (guidPK *ModelGUIDPK) BeforeCreate(tx *gorm.DB) error {
|
|
id, err := uuid.NewRandom()
|
|
guidPK.ID = GUID(id)
|
|
if userID, ok := tx.Get("userID"); ok {
|
|
if guid, ok := userID.(GUID); ok {
|
|
guidPK.CreatedByDB = guid
|
|
guidPK.UpdatedByDB = guid
|
|
}
|
|
}
|
|
return err
|
|
}
|
|
|
|
type ModelHiddenGUIDPK struct {
|
|
ID GUID `gorm:"primaryKey;column:id" json:"-"`
|
|
BasicFields
|
|
}
|
|
|
|
func (guidPK *ModelHiddenGUIDPK) BeforeCreate(tx *gorm.DB) error {
|
|
id, err := uuid.NewRandom()
|
|
guidPK.ID = GUID(id)
|
|
if userID, ok := tx.Get("userID"); ok {
|
|
if guid, ok := userID.(GUID); ok {
|
|
guidPK.CreatedByDB = guid
|
|
guidPK.UpdatedByDB = guid
|
|
}
|
|
}
|
|
return err
|
|
}
|