Documentation
¶
Index ¶
- Constants
- Variables
- func Close() error
- func Connect(conf config.DatabaseConfig) (err error)
- func CreateMember(ctx context.Context, member *Member) (err error)
- func CreateProject(ctx context.Context, project *Project) (err error)
- func CreateTenant(ctx context.Context, tenant *Tenant) (err error)
- func CreateTenantProject(ctx context.Context, project *Project) (err error)
- func CreateTopic(ctx context.Context, topic *Topic) (err error)
- func CreateUserResources(ctx context.Context, orgName string, member *Member) (err error)
- func Delete(ctx context.Context, model Model) (err error)
- func DeleteMember(ctx context.Context, orgID, memberID ulid.ULID) (err error)
- func DeleteObjectKey(ctx context.Context, key []byte) (err error)
- func DeleteProject(ctx context.Context, projectID ulid.ULID) (err error)
- func DeleteTenant(ctx context.Context, orgID, tenantID ulid.ULID) (err error)
- func DeleteTopic(ctx context.Context, topicID ulid.ULID) (err error)
- func Get(ctx context.Context, model Model) (err error)
- func GetMock() *mock.RemoteTrtl
- func GetObjectKey(ctx context.Context, objectID ulid.ULID) (key []byte, err error)
- func GetOrgIndex(ctx context.Context, resourceID ulid.ULID) (orgID ulid.ULID, err error)
- func IsConnected() bool
- func IsTesting() bool
- func List(ctx context.Context, prefix, seekKey []byte, namespace string, ...) (cursor *pg.Cursor, err error)
- func Put(ctx context.Context, model Model) (err error)
- func PutObjectKey(ctx context.Context, object Model) (err error)
- func PutOrgIndex(ctx context.Context, resourceID, orgID ulid.ULID) error
- func TimeToString(t time.Time) string
- func UpdateLastLogin(ctx context.Context, accessToken string, login time.Time) (err error)
- func UpdateMember(ctx context.Context, member *Member) (err error)
- func UpdateProject(ctx context.Context, project *Project) (err error)
- func UpdateTenant(ctx context.Context, tenant *Tenant) (err error)
- func UpdateTopic(ctx context.Context, topic *Topic) (err error)
- func VerifyMemberEmail(ctx context.Context, orgID ulid.ULID, email string) (err error)
- func VerifyOrg(ctx context.Context, claimsOrgID, resourceID ulid.ULID) error
- type Key
- type Member
- func GetMemberByEmail(ctx context.Context, orgID ulid.ULID, email string) (member *Member, err error)
- func ListMembers(ctx context.Context, orgID ulid.ULID, c *pg.Cursor) (members []*Member, cursor *pg.Cursor, err error)
- func RetrieveMember(ctx context.Context, orgID, memberID ulid.ULID) (member *Member, err error)
- type MemberStatus
- type Model
- type OnListItem
- type Project
- func (p *Project) Key() (key []byte, err error)
- func (p *Project) MarshalValue() ([]byte, error)
- func (p *Project) Namespace() string
- func (p *Project) Owner(ctx context.Context) (owner *Member, err error)
- func (p *Project) SetOwnerFromClaims(claims *tokens.Claims) (err error)
- func (p *Project) Status() string
- func (p *Project) ToAPI() *api.Project
- func (p *Project) UnmarshalValue(data []byte) error
- func (p *Project) Validate() (err error)
- type Tenant
- type Topic
- type ValidationError
Constants ¶
const ( MembersNamespace = "members" MembersDefaultPageSize = 100 )
const ( ProjectNamespace = "projects" MaxDescriptionLength = 2000 )
const ( ProjectStatusIncomplete = "Incomplete" ProjectStatusActive = "Active" ProjectStatusArchived = "Archived" )
Project states to return to the frontend.
const ( TopicStatusActive = "Active" TopicStatusArchived = "Archived" TopicStatusDeleting = "Deleting" )
Topic states to return to the frontend.
const KeysNamespace = "object_keys"
Keys Namespace maps object IDs to their fully qualified database keys.
const OrganizationNamespace = "organizations"
const TenantNamespace = "tenants"
const TopicNamespace = "topics"
Variables ¶
var ( ErrNotConnected = errors.New("not connected to trtl database") ErrNotFound = errors.New("object not found for the specified key") ErrListBreak = errors.New("on list item has stopped iterating") ErrOrgNotVerified = errors.New("could not verify organization") // Missing fields ErrMissingID = errors.New("object requires id for serialization") ErrMissingOrgID = errors.New("object requires organization id for serialization") ErrMissingTenantID = errors.New("object requires tenant id for serialization") ErrMissingProjectID = errors.New("object requires project id for serialization") ErrMissingMemberEmail = errors.New("member email is required") ErrMissingMemberName = errors.New("member name is required") ErrMissingMemberRole = errors.New("member role is required") ErrMissingMemberStatus = errors.New("member status is required") ErrMissingProjectName = errors.New("project name is required") ErrMissingTenantName = errors.New("tenant name is required") ErrMissingEnvType = errors.New("tenant environment type is required") ErrMissingTopicName = errors.New("topic name is required") ErrMissingPageSize = errors.New("cannot list database without a page size") ErrMissingOwnerID = errors.New("model is missing owner id") // Invalid fields ErrInvalidMemberName = errors.New("invalid member name") ErrUnknownMemberRole = errors.New("unknown member role") ErrInvalidProjectName = errors.New("invalid project name") ErrInvalidTenantName = errors.New("invalid tenant name") ErrInvalidTopicName = errors.New("invalid topic name") // Database state errors ErrMemberExists = errors.New("member already exists") ErrMemberEmailNotFound = errors.New("member does not exist") // Key errors ErrKeyNoID = errors.New("key does not contain an id") ErrKeyWrongSize = errors.New("key is not the correct size") // Max-length errors ErrProjectDescriptionTooLong = errors.New("project description is too long") ErrTopicNameTooLong = errors.New("topic name is too long") )
var ( TopicNameRegex = regexp.MustCompile(`^[a-zA-Z][a-zA-Z0-9\.\_\-]*$`) MaxTopicNameLength = 512 )
Topic names must be URL safe and begin with a letter.
var MemberStatusStrings = map[MemberStatus]string{ MemberStatusPending: "Pending", MemberStatusConfirmed: "Confirmed", }
var NullID = []byte{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
var TenantNameRegex = regexp.MustCompile(`^[a-zA-Z_][a-zA-Z0-9\.\-_]*$`)
Tenant names must be URL safe and begin with a letter.
Functions ¶
func Close ¶
func Close() error
Close the connection to the database, once closed the package must be reconnected otherwise database operations will not succeed. If the database is already closed then no error will occur.
func Connect ¶
func Connect(conf config.DatabaseConfig) (err error)
Connect to the trtl database, this function must be called at least once before any database interaction can occur. Multiple calls to Connect will not error (e.g. if the database is already connected then nothing will happen).
func CreateMember ¶ added in v0.2.0
CreateMember adds a new Member to an organization in the database. Note: If a memberID is not passed in by the User, a new member id will be generated.
func CreateProject ¶ added in v0.2.0
CreateProject adds a new project to an organization in the database. Note: If a project id is not passed in by the User, a new project id will be generated.
func CreateTenant ¶
CreateTenant adds a new project to the database. Note: If a tenant id is not passed in by the User, a new tenant id will be generated.
func CreateTenantProject ¶ added in v0.2.0
CreateTenantProject adds a new project to a tenant in the database. Note: If a project id is not passed in by the User, a new project id will be generated.
func CreateTopic ¶ added in v0.2.0
CreateTopic adds a new topic to the database.
func CreateUserResources ¶ added in v0.3.0
CreateUserResources creates all the necessary database objects for a new user given a partially constructed member model. This method should be called after a new user has been successfully registered with Quarterdeck in order to allow the user to access default resources such as the tenant and user profile info when they login.
func DeleteMember ¶ added in v0.2.0
DeleteMember deletes a member with a given orgID and member ID.
func DeleteObjectKey ¶ added in v0.5.0
Helper to delete an object's key from the database.
func DeleteProject ¶ added in v0.2.0
DeleteProject deletes a project with the given project id.
func DeleteTenant ¶
Delete a tenant from the orgID and tenantID.
func DeleteTopic ¶ added in v0.2.0
DeleteTopic deletes a topic by the given project ID and topic ID.
func GetMock ¶ added in v0.2.0
func GetMock() *mock.RemoteTrtl
func GetObjectKey ¶ added in v0.5.0
Helper to retrieve an object's key from its ID from the database.
func GetOrgIndex ¶ added in v0.5.2
Use the resourceID to retrieve the orgID from the database.
func IsConnected ¶
func IsConnected() bool
IsConnected returns true if the database has been connected to without error and the db module is ready to interact with the trtl database.
func List ¶
func List(ctx context.Context, prefix, seekKey []byte, namespace string, onListItem OnListItem, c *pg.Cursor) (cursor *pg.Cursor, err error)
List retrieves a pagination cursor.
func PutObjectKey ¶ added in v0.5.0
Helper to store an object's key in the database.
func PutOrgIndex ¶ added in v0.5.2
Store the resourceID as a key and the orgID as a value in the database.
func TimeToString ¶ added in v0.5.0
Helper to convert a time.Time to an RFC3339Nano string for JSON serialization.
func UpdateLastLogin ¶ added in v0.7.0
UpdateLastLogin is a helper method that updates the last login time for a member given an access token. This should normally be called in a background task to prevent blocking the user from logging in.
func UpdateMember ¶ added in v0.2.0
UpdateMember updates the record of a member by its id.
func UpdateProject ¶ added in v0.2.0
UpdateProject updates the record of a project from its database model.
func UpdateTopic ¶ added in v0.2.0
UpdateTopic updates the record of a topic from its database model.
func VerifyMemberEmail ¶ added in v0.5.2
Helper method that returns an error if an email address is invalid or already exists in the organization.
Types ¶
type Key ¶ added in v0.5.0
type Key [32]byte
Key is composed of two concatenated IDs. The first 16 bytes are the ID of parent and the second 16 bytes are the ID of the object.
func CreateKey ¶ added in v0.5.0
CreateKey creates a new key from a parent ID and object ID so that callers can lookup the object ID from its namespace.
func (Key) Key ¶ added in v0.5.0
Keys are stored by object ID. Since object IDs are locked monotonically increasing ulids they are guaranteed to be unique.
func (Key) MarshalValue ¶ added in v0.5.0
func (*Key) UnmarshalValue ¶ added in v0.5.0
type Member ¶ added in v0.2.0
type Member struct { OrgID ulid.ULID `msgpack:"org_id"` ID ulid.ULID `msgpack:"id"` Email string `msgpack:"email"` Name string `msgpack:"name"` Role string `msgpack:"role"` Status MemberStatus `msgpack:"status"` Created time.Time `msgpack:"created"` Modified time.Time `msgpack:"modified"` DateAdded time.Time `msgpack:"date_added"` LastActivity time.Time `msgpack:"last_activity"` // contains filtered or unexported fields }
func GetMemberByEmail ¶ added in v0.5.2
func GetMemberByEmail(ctx context.Context, orgID ulid.ULID, email string) (member *Member, err error)
GetMemberByEmail returns a member by the exact email address without any lowercasing validation.
func ListMembers ¶ added in v0.2.0
func ListMembers(ctx context.Context, orgID ulid.ULID, c *pg.Cursor) (members []*Member, cursor *pg.Cursor, err error)
ListMembers retrieves a paginated list of members.
func RetrieveMember ¶ added in v0.2.0
RetrieveMember gets a member from the database with the given orgID and member ID.
func (*Member) Key ¶ added in v0.2.0
Key is a 32 byte composite key combining the org id and member id.
func (*Member) MarshalValue ¶ added in v0.2.0
func (*Member) ToAPI ¶ added in v0.5.0
func (m *Member) ToAPI() *api.Member
Convert the model to an API response
func (*Member) UnmarshalValue ¶ added in v0.2.0
type MemberStatus ¶ added in v0.5.2
type MemberStatus uint8
const ( MemberStatusPending MemberStatus = iota MemberStatusConfirmed )
func (MemberStatus) String ¶ added in v0.5.2
func (m MemberStatus) String() string
type Model ¶
type Model interface { // Handle database storage semantics Key() ([]byte, error) Namespace() string // Handle serialization and deserialization of a single Model MarshalValue() ([]byte, error) UnmarshalValue([]byte) error }
Models are structs that have key-value properties that can used for Get, Put, and Delete operations to the database. The Model interface allows us to unify common interaction patterns (for example checking connections) and returning specific errors as well as ensuring that serialization and deserialization occur correctly.
type OnListItem ¶ added in v0.5.2
type Project ¶ added in v0.2.0
type Project struct { OrgID ulid.ULID `msgpack:"org_id"` TenantID ulid.ULID `msgpack:"tenant_id"` ID ulid.ULID `msgpack:"id"` OwnerID ulid.ULID `msgpack:"owner_id"` Name string `msgpack:"name"` Description string `msgpack:"description"` Archived bool `msgpack:"archived"` APIKeys uint64 `msgpack:"api_keys"` Topics uint64 `msgpack:"topics"` Created time.Time `msgpack:"created"` Modified time.Time `msgpack:"modified"` // contains filtered or unexported fields }
func ListProjects ¶ added in v0.2.0
func ListProjects(ctx context.Context, tenantID ulid.ULID, c *pg.Cursor) (projects []*Project, cursor *pg.Cursor, err error)
ListProjects retrieves a paginated list of projects.
func RetrieveProject ¶ added in v0.2.0
RetrieveProject gets a project from the database with the given project id.
func (*Project) Key ¶ added in v0.2.0
Key is a 32 composite key combining the tenant id and the project id.
func (*Project) MarshalValue ¶ added in v0.2.0
func (*Project) Owner ¶ added in v0.7.0
Owner sets the member info for the owner of the project if it's on the struct, otherwise the member record is fetched from the database and stored on the struct.
func (*Project) SetOwnerFromClaims ¶ added in v0.7.0
SetOwnerFromClaims sets the owner of the project based on the user's claims. This should only be called when the owner ID is not already on the struct (e.g. when creating new project models). If the owner data just needs to be populated then the Owner() method should be used instead.
func (*Project) Status ¶ added in v0.7.0
Status returns the status of a project based on the number of API keys and topics
func (*Project) ToAPI ¶ added in v0.5.0
func (p *Project) ToAPI() *api.Project
Convert the model to an API response for create and update requests.
func (*Project) UnmarshalValue ¶ added in v0.2.0
type Tenant ¶
type Tenant struct { OrgID ulid.ULID `msgpack:"org_id"` ID ulid.ULID `msgpack:"id"` Name string `msgpack:"name"` EnvironmentType string `msgpack:"environment_type"` Created time.Time `msgpack:"created"` Modified time.Time `msgpack:"modified"` }
func ListTenants ¶ added in v0.2.0
func ListTenants(ctx context.Context, orgID ulid.ULID, c *pg.Cursor) (tenants []*Tenant, cursor *pg.Cursor, err error)
ListTenants retrieves a paginated list of tenants.
func RetrieveTenant ¶
Retrieve a tenant from the orgID and tenantID.
func (*Tenant) MarshalValue ¶
func (*Tenant) ToAPI ¶ added in v0.5.0
func (t *Tenant) ToAPI() *api.Tenant
Convert the model to an API response.
func (*Tenant) UnmarshalValue ¶
type Topic ¶ added in v0.2.0
type Topic struct { OrgID ulid.ULID `msgpack:"org_id"` ProjectID ulid.ULID `msgpack:"project_id"` ID ulid.ULID `msgpack:"id"` Name string `msgpack:"name"` State pb.TopicTombstone_Status `msgpack:"state"` ConfirmDeleteToken string `msgpack:"confirm_delete_token"` Created time.Time `msgpack:"created"` Modified time.Time `msgpack:"modified"` }
func ListTopics ¶ added in v0.2.0
func ListTopics(ctx context.Context, projectID ulid.ULID, c *pg.Cursor) (topics []*Topic, cursor *pg.Cursor, err error)
ListTopics retrieves a paginated list of topics.
func RetrieveTopic ¶ added in v0.2.0
RetrieveTopic gets a topic from the database by the given topic ID.
func (*Topic) Key ¶ added in v0.2.0
Key is a 32 composite key combining the project ID and the topic ID.
func (*Topic) MarshalValue ¶ added in v0.2.0
func (*Topic) Status ¶ added in v0.7.0
Status returns a human readable status string based on the internal state.
func (*Topic) ToAPI ¶ added in v0.5.0
func (t *Topic) ToAPI() *api.Topic
Convert the model to an API response.
func (*Topic) UnmarshalValue ¶ added in v0.2.0
type ValidationError ¶ added in v0.3.0
type ValidationError struct {
// contains filtered or unexported fields
}
func (*ValidationError) Error ¶ added in v0.7.0
func (e *ValidationError) Error() string
func (*ValidationError) Is ¶ added in v0.7.0
func (e *ValidationError) Is(target error) bool
func (*ValidationError) Unwrap ¶ added in v0.7.0
func (e *ValidationError) Unwrap() error