본문으로 건너뛰기

Site 도메인 모델


1. Domain Events

1.1 Internal Events

SiteRegistrationRequested

  • Payload: registrationId, name, userRegistrationId, requestedBy, requestedAt
  • 발행 시점: RequestSiteRegistration 커맨드 성공 시
  • 발행: SiteRegistration
  • 구독: -

SiteAdminUserCreated

  • Payload: userRegistrationId, registrationId, siteId, email, groupName, createdAt
  • 발행 시점: SiteRegistrationRequested 발생 시 (자동)
  • 발행: SiteRegistration
  • 구독: -

SiteRegistrationApproved

  • Payload: registrationId, approvedBy, approvedAt
  • 발행 시점: ApproveSiteRegistration 커맨드 성공 시
  • 발행: SiteRegistration
  • 구독: -

SiteCreated

  • Payload: siteId, name, code, description, clinicalResearch, managedByCrm, matchingKeywords, registrationId, createdAt
  • 발행 시점: CreateSite 커맨드 성공 시
  • 발행: Site
  • 구독: -

SiteUpdated

  • Payload: siteId, name, code, description, clinicalResearch, managedByCrm, matchingKeywords, updatedBy, updatedAt
  • 발행 시점: UpdateSite 커맨드 성공 시
  • 발행: Site
  • 구독: -

SiteSoftDeleted

  • Payload: siteId, deletedBy, deletedAt
  • 발행 시점: SoftDeleteSite 커맨드 성공 시
  • 발행: Site
  • 구독: -

SiteHardDeleted

  • Payload: siteId, deletedBy, deletedAt
  • 발행 시점: HardDeleteSite 커맨드 성공 시
  • 발행: Site
  • 구독: -

1.2 External Events

Outbound: SiteAdminUserCreationRequested

  • Payload: userRegistrationId, siteRegistrationId, email, name, phoneNumber, roleIds
  • Target: IAM Context

2. Entities

SiteRegistration (Aggregate Root)

  • id: 등록 요청 고유 식별자 (registrationId)
  • name: 사이트명
  • code: 사이트 코드 (선택)
  • description: 사이트 설명 (선택)
  • clinicalResearch: 임상연구 여부 (Boolean)
  • managedByCrm: CRM 관리 여부 (Boolean)
  • matchingKeywords: 매칭 키워드 배열
  • siteAdminUser: 관리자 사용자 등록 정보 (SiteAdminUser, 단일)
  • approved: 승인 여부 (Boolean)
  • approvedBy: 승인자 사용자 ID (IAM userId)
  • approvedAt: 승인 일시
  • requestedBy: 요청자 사용자 ID (IAM userId)
  • requestedAt: 요청 일시
  • createdAt: 생성일
  • updatedAt: 수정일

Site (Aggregate Root)

  • id: 사이트 고유 식별자
  • name: 사이트명 (필수)
  • code: 사이트 코드 (선택)
  • description: 사이트 설명 (선택)
  • clinicalResearch: 임상연구 여부 (Boolean)
  • managedByCrm: CRM 관리 여부 (Boolean)
  • matchingKeywords: 매칭 키워드 배열
  • registrationId: 등록 요청 ID (선택, 연결된 경우)
  • deletedAt: 삭제 일시 (소프트 삭제용)
  • createdAt: 생성일
  • updatedAt: 수정일

SiteAdminUser

  • id: 사용자 등록 ID (userRegistrationId)
  • registrationId: 소속 사이트 등록 요청 ID
  • email: 이메일 주소 (고유)
  • name: 사용자 이름
  • phoneNumber: 전화번호
  • userId: IAM 사용자 ID (IAM Context에서 생성 후 연결)
  • groupName: 그룹명 (medi.site-admin)
  • roles: 역할(권한)
  • createdAt: 생성일
  • updatedAt: 수정일

3. Enums

현재 Site 도메인에는 별도의 Enum이 필요하지 않습니다.


4. Value Objects

