백로그

0
티켓 없음

할 일

0
티켓 없음

진행 중

0
티켓 없음

리뷰

0
티켓 없음

완료 (15일)

3
높음 a9e36ce3
서브 티켓 이메일 초대

Mailer 생성 및 이메일 발송 연동

## 목표 이메일 초대 생성 시 실제 이메일이 발송되도록 구현 ## 구현 내용 1. WorkspaceInvitationMailer 생성 (app/mailers/workspace_invitation_mailer.rb) - invitation_email(invitation) 메서드 - 초대 링크 포함 (public_invitation_url) - 워크스페이스 이름, 역할 정보 포함 2. 이메일 템플릿 작성 - app/views/workspace_invitation_mailer/invitation_email.html.erb - app/views/workspace_invitation_mailer/invitation_email.text.erb - 기존 mailer.html.erb 레이아웃 활용 - 깔끔하고 전문적인 디자인 (기존 MagicLinkMailer 스타일 참고) 3. InvitationService.create! 수정 (app/services/workspaces/invitation_service.rb) - target_email이 있으면 WorkspaceInvitationMailer.invitation_email(invitation).deliver_later 호출 - 이메일 발송 실패해도 초대 생성은 유지 (rescue) 4. 이메일 재발송 기능 - InvitationsController에 resend 액션 추가 - config/routes.rb에 member route 추가: post :resend - _invitation.html.erb에 재발송 버튼 추가 5. 테스트 작성 - test/mailers/workspace_invitation_mailer_test.rb - InvitationService 테스트에 이메일 발송 테스트 추가 ## 담당 파일 (이 파일만 수정) - NEW: app/mailers/workspace_invitation_mailer.rb - NEW: app/views/workspace_invitation_mailer/invitation_email.html.erb - NEW: app/views/workspace_invitation_mailer/invitation_email.text.erb - MODIFY: app/services/workspaces/invitation_service.rb - MODIFY: config/routes.rb (resend route만 추가) - NEW: test/mailers/workspace_invitation_mailer_test.rb - MODIFY: test/services/workspaces/invitation_service_test.rb ## 완료 기준 - target_email 포함 초대 생성 시 이메일 발송됨 - letter_opener_web에서 발송된 메일 확인 가능 - 재발송 버튼으로 이메일 재발송 가능 - 테스트 통과

M
mailer-dev
11 days
높음 c2083743
서브 티켓 이메일 초대

벌크 이메일 초대 기능

## 목표 여러 이메일을 한 번에 등록하고 초대 발송하는 벌크 초대 기능 구현 ## 구현 내용 1. InvitationsController에 bulk_create 액션 추가 - POST /workspaces/:workspace_id/invitations/bulk_create - 여러 이메일을 쉼표/줄바꿈으로 구분하여 받음 - 각 이메일에 대해 초대 생성 + 이메일 발송 - 성공/실패 카운트 flash 메시지 2. InvitationService에 bulk_create! 메서드 추가 - emails 배열, workspace, params(role, expires, group 등), created_by - 이메일 유효성 검사 (형식, 중복, 이미 초대된 이메일) - 각 이메일에 대해 create! 호출 (개별 에러 처리) - 결과 반환: { success: [...], failed: [...] } 3. 벌크 입력 UI (index.html.erb의 Email Invite 탭 수정) - textarea로 다수 이메일 입력 (쉼표 또는 줄바꿈 구분) - 기존 단일 이메일 입력도 유지 - "벌크 초대" 토글/탭으로 전환 - 입력된 이메일 수 실시간 카운트 표시 (Stimulus) 4. Stimulus 컨트롤러 (bulk_invite_controller.js) - textarea 입력 시 이메일 수 카운트 - 이메일 유효성 클라이언트 검증 5. 라우트 추가 - config/routes.rb에 collection route: post :bulk_create 6. 테스트 작성 - test/controllers/workspaces/invitations_controller_bulk_test.rb - InvitationService bulk_create! 테스트 ## 담당 파일 (이 파일만 수정) - MODIFY: app/controllers/workspaces/invitations_controller.rb (bulk_create 액션 추가) - MODIFY: app/views/workspaces/invitations/index.html.erb (벌크 UI 추가) - MODIFY: config/routes.rb (bulk_create route만) - NEW: app/javascript/controllers/bulk_invite_controller.js - MODIFY: app/services/workspaces/invitation_service.rb (bulk_create! 메서드만 추가) - NEW: test/controllers/workspaces/invitations_controller_bulk_test.rb ## 주의사항 - mailer-dev가 InvitationService.create!에 이메일 발송을 추가하므로, bulk_create!는 기존 create!를 내부적으로 호출하면 됨 - config/locales는 수정하지 마세요 (status-dev가 담당) ## 완료 기준 - 여러 이메일을 한 번에 입력하여 초대 생성 가능 - 각 이메일에 개별적으로 초대 이메일 발송됨 - 유효하지 않은 이메일은 건너뛰고 결과 보고 - 테스트 통과

B
bulk-dev
11 days
보통 1bcfa5ea
서브 티켓 이메일 초대

멤버 승인 상태 표시 및 i18n

## 목표 이메일 초대 목록에서 해당 멤버의 수락(승인) 여부를 표시 ## 구현 내용 1. WorkspaceInvitation 모델에 승인 상태 확인 헬퍼 추가 - accepted? 메서드: target_email의 사용자가 해당 워크스페이스의 멤버인지 확인 - accepted_member 메서드: 수락한 멤버 객체 반환 - 로직: User.find_by(email: target_email) → workspace.workspace_members.exists?(user: user) 2. _invitation.html.erb 수정 - 승인 상태 배지 추가 - "Pending" (노란색 배지): 아직 수락하지 않음 - "Accepted" (초록색 배지): 멤버로 수락됨 - 수락한 경우 사용자 이름도 표시 - 상태에 따른 아이콘 표시 (체크마크 / 시계) 3. i18n 키 추가 (모든 로케일 파일) - config/locales/en.yml - config/locales/ko.yml - config/locales/zh.yml - config/locales/vi.yml 추가할 키: - invitations.status.pending: "대기 중" / "Pending" / "待处理" / "Đang chờ" - invitations.status.accepted: "수락됨" / "Accepted" / "已接受" / "Đã chấp nhận" - invitations.resend: "재발송" / "Resend" / "重新发送" / "Gửi lại" - invitations.bulk_invite: "벌크 초대" / "Bulk Invite" / "批量邀请" / "Mời hàng loạt" - invitations.bulk_placeholder: 적절한 안내 텍스트 - invitations.bulk_submit: "벌크 발송" / "Send Bulk" / "批量发送" / "Gửi hàng loạt" - invitations.flash.bulk_result: "N건 성공, M건 실패" - invitations.flash.resent: "초대 이메일을 재발송했습니다" 4. 테스트 작성 - test/models/workspace_invitation_test.rb에 accepted? 테스트 추가 ## 담당 파일 (이 파일만 수정) - MODIFY: app/models/workspace_invitation.rb - MODIFY: app/views/workspaces/invitations/_invitation.html.erb - MODIFY: config/locales/en.yml - MODIFY: config/locales/ko.yml - MODIFY: config/locales/zh.yml - MODIFY: config/locales/vi.yml - MODIFY: test/models/workspace_invitation_test.rb ## 완료 기준 - 이메일 초대 목록에서 각 초대의 수락 상태가 표시됨 - Pending/Accepted 배지가 올바르게 표시됨 - 4개 언어 i18n 키 추가됨 - 테스트 통과

S
status-dev
11 days