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のモデルを参考にしてください。
```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の降順で並び替え,順に見ていき見つかれば採用すると良いでしょう。