Slide 13
Slide 13 text
共通packageに型と判定を置き、adapterで変換、個別実装で固有フローを書く
新卒支援業務システム
プロダクト内に adapter 層と個別実装を分けて持つ
個別実装
新卒固有の後続業務
共通判定のisAcceptedOfferを使い個別フロー
を書く
型・値・判定を共通化し、変換と固有業務は個別に実装する
@assign/career-domain
共通ID・内定結果・判定関数を置く
branded typesでIDの取り違えを型で防ぐ
zodで実行時の値を検証し、z.inferで型として扱う
type Brand =
T & { readonly __brand: N }
export type CandidateId =
Brand
export const OfferOutcomeSchema = z.enum([
"none", "offered",
"accepted", "declined", "joined",
])
export type OfferOutcome =
z.infer
export const isAcceptedOffer =
(v: OfferOutcome) => v === "accepted"
adapter
状態値を共通ドメイン値へ変換
satisfiesで状態値の変換漏れを検知する
const outcomeByStatus = {
noOffer: "none",
accepted: "accepted",
declinedAfterAcceptance: "declined",
joined: "joined",
} satisfies Record<
NewgradOfferStatus, OfferOutcome>
export const toCareerOfferOutcome = (
status: NewgradOfferStatus,
): OfferOutcome =>
outcomeByStatus[status]
export const getPostAcceptanceActions = (
outcome: OfferOutcome,
) => {
if (!isAcceptedOffer(outcome)) return []
return [
"confirmGraduationYear",
"scheduleOfferEvent",
]
}
©ASSIGN Inc. All Right Reserved. 1