| package models |
|
|
| import ( |
| "errors" |
| "fmt" |
| "time" |
|
|
| "github.com/openmeterio/openmeter/pkg/clock" |
| "github.com/openmeterio/openmeter/pkg/equal" |
| ) |
|
|
| type ManagedUniqueResource struct { |
| NamespacedModel `json:",inline" mapstructure:",squash"` |
| ManagedModel `json:",inline" mapstructure:",squash"` |
|
|
| |
| ID string `json:"id"` |
|
|
| |
| Key string `json:"key"` |
| } |
|
|
| type ManagedResource struct { |
| NamespacedModel `json:",inline" mapstructure:",squash"` |
| ManagedModel `json:",inline" mapstructure:",squash"` |
|
|
| |
| ID string `json:"id"` |
| Description *string `json:"description,omitempty"` |
| Name string `json:"name"` |
| } |
|
|
| func (m ManagedResource) GetID() string { |
| return m.ID |
| } |
|
|
| func (m ManagedResource) GetDescription() *string { |
| return m.Description |
| } |
|
|
| func (m ManagedResource) GetName() string { |
| return m.Name |
| } |
|
|
| type ManagedResourceInput struct { |
| ID string |
| Namespace string |
| CreatedAt time.Time |
| UpdatedAt time.Time |
| DeletedAt *time.Time |
| Name string |
| Description *string |
| } |
|
|
| func (r ManagedResourceInput) Validate() error { |
| if r.ID == "" { |
| return errors.New("id is required") |
| } |
|
|
| if r.Namespace == "" { |
| return errors.New("namespace is required") |
| } |
|
|
| if r.CreatedAt.IsZero() { |
| return errors.New("created at is required") |
| } |
|
|
| if r.UpdatedAt.IsZero() { |
| return errors.New("updated at is required") |
| } |
|
|
| return nil |
| } |
|
|
| func NewManagedResource(input ManagedResourceInput) ManagedResource { |
| return ManagedResource{ |
| ID: input.ID, |
| NamespacedModel: NamespacedModel{ |
| Namespace: input.Namespace, |
| }, |
| ManagedModel: ManagedModel{ |
| CreatedAt: input.CreatedAt.UTC(), |
| UpdatedAt: input.UpdatedAt.UTC(), |
| DeletedAt: func() *time.Time { |
| if input.DeletedAt == nil { |
| return nil |
| } |
|
|
| deletedAt := input.DeletedAt.UTC() |
|
|
| return &deletedAt |
| }(), |
| }, |
| Name: input.Name, |
| Description: input.Description, |
| } |
| } |
|
|
| func (r ManagedResource) Validate() error { |
| if err := r.NamespacedModel.Validate(); err != nil { |
| return fmt.Errorf("error validating namespaced model: %w", err) |
| } |
|
|
| if err := r.ManagedModel.Validate(); err != nil { |
| return fmt.Errorf("error validating managed model: %w", err) |
| } |
|
|
| if r.ID == "" { |
| return errors.New("id is required") |
| } |
|
|
| if r.Name == "" { |
| return errors.New("name is required") |
| } |
|
|
| return nil |
| } |
|
|
| type ManagedModel struct { |
| CreatedAt time.Time `json:"createdAt"` |
| |
| UpdatedAt time.Time `json:"updatedAt"` |
| |
| DeletedAt *time.Time `json:"deletedAt,omitempty"` |
| } |
|
|
| func (m ManagedModel) Validate() error { |
| if m.CreatedAt.IsZero() { |
| return errors.New("created at is required") |
| } |
|
|
| if m.UpdatedAt.IsZero() { |
| return errors.New("updated at is required") |
| } |
|
|
| return nil |
| } |
|
|
| func (m ManagedModel) IsDeleted() bool { |
| return m.IsDeletedAt(clock.Now()) |
| } |
|
|
| func (m ManagedModel) IsDeletedAt(t time.Time) bool { |
| if m.DeletedAt == nil { |
| return false |
| } |
|
|
| return !m.DeletedAt.After(t) |
| } |
|
|
| func (m ManagedModel) Equal(other ManagedModel) bool { |
| if !m.CreatedAt.Equal(other.CreatedAt) { |
| return false |
| } |
|
|
| if !m.UpdatedAt.Equal(other.UpdatedAt) { |
| return false |
| } |
|
|
| if !equal.PtrEqual(m.DeletedAt, other.DeletedAt) { |
| return false |
| } |
|
|
| return true |
| } |
|
|
| func (m ManagedModel) GetCreatedAt() time.Time { |
| return m.CreatedAt |
| } |
|
|
| func (m ManagedModel) GetUpdatedAt() time.Time { |
| return m.UpdatedAt |
| } |
|
|
| func (m ManagedModel) GetDeletedAt() *time.Time { |
| return m.DeletedAt |
| } |
|
|
| type ManagedModelWithID struct { |
| ManagedModel `json:",inline" mapstructure:",squash"` |
| ID string `json:"id"` |
| } |
|
|
| func (m ManagedModelWithID) GetID() string { |
| return m.ID |
| } |
|
|
| func (m ManagedModelWithID) Equal(other ManagedModelWithID) bool { |
| if m.ID != other.ID { |
| return false |
| } |
|
|
| return m.ManagedModel.Equal(other.ManagedModel) |
| } |
|
|
| func (m ManagedModelWithID) Validate() error { |
| if m.ID == "" { |
| return errors.New("id is required") |
| } |
|
|
| return nil |
| } |
|
|
| type NamespacedModel struct { |
| Namespace string `json:"namespace"` |
| } |
|
|
| func (m NamespacedModel) Validate() error { |
| if m.Namespace == "" { |
| return errors.New("namespace is required") |
| } |
|
|
| return nil |
| } |
|
|
| func (m NamespacedModel) GetNamespace() string { |
| return m.Namespace |
| } |
|
|
| type Address struct { |
| Country *CountryCode `json:"country,omitempty"` |
| PostalCode *string `json:"postalCode,omitempty"` |
| State *string `json:"state,omitempty"` |
| City *string `json:"city,omitempty"` |
| Line1 *string `json:"line1,omitempty"` |
| Line2 *string `json:"line2,omitempty"` |
| PhoneNumber *string `json:"phoneNumber,omitempty"` |
| } |
|
|
| |
| type CountryCode string |
|
|
| |
| |
| type VersionedModel struct { |
| |
| |
| Key string `json:"key,omitempty"` |
| |
| Version int `json:"version,omitempty"` |
| } |
|
|