feat: Refactor DTOs to use types.ULID and update companyId fields to be optional

This commit is contained in:
2025-03-12 09:32:29 +00:00
parent 233f3cdb5c
commit 4170eb5fbd
21 changed files with 269 additions and 264 deletions
+77
View File
@@ -0,0 +1,77 @@
package types
import (
"context"
"database/sql/driver"
"fmt"
"github.com/oklog/ulid/v2"
"gorm.io/gorm"
"gorm.io/gorm/clause"
)
// ULID wraps ulid.ULID to make it work nicely with GORM
type ULID struct {
ulid.ULID
}
// NewULIDWrapper creates a new ULID with a new ULID
func NewULIDWrapper() ULID {
return ULID{ULID: ulid.Make()}
}
// FromULID creates a ULID from a ulid.ULID
func FromULID(id ulid.ULID) ULID {
return ULID{ULID: id}
}
// ULIDWrapperFromString creates a ULID from a string
func ULIDFromString(id string) (ULID, error) {
parsed, err := ulid.Parse(id)
if err != nil {
return ULID{}, fmt.Errorf("failed to parse ULID string: %w", err)
}
return ULID{ULID: parsed}, nil
}
// Scan implements the sql.Scanner interface for ULID
func (u *ULID) Scan(src any) error {
switch v := src.(type) {
case []byte:
// If it's exactly 16 bytes, it's the binary representation
if len(v) == 16 {
copy(u.ULID[:], v)
return nil
}
// Otherwise, try as string
return fmt.Errorf("cannot scan []byte of length %d into ULID", len(v))
case string:
parsed, err := ulid.Parse(v)
if err != nil {
return fmt.Errorf("failed to parse ULID: %w", err)
}
u.ULID = parsed
return nil
default:
return fmt.Errorf("cannot scan %T into ULID", src)
}
}
// Value implements the driver.Valuer interface for ULID
// Returns the binary representation of the ULID for maximum efficiency
func (u ULID) Value() (driver.Value, error) {
return u.ULID.Bytes(), nil
}
// GormValue implements the gorm.Valuer interface for ULID
func (u ULID) GormValue(ctx context.Context, db *gorm.DB) clause.Expr {
return clause.Expr{
SQL: "?",
Vars: []any{u.Bytes()},
}
}
// Compare implements comparison for ULID
func (u ULID) Compare(other ULID) int {
return u.ULID.Compare(other.ULID)
}