Skip to content

Data Model & Entity Relationships

Entity Hierarchy

User
 └── ArtistSpace (owns)
      └── Project (contains)
           └── Track (contains)
                └── File (versions)
                     └── Comment (feedback)

Core Entities

User

The authenticated individual using the platform.

FieldTypeDescription
_idObjectIdPrimary key
emailStringUnique, required
usernameStringDisplay name
passwordStringHashed
imageStringProfile picture URL (CDN)
profilePictureStringLegacy field
subscriptionRef → SubscriptionCurrent plan
authMethodEnumemail, google, apple
isVerifiedBooleanEmail verified
createdAtDateRegistration date
updatedAtDateLast modification

ArtistSpace

Top-level container representing an artist, band, or label.

FieldTypeDescription
_idObjectIdPrimary key
shortIdStringAuto-generated 6-char identifier (nanoid)
slugStringUser-customizable URL slug (premium)
slugTypeEnumauto or premium
nameStringArtist/band name
imageStringArtist image (CDN)
ownerRef → UserCreator
collaboratorsArray[{userId, role, addedAt}]
projectsRef[] → ProjectChild projects
createdAtDate
updatedAtDate

Project

Album, EP, single, or creative project.

FieldTypeDescription
_idObjectIdPrimary key
shortIdStringAuto-generated 6-char identifier (nanoid)
slugStringUser-customizable URL slug (premium)
slugTypeEnumauto or premium
nameStringProject title
imageStringCover art (CDN)
descriptionStringOptional notes
artistSpaceRef → ArtistSpaceParent
ownerRef → UserCreator
collaboratorsArray[{userId, role}]
tracksRef[] → TrackChild tracks
statusEnumdraft, in_progress, review, completed
createdAtDate
updatedAtDate

Track

Individual song with multiple file versions.

FieldTypeDescription
_idObjectIdPrimary key
shortIdStringAuto-generated 6-char identifier (nanoid)
slugStringUser-customizable URL slug (premium)
slugTypeEnumauto or premium
titleStringSong title
projectRef → ProjectParent
artistSpaceRef → ArtistSpaceGrandparent
ownerRef → UserCreator
collaboratorsArray[{userId, role}]
filesRef[] → FileVersion history
latestFileRef → FileCurrent version
statusEnumdraft, review, approved, published
isPublicBooleanShareable via link
createdAtDate
updatedAtDate

File

Versioned audio/image asset.

FieldTypeDescription
_idObjectIdPrimary key
nameStringOriginal filename
blobUrlStringAzure Blob Storage URL
thumbnailUrlStringImage thumb (CDN)
mediumUrlStringImage medium (CDN)
typeEnumaudio, image, video, document
contentTypeStringMIME type
sizeNumberBytes
versionNumberAuto-increment per track
isFinalVersionBooleanApproved version
ownerRef → UserUploader
artistSpaceStringParent ID
projectStringParent ID
trackStringParent ID
commentsRef[] → CommentAttached feedback
metadataObjectDuration, waveform, etc.
createdAtDate

Comment

Time-synced feedback on audio/video.

FieldTypeDescription
_idObjectIdPrimary key
contentStringComment text
ownerRef → UserAuthor
fileRef → FileAttached to
trackRef → TrackParent track
timeStartNumberSeconds (audio position)
timeEndNumberSeconds (range end)
isResolvedBooleanMarked complete
likesObjectId[]User IDs who liked
responsesRef[] → CommentReplies
createdAtDate

Notification

In-app alerts.

FieldTypeDescription
_idObjectIdPrimary key
senderRef → UserWho triggered
recipientRef → UserWho receives
titleStringMessage text
typeEnumSee NotificationEvents
slugStringDeep link URL
pointerIdStringRelated entity ID
imgStringThumbnail
isReadBooleanRead status
createdAtDate

Subscription

User billing tier.

FieldTypeDescription
_idObjectIdPrimary key
userRef → UserSubscriber
planEnumfree, pro, team, enterprise
storageObject{used, limit} in bytes
statusEnumactive, cancelled, past_due
billingCycleEnummonthly, yearly
currentPeriodEndDateNext billing
createdAtDate

Shareable collaboration invite.

FieldTypeDescription
_idObjectIdPrimary key
ownerRef → UserCreator
resourceIdObjectIdTarget entity
resourceTypeEnumartistSpace, project, track
roleEnumadmin, editor, viewer
shortCodeStringURL slug
expiresAtDateOptional expiry
usedByRef[] → UserWho joined
createdAtDate

Enums

Role

typescript
enum Role {
  OWNER = 'owner',
  ADMIN = 'admin',
  EDITOR = 'editor',
  VIEWER = 'viewer',
}

FileType

typescript
enum FileType {
  AUDIO = 'audio',
  IMAGE = 'image',
  VIDEO = 'video',
  DOCUMENT = 'document',
}

NotificationEvents

typescript
enum NotificationEvents {
  NEW_COMMENT_CREATED = 'newCommentCreated',
  RESPONSE_TO_COMMENT = 'responseToComment',
  LIKE_TO_COMMENT = 'likeToComment',
  COMMENT_COMPLETED = 'commentCompleted',
  NEW_INVITE = 'newInvite',
  INVITE_ACCEPTED = 'inviteAccepted',
  COLLABORATOR_REMOVED = 'collaboratorRemoved',
  FILE_UPLOADED = 'fileUploaded',
  VERSION_APPROVED = 'versionApproved',
}

Entity Relationship Diagram

mermaid
erDiagram
    User ||--o{ ArtistSpace : owns
    User ||--o{ Subscription : has
    User ||--o{ Notification : receives
    
    ArtistSpace ||--o{ Project : contains
    ArtistSpace ||--o{ Collaborator : has
    
    Project ||--o{ Track : contains
    Project ||--o{ Collaborator : has
    
    Track ||--o{ File : versions
    Track ||--o{ Collaborator : has
    
    File ||--o{ Comment : has
    
    Comment ||--o{ Comment : replies
    
    Link }o--|| ArtistSpace : targets
    Link }o--|| Project : targets
    Link }o--|| Track : targets

Access Control Matrix

ActorArtistSpaceProjectTrackFileComment
OwnerCRUDCRUDCRUDCRUDCRUD
AdminRUCRUDCRUDCRUDCRUD
EditorRRRUCRUCRUD
ViewerRRRRCR

C=Create, R=Read, U=Update, D=Delete


Future Entities (Roadmap)

TimeLog

Creator work session tracking.

FieldTypeDescription
userRef → UserWho worked
resourceObjectIdTrack/Project
resourceTypeEnumtrack, project
startTimeDateSession start
endTimeDateSession end
durationNumberMinutes
descriptionStringWork notes

Contract

Agreement between collaborators.

FieldTypeDescription
partiesRef[] → UserSignatories
resourceObjectIdRelated project/track
typeEnumsplit, work_for_hire, license
termsObjectContract details
statusEnumdraft, pending, signed, expired
signaturesArray[{userId, signedAt}]

RoyaltySplit

Revenue distribution agreement.

FieldTypeDescription
trackRef → TrackRelated track
splitsArray[{userId, percentage, type}]
effectiveDateDateWhen splits apply

Ctrl-Audio Platform Documentation