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
+3 -1
View File
@@ -9,6 +9,7 @@ import (
"spin/internal/config"
"spin/internal/db"
"spin/internal/httpapi"
"spin/internal/mailsync"
"spin/internal/push"
"spin/internal/seed"
"spin/internal/storage"
@@ -46,7 +47,8 @@ func main() {
}
pusher := push.New(cfg.FCMCredentialsFile)
router := httpapi.NewRouter(gdb, store, cfg, pusher)
mailer := mailsync.New(cfg.GoogleSACredentialsFile)
router := httpapi.NewRouter(gdb, store, cfg, pusher, mailer)
addr := ":" + cfg.Port
srv := &http.Server{