From ce07aced0fa62838cd536f365d913f8611ce5b7e Mon Sep 17 00:00:00 2001 From: theorose49 Date: Tue, 30 Jun 2026 09:47:43 +0900 Subject: [PATCH] =?UTF-8?q?feat(members):=20=EC=A0=84=20=EA=B5=AC=EC=84=B1?= =?UTF-8?q?=EC=9B=90=20=EA=B3=B5=EA=B0=9C=20=EC=9D=B4=EB=A6=84=20=EB=94=94?= =?UTF-8?q?=EB=A0=89=ED=84=B0=EB=A6=AC=20=EC=97=94=EB=93=9C=ED=8F=AC?= =?UTF-8?q?=EC=9D=B8=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - GET /members/directory: 모든 인증 사용자에게 {id,email,displayName,avatarKey} 반환 - PM/작업자/담당자 등을 이메일이 아닌 이름으로 표시하기 위함 (직급/연락처 미포함) Co-Authored-By: Claude Opus 4.8 (1M context) --- internal/httpapi/handlers_members.go | 16 ++++++++++++++++ internal/httpapi/router.go | 1 + 2 files changed, 17 insertions(+) diff --git a/internal/httpapi/handlers_members.go b/internal/httpapi/handlers_members.go index 693018b..5a38376 100644 --- a/internal/httpapi/handlers_members.go +++ b/internal/httpapi/handlers_members.go @@ -25,6 +25,22 @@ func (s *Server) handleListMembers(w http.ResponseWriter, r *http.Request) { writeJSON(w, http.StatusOK, out) } +// handleMemberDirectory: 모든 인증 사용자에게 공개되는 최소 디렉터리(이름·아바타). +// PM/작업자/담당자 등을 이메일이 아니라 이름으로 표시하기 위한 용도. 직급/연락처 +// 같은 상세는 포함하지 않는다. +func (s *Server) handleMemberDirectory(w http.ResponseWriter, r *http.Request) { + type entry struct { + ID string `json:"id"` + Email string `json:"email"` + DisplayName string `json:"displayName"` + AvatarKey string `json:"avatarKey"` + } + var out []entry + s.db.Model(&models.Member{}).Order("display_name asc"). + Select("id", "email", "display_name", "avatar_key").Find(&out) + writeJSON(w, http.StatusOK, out) +} + func (s *Server) handleGetMember(w http.ResponseWriter, r *http.Request) { var m models.Member if err := s.db.First(&m, "id = ?", chi.URLParam(r, "id")).Error; err != nil { diff --git a/internal/httpapi/router.go b/internal/httpapi/router.go index fda6fdc..12c17d5 100644 --- a/internal/httpapi/router.go +++ b/internal/httpapi/router.go @@ -66,6 +66,7 @@ func NewRouter(db *gorm.DB, store *storage.Storage, cfg config.Config, pusher *p // ---- slice 1: members / org ---- r.Get("/members", s.handleListMembers) + r.Get("/members/directory", s.handleMemberDirectory) r.Post("/members", s.handleCreateMember) r.Get("/members/{id}", s.handleGetMember) r.Get("/members/{id}/avatar", s.handleGetAvatar)