circle-search-26-api / SQL_IMPLEMENTATION.md
ktsn-ud
統合されたテキスト情報の取得方法を実装し、SQLクエリとリポジトリのロジックを更新
b1ae71d
|
Raw
History Blame Contribute Delete
5.35 kB

app/repositories/query.sqlを,以下のように変更してください。

  • 最終的に得られるカラムに「descriptionUpdates」「prSummaryUpdates」「prDetailUpdates」「remarkUpdates」を追加してください。
    • 型:{ content: string, updateStatus: string | null, createdAt: DateTime }[]

なお,本変更のゴールとしては,app/repositories/projects_repository.py内の_transform_rowにおいて,「***Updates」があり,なおかつstatus=APPROVEDとなっている最新のものが存在すればそれのcontentをdescription, prSummary, prDetail, remarkとし,存在しないならば従来のdescription, prSummary, prDetail, remarkを採用することを目指します。description, prSummary, prDetail, remarkは独立に採用を決定してください。要するに,テキストデータが更新される可能性があるので最新のものをピックアップしてください。

実装に当たっては以下のprismaのモデルを参考にしてください。

enum CPUpdateRequestStatus {
  DRAFT
  PENDING_REVIEW
  APPROVED
  REJECTED
}

// 企画に関するテキスト情報(サマリー、説明、PR文)
model ProjectText {
  id              String                        @id @default(dbgenerated("(UUID())"))
  circleProject   CircleProject                 @relation(name: "circle_project_texts", fields: [circleProjectId], references: [id], onDelete: Cascade)
  circleProjectId String
  textType        TextType // DESCRIPTION, PRSUMMARY, PRDETAIL, REMARK
  content         String @db.Text // テキスト内容
  updateRequest   ProjectMaterialUpdateRequest? @relation("update_request_text")
  createdAt       DateTime                      @default(now())
  updatedAt       DateTime                      @updatedAt @default(now())
}

// 画像情報の管理
model Image {
  id            String                        @id @default(dbgenerated("(UUID())"))
  filename      String
  extension     String
  createdAt     DateTime                      @default(now())
  updatedAt     DateTime                      @updatedAt @default(now())
  cproject      CircleProject                 @relation(name: "cproject_image", fields: [cprojectId], references: [id])
  cprojectId    String
  order         Int
  updateRequest ProjectMaterialUpdateRequest? @relation("update_request_image")
}

// SNSデータ
model SnsData {
  id              String                        @id @default(dbgenerated("(UUID())"))
  service         String // SNSサービス名 (Twitter, Instagram, etc.)
  url             String // ユーザー名/ハンドル
  label           String?
  circleProject   CircleProject                 @relation(name: "circle_project_sns", fields: [circleProjectId], references: [id], onDelete: Cascade)
  circleProjectId String
  updateRequest   ProjectMaterialUpdateRequest? @relation("update_request_snsdata")
  createdAt       DateTime                      @default(now())
  updatedAt       DateTime                      @updatedAt @default(now())
}

model ProjectMaterialUpdateRequest {
  id            String                @id @default(dbgenerated("(UUID())"))
  targetType    CPUpdateRequestType
  targetSns     SnsData?              @relation(name: "update_request_snsdata", fields: [targetSnsId], references: [id])
  targetSnsId   String?               @unique
  targetText    ProjectText?          @relation(name: "update_request_text", fields: [targetTextId], references: [id])
  targetTextId  String?               @unique
  targetImage   Image?                @relation(name: "update_request_image", fields: [targetImageId], references: [id])
  targetImageId String?               @unique
  status        CPUpdateRequestStatus
  requester     User                  @relation(name: "cp_update_requester", fields: [requesterId], references: [id])
  requesterId   String
  observer      User?                 @relation(name: "cp_update_observer", fields: [observerId], references: [id])
  observerId    String?
  createdAt     DateTime              @default(now())
  updatedAt     DateTime              @updatedAt @default(now())
}

修正

query.sqlの変更

現状,最終的にSQLによって得られるカラムのうち,「description」「prSummary」「prDetail」「remark」ですが,これをProjectTextテーブルから取ってきています。現状のようにdescriptionカラムとdescriptionUpdatesカラムの2種類にするのではなく,ProjectTextテーブルとProjectMaterialUpdateRequestテーブルを左結合し,ProjectMaterialUpdateRequestに対応するエントリがない場合はupdateStatusをnullにしてSQLの結果としてください。つまり,descriptionカラムとdescriptionUpdatesカラムを統合し,descriptionUpdatesカラム1本にしてください。prSummary, prDetail, remarkでも同様です。

projects_repository.pyの変更

app/repositories/projects_repository.py内の_transform_rowにおいては,以下の優先順位で採用してdescription, prSummary, ...としてください。

  1. updateStatus="APPROVED"のうち最新のもの
  2. updateStatus=nullで最新のもの なお,方針としては,created_atの降順で並び替え,順に見ていき見つかれば採用すると良いでしょう。