package domain import ( "context" "time" "github.com/zitadel/zitadel/backend/v3/storage/database" ) //go:generate enumer -type AdministratorScope -transform snake -trimprefix AdministratorScope -sql type AdministratorScope uint8 const ( AdministratorScopeInstance AdministratorScope = iota AdministratorScopeOrganization AdministratorScopeProject AdministratorScopeProjectGrant ) type Administrator struct { // ID is generated by the storage layer during creation and any value // provided by the caller is ignored. The domain package must not // generate this value. The format is storage-specific, for example // PostgreSQL uses `::`. ID string `json:"id,omitempty" db:"id"` InstanceID string `json:"instanceId,omitempty" db:"instance_id"` UserID string `json:"userId,omitempty" db:"user_id"` Scope AdministratorScope `json:"scope,omitempty" db:"scope"` OrganizationID *string `json:"organizationId,omitempty" db:"organization_id"` ProjectID *string `json:"projectId,omitempty" db:"project_id"` ProjectGrantID *string `json:"projectGrantId,omitempty" db:"project_grant_id"` CreatedAt time.Time `json:"createdAt,omitempty" db:"created_at"` UpdatedAt time.Time `json:"updatedAt,omitempty" db:"updated_at"` Roles []string `json:"roles,omitempty" db:"roles"` } type administratorColumns interface { PrimaryKeyColumns() []database.Column IDColumn() database.Column InstanceIDColumn() database.Column UserIDColumn() database.Column ScopeColumn() database.Column OrganizationIDColumn() database.Column ProjectIDColumn() database.Column ProjectGrantIDColumn() database.Column CreatedAtColumn() database.Column UpdatedAtColumn() database.Column } type administratorConditions interface { PrimaryKeyCondition(instanceID, administratorID string) database.Condition IDCondition(administratorID string) database.Condition InstanceIDCondition(instanceID string) database.Condition UserIDCondition(userID string) database.Condition ScopeCondition(scope AdministratorScope) database.Condition InstanceAdministratorCondition(instanceID, userID string) database.Condition OrganizationAdministratorCondition(instanceID, organizationID, userID string) database.Condition ProjectAdministratorCondition(instanceID, projectID, userID string) database.Condition ProjectGrantAdministratorCondition(instanceID, projectGrantID, userID string) database.Condition OrganizationIDCondition(organizationID string) database.Condition ProjectIDCondition(projectID string) database.Condition ProjectGrantIDCondition(projectGrantID string) database.Condition RoleCondition(op database.TextOperation, role string) database.Condition } type administratorChanges interface { SetUpdatedAt(updatedAt time.Time) database.Change // AddRole adds the specified role to the administrator. // If the administrator already has the role, no change will be made. AddRole(role string) database.Change // RemoveRole removes the specified role from the administrator. // If the administrator does not have the role, no change will be made. RemoveRole(role string) database.Change // SetRoles replaces all existing roles with the provided ones. // If no roles are provided, all existing roles will be removed. SetRoles(roles []string) database.Change } //go:generate mockgen -typed -package domainmock -destination ./mock/administrator.mock.go . AdministratorRepository type AdministratorRepository interface { Repository administratorColumns administratorConditions administratorChanges Get(ctx context.Context, client database.QueryExecutor, opts ...database.QueryOption) (*Administrator, error) List(ctx context.Context, client database.QueryExecutor, opts ...database.QueryOption) ([]*Administrator, error) Create(ctx context.Context, client database.QueryExecutor, administrator *Administrator) error Update(ctx context.Context, client database.QueryExecutor, condition database.Condition, changes ...database.Change) (int64, error) Delete(ctx context.Context, client database.QueryExecutor, condition database.Condition) (int64, error) }