Quden データモデルの概要
コレは何?
toruca で利用するデータモデル・データスキーマを整理するドキュメントです。原則としてここにある情報が優先されます。
データモデルの一覧
これから検討予定
- (TBD) Subscription
- (TBD) WorkspacePlan
- (TBD) WorkspaceBill
- (TBD) SubscriptionLog
すべて MongoDB 内にデータは格納する。また、原則として全てのデータスキーマには以下の prop が挿入される。
_id: ObjectId- MongoDB の id 採番
createdAt: Date- ドキュメントの作成日時
updatedAt: Date- ドキュメントの更新日時
User
plain
User
- 更新: 2023年5月17日
--------------
- email: string ユーザーメールアドレス
- emailToUpdate: string ユーザーメールアドレス更新時に利用する一時フィールド
- name: string ユーザー名
- googleUniqueId: string Google ログインで利用するフィールド
- profileImageUrl: string プロフィール画像 URL
- isEmailVerified: boolean メールアドレス検証済みフラグ
- isTmpCreated: boolean 一時フィールド
- shareTargetParent: ShareTargetParent
- favoritedItems: Item[] お気に入りに追加したアイテムリスト
- mailNotificationSettingMap: object メール通知設定
- recordCount: number クリップ作成数カウント
- zoomConfig: ZoomConfigMap zoom 連携関連設定
- preferredLanguage: UserLanguage 優先言語
- jobKind: string 職種WorkspaceUser
plain
WorkspaceUser
--------------
- user: User
- workspace: Workspace
- role: "ADMIN" | "MEMBER" | "GUEST"Workspace
plain
Workspace
- 更新: 2023年5月17日
--------------
- name: string ワークスペース名
- createdBy: User ユーザーオブジェクト
- shareTargetParent: ShareTargetParent
- webhookUrlMap: { slack: string } Workspace 設定内の webhook 情報
- notificationSettingMap: { slack: { recordCompleted: boolean } } 通知関連設定
- deletedAt: Date ワークスペース削除日時WorkspaceInvitation
plain
WorkspaceInvitation
--------------
- expiredAt: Date
- workspace: Workspace
- createdBy: User
- invitationType: "EMAIL" | "LINK"
- invitedMembers: { role: "ADMIN" | "MEMBER" | "GUEST", email: string }[]
- isDeleted: booleanItem
plain
Item
- クリップデータ
- 更新: 2023年5月17日
------------------------
- createdBy: User 作成者ユーザー
- owner: User オーナーユーザー(現時点では作成者ユーザーと同義です)
- type: "VIDEO" | "STEP_GUIDE" アイテムのタイプ
- title: string クリップのタイトル
- durationSec: number クリップの長さ
- description: string 概要欄テキスト
- chapters: ChapterItem[] チャプター情報
- tags: ItemTag[] タグ情報
- reactions: ItemReactions[] リアクション情報
- parentItem: Item 親アイテム(現在未使用)
- objectKey: string データパス
- thumbnailObjectKey: string サムネイルデータパス
- gifThumbnailObjectKey: string GIFサムネイルデータパス
- mp4ObjectKey: string MP4 ファイルデータパス
- channelType: "MY" | "TEAM" (現在未使用)
- uploadType: "QUDEN" | "SELF" | "ZOOM" アップロード元情報。
- QUDEN = 拡張機能経由, SELF = MP4 アップロード経由, ZOOM = ZOOM 連携経由
- workspace: Workspace アイテムが保存されているワークスペースオブジェクト
- isPublic: boolean 公開フラグ
- permissions: ItemPermission[] アイテムにアクセスできる対象を管理するデータモデル
- viewCount: number 視聴回数
- password: string (hashed) クリップパスワード
- deletedAt: Date ゴミ箱追加日時
- deletedCompletelyAt: Date 完全削除日時
- dueAt: Date 視聴期限日時
- isDueAllDay: boolean 視聴期限が終日かどうかフラグ
- viewStatus: ViewStatus[] 視聴ステータス情報
- detailConfigMap: object その他詳細設定情報
- trimJob: Job トリムジョブ情報
- stepGuideEditJob: Job ステップガイド編集ジョブ情報
- originalDetail: OriginalDetail 元データ情報
- downloadableStatus: DownloadableStatus ダウンロード可否ステータス
- isFormatedFullMp4Ready: boolean フォーマット化済みMP4が利用可能か示すフラグ
- gifThumbnailStatus: GifThumbnailStatus GIF サムネイル作成ステータス
- steps: StepItem[] ステップガイドの各ステップ情報
- drawnSteps: StepItem[] 描画済みステップ情報
- stepGuideStatus: StepGuideStatus ステップガイド作成ステータス
- captions: ItemCaption 文字起こし情報ItemPermission
plain
ItemPermission
:アイテムに対する権限を管理するテーブル
------------------------
- shareTargetType: "WORKSPACE" | "USER" (| "TEAM" | "GROUP")
- shareTarget: ShareTargetParent
- permission: "CAN_EDIT" | "CAN_VIEW" | "BLOCKED"ItemTag
plain
ItemTag
:アイテムに付けるタグを管理するコレクション
------------------------
- name: string
- bgColorName: string
- workspace: WorkspaceItemReaction
plain
ItemReaction
:Item に対するリアクション
------------------------
- createdBy: User
- timeSec: number
- reactionName: ReactionNameShareTargetParent
plain
ShareTargetParent
:共有ターゲットの親テーブル(ポリモーフィック関連対策)
:Workspace や User エンティティにも shareTargetParentId を追加する必要がある
------------------------
- idViewHistory
plain
ViewHistory
:閲覧履歴
------------------------
- item: Item
- user: User
- anonymousId: stringViewStatus
plain
ViewStatus
:視聴ステータス
:Item スキーマのサブドキュメントとして使用する
------------------------
- user: User
- status: "OK" | "WATCH_LATER" | "VIEWING"Comment
plain
Comment
:Item に対するコメント
------------------------
- type: "RECORDING" (録画中) | "VIEWING" (視聴時)| "REPLY"(返信)
- createdBy: User
- item: Item
- comment: string
- timeSec: number
- parentComment: Comment
- repliedComments: Comment[]
- likedBy: User[]UserVerification
plain
UserVerification
:Email 検証に用いるトークンを管理するコレクション
------------------------
- token: string
- user: User
- type: "verifyEmai" | "updateEmail"Notification
plain
Notification
:通知を管理するコレクション
------------------------
- to: User[]
- readBy: User[]
- item: Item
- workspace: Workspace
- content: Content (src/notifications/templates/index.ts 内でテンプレート化)
- type: NotificationType
- variables: NotificationVariableMap
- isDeleted: booleanBilling
plain
Billing
:請求関連のデータを管理する
------------------------
- updatedBy: User
- workspace: Workspace
- customerId: string // stripe のカスタマーID
- subscriptoinId: string // stripe のサブスクID
- productIds: string[]
- subscription_end_date: DateChannel
plain
Channel
:チャンネルを管理するコレクション
------------------------
- createdBy: User
- name: string
- description: string
- pinnedNumber: number
- permissions: ItemPermission[]
- shareTargetParent: ShareTargetParent
- workspace: Workspace
- isItemPublic: boolean // チャンネル内アイテムの公開設定。true の場合、チャンネル内のアイテムは全て公開される
- isPrivateChannel: boolean
- notificationSettings: { userId: Settings }
- deletedAt: Date
- archivedAt: Date
- createdAt: Date
- updatedAt: Date
- slack: { token, channels }Ref:
ChannelOrder
plain
Channel
:チャンネルを管理するコレクション
------------------------
- user: User
- workspace: Workspace
- orders: Channel[]その他リソース
toruca: development, Online Whiteboard for Visual Collaboration
- データモデルの概略図(ER図っぽいやつ)を作っています(随時更新)
- 2021/08/11 現在、更新滞っている
Issues · zipunk/toruca-backend-core
- データモデルやビジネスロジックの議論をする場です
補足
ShareTargetParent について
ShareTargetParent は、Workspace や User といった Item の共有対象となりうる Entity を並列に扱うための概念です。
技術的用語を用いて説明すると、ポリモーフィック関連を回避するためのデータ設計手法の1つにあたります。詳しくは↓のスレッドで議論されているので興味がある方は御覧ください。