package domain import ( "github.com/google/uuid" "go.mongodb.org/mongo-driver/v2/bson" ) type UUID uuid.NullUUID func (u *UUID) IsZero() bool { return !u.Valid } func (u *UUID) MarshalBSONValue() (byte, []byte, error) { if !u.Valid { return byte(bson.TypeString), nil, nil } metaLen := 4 uuidWithEndLen := 37 b := make([]byte, 0, metaLen+uuidWithEndLen) b = append(b, byte(uuidWithEndLen), 0, 0, 0) b = append(b, u.UUID.String()...) b = append(b, 0) return byte(bson.TypeString), b, nil } func (u *UUID) UnmarshalBSONValue(_ byte, data []byte) error { if len(data) == 0 { u.Valid = false return nil } parsed, err := uuid.ParseBytes(data[4:40]) // Удаляем метаданные строки - 4 байта длины в начале и байт конца строки в конце if err != nil { u.Valid = false return err } u.UUID = parsed u.Valid = true return nil } func (u *UUID) String() string { if !u.Valid { return "" } return u.UUID.String() } func GenerateUUID() UUID { return UUID( uuid.NullUUID{ UUID: uuid.New(), Valid: true, }, ) } func GenerateTestUUID() UUID { return UUID( uuid.NullUUID{ UUID: uuid.MustParse("5c94e2c5-7615-4fdc-a2e2-00f71ae1e380"), Valid: true, }, ) }