feat(mail): 프로젝트 고객사 도메인 메일 연동(Google Workspace 도메인위임) + 공동 메모
build-and-push / build (push) Successful in 32s

- Project.ClientDomain 필드, MailNote(프로젝트 구성원 공동 메모) 모델
- internal/mailsync: 서비스계정+도메인위임으로 팀 메일함을 도메인 검색·집계(stdlib만, push 패턴 재사용)
  · GOOGLE_SA_CREDENTIALS_FILE 미설정 시 비활성(graceful)
- GET /projects/{id}/mails (3분 캐시), GET/PUT /projects/{id}/mail-notes
- fix: handlePatchProject map-key Updates가 camelCase 멀티워드 필드(consultingType·
  scopeText·pmEmail·clientDomain·날짜)를 컬럼에 못 맞춰 저장 실패하던 버그 → snakeKeys 변환

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
theorose49
2026-06-30 10:41:26 +09:00
co-authored by Claude Opus 4.8
parent ce07aced0f
commit 751aa8ed97
7 changed files with 495 additions and 9 deletions
+6 -1
View File
@@ -27,6 +27,10 @@ type Config struct {
// FCMCredentialsFile is the path to a Firebase service-account JSON used to
// send push notifications to spin-mobile. Empty = push disabled (no-op).
FCMCredentialsFile string
// GoogleSACredentialsFile is the path to a Google Workspace service-account
// JSON with DOMAIN-WIDE DELEGATION (gmail.readonly) used to read project
// client-domain mail. Empty = mail integration disabled.
GoogleSACredentialsFile string
// LogoutURL is the common SSO logout path injected by infra (LOGOUT_URL):
// ends the oauth2-proxy session then redirects to Keycloak end-session.
// The static frontend reads it via /me. Defaults to the infra-common value.
@@ -77,7 +81,8 @@ func Load() Config {
// Super-admin Keycloak groups (comma-separated). Default: admin
// (shared group name across all internal apps, not app-specific).
AdminGroups: splitCSV(env("ADMIN_GROUPS", "admin")),
FCMCredentialsFile: env("FCM_CREDENTIALS_FILE", ""),
FCMCredentialsFile: env("FCM_CREDENTIALS_FILE", ""),
GoogleSACredentialsFile: env("GOOGLE_SA_CREDENTIALS_FILE", ""),
LogoutURL: env("LOGOUT_URL",
"/oauth2/sign_out?rd=https%3A%2F%2Fauth.special-partners.com%2Frealms%2Fsp%2Fprotocol%2Fopenid-connect%2Flogout"),
}