SiteName

  • name: 사이트명 (String, 필수, 최대 255자)
  • 동등성: name 값이 동일하면 같은 객체

MatchingKeywords

  • keywords: 키워드 배열 (String[])
  • 동등성: keywords 배열의 모든 요소가 동일하면 같은 객체

AdminUserInfo

  • email: 이메일 주소 (String, 고유)
  • name: 사용자 이름 (String)
  • phoneNumber: 전화번호 (String)
  • roleIds: 역할 (String[])
  • 동등성: email이 동일하면 같은 객체
  • 용도: 사이트 등록 요청 시 관리자 사용자 정보 전달

5. Aggregates

SiteRegistration

Methods:

  • requestRegistration(name, requestedBy): 사이트 등록 요청 생성
  • approve(approvedBy): 등록 요청 승인
  • reject(rejectedBy): 등록 요청 거부
  • canApprove(): 승인 가능 여부 확인
  • isApproved(): 승인 여부 확인
  • getAdminUser(): 관리자 사용자 등록 정보 조회
  • getUserRegistrationId(): 사용자 등록 ID 조회

Repository:

  • findById(id): ID로 등록 요청 조회
  • findByApproved(approved): 승인 여부로 조회
  • findPendingRegistrations(): 대기 중인 등록 요청 목록 조회 (approved = false)
  • save(registration): 등록 요청 저장

Events Published:

  • SiteRegistrationRequested
  • SiteAdminUserCreated
  • SiteRegistrationApproved

Site

Methods:

  • createSite(name, code, description, clinicalResearch, managedByCrm, matchingKeywords, registrationId): 사이트 생성
  • updateSite(name, code, description, clinicalResearch, managedByCrm, matchingKeywords, updatedBy): 사이트 정보 수정
  • softDelete(deletedBy): 사이트 소프트 삭제 (deletedAt 설정)
  • hardDelete(deletedBy): 사이트 하드 삭제 (물리적 제거)
  • isDeleted(): 삭제 여부 확인
  • getName(): 사이트명 조회
  • getMatchingKeywords(): 매칭 키워드 조회

Repository:

  • findById(id): ID로 사이트 조회
  • findByName(name): 사이트명으로 조회
  • findByRegistrationId(registrationId): 등록 요청 ID로 조회
  • findActiveSites(): 활성 사이트 목록 조회 (deletedAt이 null)
  • findByClinicalResearch(clinicalResearch): 임상연구 여부로 조회
  • findByManagedByCrm(managedByCrm): CRM 관리 여부로 조회
  • save(site): 사이트 저장
  • delete(siteId): 사이트 물리 삭제

Events Published:

  • SiteCreated
  • SiteUpdated
  • SiteSoftDeleted
  • SiteHardDeleted

6. Error Codes

4xx - Client Errors

  • 4001 SITE_NAME_REQUIRED (400): 사이트명은 필수 항목입니다
  • 4002 DUPLICATE_ADMIN_EMAIL (409): 관리자 사용자 이메일이 중복되었습니다
  • 4003 REGISTRATION_ALREADY_APPROVED (409): 이미 승인된 등록 요청입니다
  • 4004 REGISTRATION_NOT_PENDING (400): 대기 중인 등록 요청이 아닙니다
  • 4005 ADMIN_USER_REQUIRED (400): 관리자 사용자 정보가 필요합니다
  • 4006 SITE_NOT_FOUND (404): 사이트를 찾을 수 없습니다
  • 4007 SITE_ALREADY_DELETED (409): 이미 삭제된 사이트입니다
  • 4008 UNAUTHORIZED_SITE_OPERATION (403): 사이트 작업 권한이 없습니다
  • 4009 REGISTRATION_NOT_FOUND (404): 등록 요청을 찾을 수 없습니다

5xx - Server Errors

  • 5001 INTERNAL_ERROR (500): 내부 서버 오류

(작성 가이드 참고)

변경 이력

버전날짜작성자변경 내용
0.58.02025-12-17dalia@weltcorp.com최초 작성