Skip to content

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: boolean

Item

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: Workspace

ItemReaction

plain
ItemReaction
:Item に対するリアクション
------------------------
- createdBy: User
- timeSec: number
- reactionName: ReactionName

ShareTargetParent

plain
ShareTargetParent
:共有ターゲットの親テーブル(ポリモーフィック関連対策)
:Workspace や User エンティティにも shareTargetParentId を追加する必要がある
------------------------
- id

ViewHistory

plain
ViewHistory
:閲覧履歴
------------------------
- item: Item
- user: User
- anonymousId: string

ViewStatus

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: boolean

Billing

plain
Billing
:請求関連のデータを管理する
------------------------
- updatedBy: User
- workspace: Workspace
- customerId: string // stripe のカスタマーID
- subscriptoinId: string // stripe のサブスクID
- productIds: string[]
- subscription_end_date: Date

Channel

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[]

その他リソース

補足

ShareTargetParent について

ShareTargetParent は、Workspace や User といった Item の共有対象となりうる Entity を並列に扱うための概念です。

技術的用語を用いて説明すると、ポリモーフィック関連を回避するためのデータ設計手法の1つにあたります。詳しくは↓のスレッドで議論されているので興味がある方は御覧ください。