feat: 인턴 직급 + 초과근무 관리자 집계화 + SSO 로그아웃 URL + 디바이스/FCM
build-and-push / build (push) Successful in 35s

- 직급에 인턴 추가(기본 할당량 15), 직책(position)은 UI에서 제거(컬럼은 유지)
- 초과근무: 유저 신청 제거 → 관리자 근무관리에서 실제 출퇴근 기록 기반 자동 집계
- 로그아웃: infra 공통 LOGOUT_URL(/me로 전달) 사용 → oauth2-proxy 종료 + Keycloak end-session
- (이전 커밋 포함) Device 등록 + FCM HTTP v1 sender + notify 연동

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
theorose49
2026-06-28 10:55:53 +09:00
co-authored by Claude Opus 4.8
parent 6158888417
commit df09d23662
12 changed files with 293 additions and 19 deletions
+14
View File
@@ -10,6 +10,7 @@ import (
// 주임(junior) · 선임(senior) · 책임(lead) · 파트너(partner)
// Stored as the Korean label so it round-trips to the UI directly.
const (
RankIntern = "인턴"
RankJunior = "주임"
RankSenior = "선임"
RankLead = "책임"
@@ -99,3 +100,16 @@ type WorkStatusEvent struct {
}
func (m *WorkStatusEvent) BeforeCreate(*gorm.DB) error { m.ensureID(); return nil }
// Device is a registered push target (spin-mobile Flutter 앱 FCM 토큰). 한 유저가
// 여러 기기를 가질 수 있고, 토큰은 고유.
type Device struct {
Base
MemberEmail string `gorm:"index" json:"memberEmail"`
Token string `gorm:"uniqueIndex" json:"token"`
Platform string `json:"platform"` // android | ios
CreatedAt time.Time `json:"createdAt"`
UpdatedAt time.Time `json:"updatedAt"`
}
func (m *Device) BeforeCreate(*gorm.DB) error { m.ensureID(); return nil }
+1 -1
View File
@@ -23,7 +23,7 @@ func (b *Base) ensureID() {
func All() []interface{} {
return []interface{}{
// slice 1 — members / org
&Member{}, &Department{}, &AuditLog{}, &Notification{}, &WorkStatusEvent{},
&Member{}, &Department{}, &AuditLog{}, &Notification{}, &WorkStatusEvent{}, &Device{},
// slice 2 — attendance / leave
&Attendance{}, &LeaveRequest{}, &OvertimeRequest{}, &WorkPolicy{}, &LeaveBalance{},
// slice 3 — projects