diff --git a/backend/src/modules/meeting/dto/create-meeting-room.dto.ts b/backend/src/modules/meeting/dto/create-meeting-room.dto.ts index 991d66c..5eccba3 100644 --- a/backend/src/modules/meeting/dto/create-meeting-room.dto.ts +++ b/backend/src/modules/meeting/dto/create-meeting-room.dto.ts @@ -13,13 +13,14 @@ import { // 화상회의 방 생성 요청 export class CreateMeetingRoomDto { @ApiProperty({ - description: '방 이름(영문/숫자/-/_ 만 허용, 고유)', - example: 'weekly-sync', + description: '방 이름(한글/영문/숫자/-/_ 허용, 공백 불가, 고유)', + example: '주간-회의', }) @IsString() @Length(1, 64, { message: '방 이름은 1~64자여야 합니다.' }) - @Matches(/^[A-Za-z0-9_-]+$/, { - message: '방 이름은 영문, 숫자, 하이픈(-), 밑줄(_)만 사용할 수 있습니다.', + @Matches(/^[A-Za-z0-9가-힣ㄱ-ㅎㅏ-ㅣ_-]+$/, { + message: + '방 이름은 한글, 영문, 숫자, 하이픈(-), 밑줄(_)만 사용할 수 있습니다. (공백 불가)', }) name!: string; diff --git a/backend/src/modules/meeting/dto/create-meeting-token.dto.ts b/backend/src/modules/meeting/dto/create-meeting-token.dto.ts index d6269b8..bf4cc5a 100644 --- a/backend/src/modules/meeting/dto/create-meeting-token.dto.ts +++ b/backend/src/modules/meeting/dto/create-meeting-token.dto.ts @@ -4,13 +4,14 @@ import { IsString, Length, Matches } from 'class-validator'; // 화상회의 입장 토큰 발급 요청 — 참여할 방 이름을 전달한다. export class CreateMeetingTokenDto { @ApiProperty({ - description: '참여할 회의 방 이름(영문/숫자/-/_ 만 허용)', - example: 'team-standup', + description: '참여할 회의 방 이름(한글/영문/숫자/-/_ 허용, 공백 불가)', + example: '주간-회의', }) @IsString() @Length(1, 64, { message: '방 이름은 1~64자여야 합니다.' }) - @Matches(/^[A-Za-z0-9_-]+$/, { - message: '방 이름은 영문, 숫자, 하이픈(-), 밑줄(_)만 사용할 수 있습니다.', + @Matches(/^[A-Za-z0-9가-힣ㄱ-ㅎㅏ-ㅣ_-]+$/, { + message: + '방 이름은 한글, 영문, 숫자, 하이픈(-), 밑줄(_)만 사용할 수 있습니다. (공백 불가)', }) roomName!: string; } diff --git a/frontend/nginx.conf b/frontend/nginx.conf index 7309278..d443297 100644 --- a/frontend/nginx.conf +++ b/frontend/nginx.conf @@ -9,7 +9,8 @@ server { add_header X-Content-Type-Options "nosniff" always; add_header X-XSS-Protection "1; mode=block" always; add_header Referrer-Policy "strict-origin-when-cross-origin" always; - add_header Permissions-Policy "geolocation=(), microphone=(), camera=()" always; + # 화상회의(LiveKit)용 카메라/마이크는 자기 출처(self)에 허용. 위치정보는 차단 유지. + add_header Permissions-Policy "geolocation=(), microphone=(self), camera=(self)" always; # ---------------------------------------- # 압축 (Gzip) diff --git a/frontend/src/components/DropdownSelect.vue b/frontend/src/components/DropdownSelect.vue index ad8f6a5..6501a46 100644 --- a/frontend/src/components/DropdownSelect.vue +++ b/frontend/src/components/DropdownSelect.vue @@ -126,6 +126,8 @@ function select(value: T): void { } .dd.block .dd-label { flex: 1; + /* button 기본 text-align:center 상속으로 가운데 보이는 것을 폼 셀렉트답게 좌측 정렬 */ + text-align: left; } /* 트리거 — 기존 정렬/필터 pill 과 동일한 외형 */ diff --git a/frontend/src/components/meeting/MeetingCreateForm.vue b/frontend/src/components/meeting/MeetingCreateForm.vue index 64eab65..ca4d7c8 100644 --- a/frontend/src/components/meeting/MeetingCreateForm.vue +++ b/frontend/src/components/meeting/MeetingCreateForm.vue @@ -22,7 +22,7 @@ const emit = defineEmits<{ (e: 'cancel'): void }>() -const NAME_RE = /^[A-Za-z0-9_-]{1,64}$/ +const NAME_RE = /^[A-Za-z0-9가-힣ㄱ-ㅎㅏ-ㅣ_-]{1,64}$/ const userApi = useUser() const meetingApi = useMeeting() @@ -72,7 +72,7 @@ async function submit() { if (submitting.value) return const n = name.value.trim() if (!NAME_RE.test(n)) { - error.value = '방 이름은 영문·숫자·-·_ 1~64자만 가능합니다.' + error.value = '방 이름은 한글·영문·숫자·-·_ 1~64자만 가능합니다.' return } if (props.rooms.some((r) => r.name === n)) { diff --git a/frontend/src/components/meeting/MeetingLobby.vue b/frontend/src/components/meeting/MeetingLobby.vue index 6510976..e227787 100644 --- a/frontend/src/components/meeting/MeetingLobby.vue +++ b/frontend/src/components/meeting/MeetingLobby.vue @@ -3,6 +3,7 @@ import { computed, ref } from 'vue' import MeetingIcon from './MeetingIcon.vue' import MeetingCreateForm from './MeetingCreateForm.vue' +import EmptyState from '@/components/common/EmptyState.vue' import { relativeTimeKo, formatDate } from '@/shared/utils/format' import type { ApiMeetingRoom } from '@/types/meeting' @@ -59,7 +60,7 @@ function fmtSchedule(iso: string): string { {{ rooms.length }}
- 회의 방을 만들거나 목록에서 선택해 입장하세요. 공유 링크(/meeting/<방이름>)로도 바로 입장할 수 있습니다.
+ 회의 방을 만들거나 목록에서 선택해 입장하세요.
아직 생성된 회의방이 없습니다.
- "새 회의 만들기"로 첫 회의방을 만들어 보세요. -검색 결과가 없습니다.
- 다른 검색어로 다시 시도해 보세요. -
-