Skip to content

Commit

Permalink
wip: とりあえずスキーマと Prisma 追加
Browse files Browse the repository at this point in the history
  • Loading branch information
wappon28dev committed Jan 5, 2025
1 parent 8ed5d27 commit 1eb216c
Show file tree
Hide file tree
Showing 8 changed files with 118 additions and 59 deletions.
15 changes: 15 additions & 0 deletions .cspell.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
{
"$schema": "https://raw.githubusercontent.com/streetsidesoftware/cspell/main/cspell.schema.json",
"version": "0.2",
"ignorePaths": [
"node_modules",
"/package.json"
],
"words": [
"cloudflare",
"datasource",
"prisma",
"sqlite",
"uuid"
]
}
3 changes: 1 addition & 2 deletions .vscode/settings.json
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,5 @@
"typescript.preferences.importModuleSpecifier": "non-relative",
"[prisma]": {
"editor.defaultFormatter": "Prisma.prisma"
},
"cSpell.words": []
}
}
9 changes: 9 additions & 0 deletions app/services/__prisma.server.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
import { PrismaD1 } from '@prisma/adapter-d1';
import { PrismaClient } from '@prisma/client';

// ref: https://github.com/chimame/remix-prisma-d1-on-cloudflare-pages/blob/e98cfb57b80e836186ef587a69941b61fe5cd09d/app/database/client.ts

export async function injectPrismaClient(db: D1Database): Promise<PrismaClient> {
const adapter = new PrismaD1(db);
return new PrismaClient({ adapter });
}
9 changes: 7 additions & 2 deletions functions/[[path]].ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,11 @@
/* eslint-disable no-restricted-imports */

import type { createPagesFunctionHandlerParams } from '@remix-run/cloudflare-pages';
import { createPagesFunctionHandler } from '@remix-run/cloudflare-pages';
// eslint-disable-next-line no-restricted-imports
// @ts-expect-error ビルドされたら解決されるので無視
import * as build from '../build/server';
import { getLoadContext } from '../load-context';

export const onRequest = createPagesFunctionHandler({ build } as createPagesFunctionHandlerParams<any>);
export const onRequest = createPagesFunctionHandler(
{ build, getLoadContext } as unknown as createPagesFunctionHandlerParams<any>,
);
18 changes: 18 additions & 0 deletions load-context.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,27 @@
import type { AppLoadContext } from '@remix-run/cloudflare';
import type { PlatformProxy } from 'wrangler';
import { Database } from '@/services/db.server';
import { injectPrismaClient } from './app/services/__prisma.server';

type Cloudflare = Omit<PlatformProxy<Env>, 'dispose'>;

declare module '@remix-run/cloudflare' {
interface AppLoadContext {
cloudflare: Cloudflare;
__prisma: Awaited<ReturnType<typeof injectPrismaClient>>;
db: Database;
}
}

// ref: https://github.com/chimame/remix-prisma-d1-on-cloudflare-pages/blob/e98cfb57b80e836186ef587a69941b61fe5cd09d/load-context.ts
export async function getLoadContext({ context }: {
request: Request;
context: { cloudflare: Cloudflare };
}): Promise<AppLoadContext> {
const prisma = await injectPrismaClient(context.cloudflare.env.DB);
return {
...context,
__prisma: prisma,
db: new Database(prisma),
};
}
115 changes: 63 additions & 52 deletions prisma/schema.prisma
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,13 @@ datasource db {
url = env("DATABASE_URL")
}

// see: https://sysken.esa.io/posts/2008

