feat: 대시보드 내 이슈(/my/tasks) + 전체 캘린더(CalendarEvent) + 메일 AI 요약(OpenAI)
build-and-push / build (push) Successful in 32s

- GET /my/tasks: 전 프로젝트에서 나에게 배정된 작업 + projectName (대시보드 JIRA 보드용)
  · fix: ORDER BY "end"(예약어) 따옴표 처리
- CalendarEvent 모델 + /calendar/events CRUD(본인 소유), nav에 캘린더 추가
- internal/ai(OpenAI, stdlib): 메일 동기화 시 신규 메일에 한 줄 AI 요약 생성(OPENAI_API_KEY)
  · ProjectMailMsg.Summary, 회당 40건 상한
- nav inbox 라벨 쪽지함으로 통일

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
theorose49
2026-06-30 16:06:55 +09:00
co-authored by Claude Opus 4.8
parent d9ab9934c0
commit 995dd36167
10 changed files with 215 additions and 8 deletions
+1 -1
View File
@@ -29,7 +29,7 @@ func All() []interface{} {
// slice 3 — projects
&Company{}, &Product{}, &Version{}, &Project{}, &ProjectMember{},
&ClientContact{}, &ProjectTask{}, &TaskComment{}, &MailNote{}, &ProjectMailMsg{}, &ProjectMailState{},
&Contract{}, &ContractFile{}, &PaymentSplit{},
&CalendarEvent{}, &Contract{}, &ContractFile{}, &PaymentSplit{},
// slice 4 — incentive
&IncentiveConfig{}, &PaymentStage{}, &UserIncentive{}, &QuarterlySettlement{},
// slice 5 — accounting
+20
View File
@@ -152,6 +152,7 @@ type ProjectMailMsg struct {
CcAddr string `json:"cc"`
Subject string `json:"subject"`
Snippet string `json:"snippet"`
Summary string `json:"summary"` // AI 자동 요약(한 줄)
DateHdr string `json:"date"`
Mailbox string `json:"mailbox"`
TS int64 `gorm:"index" json:"ts"`
@@ -171,6 +172,25 @@ type ProjectMailState struct {
Count int `json:"count"`
}
// CalendarEvent is a personal calendar entry tagged by category(프로젝트/기타/개인)
// with a color. Owned by one member.
type CalendarEvent struct {
Base
OwnerEmail string `gorm:"index" json:"ownerEmail"`
Title string `json:"title"`
Category string `json:"category"` // project | etc | personal (분류 키)
ProjectID string `json:"projectId"` // category=project일 때 연결
Color string `json:"color"` // 표시 색
Start string `json:"start"` // YYYY-MM-DD
End string `json:"end"` // YYYY-MM-DD (빈값=하루)
AllDay bool `json:"allDay"`
Memo string `json:"memo"`
CreatedAt time.Time `json:"createdAt"`
UpdatedAt time.Time `json:"updatedAt"`
}
func (m *CalendarEvent) BeforeCreate(*gorm.DB) error { m.ensureID(); return nil }
// Contract holds the [admin-only] commercial terms of a project. BE is the
// break-even floor (손해가 안 나는 최소 금액). Exposed ONLY to admins.
type Contract struct {