model Member {
id String @id @unique @default(uuid(7))
email String
username String
securityRole Int
id String @id @unique @default(uuid(7)) // -> `Brand<"memberId", string>`
subject String @unique // -> `Brand<"subject", string>`
email String @unique
securityRole String // -> `SecurityRole`
/// meta ///
Expand All @@ -21,57 +23,63 @@ model Member {
/// relations ///
MemberStatus MemberStatus? @relation("memberStatus")
MemberStatusAsModifier MemberStatus[] @relation("memberStatusAsModifier")
memberBase MemberBase?
memberSensitive MemberSensitive?
memberActive MemberActive?
memberAlumni MemberAlumni?
MemberExternal MemberExternal?
PaymentAsPayer Payment[] @relation("memberAsPayer")
PaymentAsPayee Payment[] @relation("memberAsPayee")
MemberInternal MemberInternal?
//// 1:1 ////
memberBase MemberBase?
memberSensitive MemberSensitive?
memberActive MemberActive?
MemberActiveInternal MemberActiveInternal?
MemberActiveExternal MemberActiveExternal?
memberAlumni MemberAlumni?
MemberStatus MemberStatus? @relation("memberStatus")
//// 1:N ////
memberStatusAsUpdaterToHasDeleted MemberStatus[] @relation("memberStatusAsUpdaterToHasDeleted")
memberStatusAsUpdaterToLastRenewalDate MemberStatus[] @relation("memberStatusAsUpdaterToLastRenewalDate")
PaymentAsPayer Payment[] @relation("paymentMemberAsPayer")
PaymentAsReceiver Payment[] @relation("paymentMemberAsReceiver")
PaymentAsApprover Payment[] @relation("paymentMemberAsApprover")
}

model MemberBase {
memberId String @id @unique
iconUrl String
memberId String @id @unique // -> `Brand<"memberId", string>`
iconUrl String // -> `URL`
firstName String
lastName String
firstNameKana String
lastNameKana String
role String
/// meta ///
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
/// foreign keys ///
/// FK ///
member Member @relation(fields: [memberId], references: [id])
}

model MemberStatus {
memberId String @id @unique
status String
memberId String @id @unique // -> `Brand<"memberId", string>`
hasDeleted Boolean @default(false)
lastRenewalDate DateTime
/// meta ///
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
memberIdAsModifier String
updatedHasDeletedAt DateTime @updatedAt
updatedHasDeletedById String // -> `Brand<"memberId", string>`
updatedLastRenewalDateById String // -> `Brand<"memberId", string>`
/// foreign keys ///
/// FK ///
member Member @relation(name: "memberStatus", fields: [memberId], references: [id])
memberAsModifier Member @relation(name: "memberStatusAsModifier", fields: [memberIdAsModifier], references: [id])
member Member @relation(name: "memberStatus", fields: [memberId], references: [id])
updatedHasDeletedBy Member @relation(name: "memberStatusAsUpdaterToHasDeleted", fields: [updatedHasDeletedById], references: [id])
updatedLastRenewalDateBy Member @relation(name: "memberStatusAsUpdaterToLastRenewalDate", fields: [updatedLastRenewalDateById], references: [id])
}

model MemberSensitive {
memberId String @id @unique
memberId String @id @unique // -> `Brand<"memberId", string>`
birthday String
gender String
gender String // -> `Gender`
phoneNumber String
currentZipCode String
currentAddress String
Expand All @@ -83,85 +91,88 @@ model MemberSensitive {
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
/// foreign keys ///
/// FK ///
member Member @relation(fields: [memberId], references: [id])
}

model MemberActive {
memberId String @id @unique
retentionBias Int @default(0)
memberId String @id @unique // -> `Brand<"memberId", string>`
grade String // -> `Grade`
/// meta ///
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
/// foreign keys ///
/// FK ///
member Member @relation(fields: [memberId], references: [id])
}

model MemberInternal {
memberId String @id @unique
studentId String
model MemberActiveInternal {
memberId String @id @unique // -> `Brand<"memberId", string>`
studentId String @unique // -> `Brand<"studentId", string>`
role String // -> `Role`
/// meta ///
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
/// foreign keys ///
/// FK ///
member Member @relation(fields: [memberId], references: [id])
}

model MemberExternal {
memberId String @id @unique
model MemberActiveExternal {
memberId String @id @unique // -> `Brand<"memberId", string>`
schoolName String
schoolMajor String
enrollYear Int
organization String
/// meta ///
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
/// foreign keys ///
/// FK ///
member Member @relation(fields: [memberId], references: [id])
}

model MemberAlumni {
memberId String @id @unique
memberId String @id @unique // -> `Brand<"memberId", string>`
graduatedYear Int
// NOTE: Should NOT be narrow type in client.
oldRole String
/// meta ///
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
/// foreign keys ///
/// FK ///
member Member @relation(fields: [memberId], references: [id])
}

model Payment {
id String @id @unique @default(uuid())
payerId String
payeeId String
receivedAt DateTime
hasAccountantApproved Boolean
id String @id @unique @default(uuid(7)) // -> `Brand<"paymentId", string>`
payerId String // -> `Brand<"memberId", string>`
receiverId String // -> `Brand<"memberId", string>`
hasApproved Boolean @default(false)
approverId String? // -> `Nullable<Brand<"memberId", string>>`
/// meta ///
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
receivedAt DateTime
approvedAt DateTime?
createdAt DateTime @default(now())
/// foreign keys ///
/// FK ///
memberAsPayer Member @relation(name: "memberAsPayer", fields: [payerId], references: [id])
memberAsPayee Member @relation(name: "memberAsPayee", fields: [payeeId], references: [id])
memberAsPayer Member @relation(name: "paymentMemberAsPayer", fields: [payerId], references: [id])
memberAsReceiver Member @relation(name: "paymentMemberAsReceiver", fields: [receiverId], references: [id])
memberAsApprover Member? @relation(name: "paymentMemberAsApprover", fields: [approverId], references: [id])
}
3 changes: 2 additions & 1 deletion vite.config.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
import { vitePlugin as remix, cloudflareDevProxyVitePlugin as remixCloudflareDevProxy } from '@remix-run/dev';
import { defineConfig } from 'vite';
import tsconfigPaths from 'vite-tsconfig-paths';
import { getLoadContext } from './load-context';

export default defineConfig({
plugins: [
remixCloudflareDevProxy(),
remixCloudflareDevProxy({ getLoadContext }),
remix({
future: {
v3_fetcherPersist: true,
Expand Down
5 changes: 3 additions & 2 deletions worker-configuration.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,8 @@ interface Env {
AUTH0_DOMAIN: string;
AUTH0_CLIENT_ID: string;
AUTH0_CLIENT_SECRET: string;
SESSION_SECRET: string;
CF_PAGES_URL: string;
AUTH0_CALLBACK_URL: string;
CF_PAGES_URL: string;
SESSION_SECRET: string;
DB: D1Database;
}

0 comments on commit 1eb216c

Please sign in to comment.