Skip to content

Conversation

@GwanLiZa
Copy link
Contributor

@GwanLiZa GwanLiZa commented Sep 23, 2025

Summary by CodeRabbit

  • 신기능

    • 그룹 생성 시 기본 역할(관리자/멤버) 자동 생성 및 권한 자동 부여.
    • 역할 생성 기능 활성화로 그룹 내 권한 기반 관리 가능.
    • 권한 체계 고도화: 멤버 관리, 역할 관리, 그룹 관리 등 세분화된 권한 지원.
  • 변경사항

    • 용어 정리: Authorities → Permissions로 표기 통일.
    • 권한 표현을 더 일관되고 예측 가능하게 개선하여 관리 경험 향상.

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Sep 23, 2025

📝 Walkthrough

Walkthrough

그룹 역할 도메인에서 authorities를 permissions로 전면 개명하고, 문자열 기반에서 enum 기반 권한으로 전환했습니다. Create/Update/Role 모델과 엔티티가 업데이트되었고, GroupApi.createRole의 본문 타입이 CreateRoleModel로 변경되었습니다. 그룹 생성 BLoC는 생성 직후 기본 역할 두 개를 추가로 생성합니다.

Changes

Cohort / File(s) Summary
Models rename (authorities → permissions)
lib/app/modules/groups/data/data_sources/models/create_role_model.dart, lib/app/modules/groups/data/data_sources/models/update_role_model.dart, lib/app/modules/groups/domain/entities/authority_entity.dart
필드명 authorities를 permissions로 변경. 타입은 List 유지(AuthorityEntity, Create/UpdateRoleModel). 직렬화 키 변경에 따름.
Role to enum permissions
lib/app/modules/groups/data/data_sources/models/role_model.dart, lib/app/modules/groups/domain/entities/role_entity.dart, lib/app/modules/groups/data/enums/group_role_permission.dart
RoleModel/RoleEntity의 authorities(List)를 permissions(List)로 변경. 신규 enum GroupRolePermission 추가 및 JsonValue 매핑/확장 제공.
API/Repository adjustments
lib/app/modules/groups/data/data_sources/remote/group_api.dart, lib/app/modules/groups/data/repositories/rest_group_repository.dart
GroupApi.createRole의 @Body 타입을 CreateRoleModel로 교체. RestGroupRepository.createRole 구현: RoleEntity를 CreateRoleModel로 변환해 API 호출.
Presentation flow update
lib/app/modules/groups/presentation/blocs/group_create_bloc.dart
그룹 생성 성공 후 매니저/멤버 두 역할을 순차 생성하도록 로직 추가(permissions 지정).

Sequence Diagram(s)

sequenceDiagram
  autonumber
  actor U as User
  participant B as GroupCreateBloc
  participant R as RestGroupRepository
  participant A as GroupApi
  participant S as Server

  U->>B: CreateGroup 이벤트
  B->>R: createGroup(...)
  R->>A: createGroup(...)
  A->>S: POST /groups
  S-->>A: 201 Created (groupUuid)
  A-->>R: groupUuid
  R-->>B: groupUuid

  rect rgba(200,230,255,0.3)
    note over B: 신규 그룹에 기본 역할 생성
    B->>R: createRole(groupUuid, manager role + permissions)
    R->>A: POST /groups/{uuid}/roles (CreateRoleModel)
    A->>S: 요청 전송
    S-->>A: 201 Created
    A-->>R: OK
    R-->>B: OK

    B->>R: createRole(groupUuid, member role + permissions)
    R->>A: POST /groups/{uuid}/roles (CreateRoleModel)
    A->>S: 요청 전송
    S-->>A: 201 Created
    A-->>R: OK
    R-->>B: OK
  end

  B-->>U: 완료 상태(_Done)
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Possibly related PRs

Suggested reviewers

  • dawnfire05
  • 2paperstar

Poem

귀 쫑긋, 깡총깡총 코드 밭을 누벼요 🐇
권한은 문자열에서, 이제는 깔끔한 enum으로!
새 그룹 심자마자, 매니저·멤버 꽃 두 송이 피어나고,
permissions란 이름표 반짝반짝—
오늘도 PR 밭엔 바람이 솔솔, 리뷰는 금세 끝! 🌱✨

Pre-merge checks and finishing touches

✅ Passed checks (3 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title Check ✅ Passed 제목은 PR의 핵심 변경사항인 "그룹 생성 시 역할 생성"을 직접적으로 요약하고 있어 변경 내용과 일치하며 스캔하는 동료에게 주요 목적을 잘 전달합니다. 다만 "at app at" 표현이 중복되어 약간 어색하지만 의도는 명확합니다.
Docstring Coverage ✅ Passed No functions found in the changes. Docstring coverage check skipped.
✨ Finishing touches
🧪 Generate unit tests
  • Create PR with unit tests
  • Post copyable unit tests in a comment

Tip

👮 Agentic pre-merge checks are now available in preview!

Pro plan users can now enable pre-merge checks in their settings to enforce checklists before merging PRs.

  • Built-in checks – Quickly apply ready-made checks to enforce title conventions, require pull request descriptions that follow templates, validate linked issues for compliance, and more.
  • Custom agentic checks – Define your own rules using CodeRabbit’s advanced agentic capabilities to enforce organization-specific policies and workflows. For example, you can instruct CodeRabbit’s agent to verify that API documentation is updated whenever API schema files are modified in a PR. Note: Upto 5 custom checks are currently allowed during the preview period. Pricing for this feature will be announced in a few weeks.

Please see the documentation for more information.

Example:

reviews:
  pre_merge_checks:
    custom_checks:
      - name: "Undocumented Breaking Changes"
        mode: "warning"
        instructions: |
          Pass/fail criteria: All breaking changes to public APIs, CLI flags, environment variables, configuration keys, database schemas, or HTTP/GraphQL endpoints must be documented in the "Breaking Change" section of the PR description and in CHANGELOG.md. Exclude purely internal or private changes (e.g., code not exported from package entry points or explicitly marked as internal).

Please share your feedback with us on this Discord post.


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@GwanLiZa GwanLiZa linked an issue Sep 23, 2025 that may be closed by this pull request
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

🧹 Nitpick comments (8)
lib/app/modules/groups/data/data_sources/remote/group_api.dart (1)

123-133: id 파라미터는 int로 통일 권장

동일 도메인에서 roleId는 대부분 int로 쓰입니다. Retrofit이 문자열로도 동작하더라도 타입 불일치는 혼선의 여지가 있습니다. 가능하면 int로 통일해 주세요.

다음 변경 제안:

   @PATCH('{groupUuid}/role/{id}')
   Future<void> updateRole(
     @Path('groupUuid') String groupUuid,
-    @Path('id') String id,
+    @Path('id') int id,
     @Body() UpdateRoleModel updateRoleModel,
   );
 
   @DELETE('{groupUuid}/role/{id}')
   Future<void> deleteRole(
     @Path('groupUuid') String groupUuid,
-    @Path('id') String id,
+    @Path('id') int id,
   );
lib/app/modules/groups/domain/entities/authority_entity.dart (1)

2-5: 문자열 permissions 유지 vs enum 일관성

Update 전용이라 문자열을 유지할 수도 있지만, 도메인 레이어 일관성을 위해 GroupRolePermission로의 전환을 권장합니다(레포/API 변환에서 문자열로 직렬화).

권장 변경(별도 PR 권장):

-class AuthorityEntity {
-  final List<String> permissions;
-
-  AuthorityEntity({required this.permissions});
-}
+class AuthorityEntity {
+  final List<GroupRolePermission> permissions;
+
+  AuthorityEntity({required this.permissions});
+}

필요한 import(파일 상단에 추가):

import 'package:ziggle/app/modules/groups/data/enums/group_role_permission.dart';
lib/app/modules/groups/presentation/blocs/group_create_bloc.dart (2)

40-65: 생성 요청에 하드코딩된 id(2,3)는 혼동 유발

서버가 id를 할당하고, 레포의 createRole도 id를 사용하지 않습니다. 관례적으로 0 등으로 명시하거나, 생성용 모델/메서드로 분리하는 편이 명확합니다.

         await _repository.createRole(
             group.uuid,
             RoleEntity(
-              id: 2,
+              id: 0,
               name: GroupMemberRole.manager,
               groupUuid: group.uuid,
               permissions: [
                 GroupRolePermission.memberUpdate,
                 GroupRolePermission.memberDelete,
                 GroupRolePermission.roleUpdate,
                 GroupRolePermission.roleGrant,
                 GroupRolePermission.roleRevoke,
               ],
             ));
 
         await _repository.createRole(
             group.uuid,
             RoleEntity(
-              id: 3,
+              id: 0,
               name: GroupMemberRole.member,
               groupUuid: group.uuid,
               permissions: [
                 GroupRolePermission.memberUpdate,
               ],
             ));

40-65: 두 역할 생성은 병렬 처리 가능 + 권한 셋 확인

네트워크 왕복을 줄이려면 병렬 처리 가능합니다. 또한 매니저 권한 셋(예: roleCreate/groupUpdate 등) 기획과 일치하는지 재확인해 주세요.

-        await _repository.createRole(
-            group.uuid,
-            RoleEntity(
-              id: 0,
-              name: GroupMemberRole.manager,
-              groupUuid: group.uuid,
-              permissions: [
-                GroupRolePermission.memberUpdate,
-                GroupRolePermission.memberDelete,
-                GroupRolePermission.roleUpdate,
-                GroupRolePermission.roleGrant,
-                GroupRolePermission.roleRevoke,
-              ],
-            ));
-
-        await _repository.createRole(
-            group.uuid,
-            RoleEntity(
-              id: 0,
-              name: GroupMemberRole.member,
-              groupUuid: group.uuid,
-              permissions: [
-                GroupRolePermission.memberUpdate,
-              ],
-            ));
+        await Future.wait([
+          _repository.createRole(
+            group.uuid,
+            RoleEntity(
+              id: 0,
+              name: GroupMemberRole.manager,
+              groupUuid: group.uuid,
+              permissions: [
+                GroupRolePermission.memberUpdate,
+                GroupRolePermission.memberDelete,
+                GroupRolePermission.roleUpdate,
+                GroupRolePermission.roleGrant,
+                GroupRolePermission.roleRevoke,
+              ],
+            ),
+          ),
+          _repository.createRole(
+            group.uuid,
+            RoleEntity(
+              id: 0,
+              name: GroupMemberRole.member,
+              groupUuid: group.uuid,
+              permissions: [
+                GroupRolePermission.memberUpdate,
+              ],
+            ),
+          ),
+        ]);
lib/app/modules/groups/data/data_sources/models/update_role_model.dart (1)

9-9: UpdateRoleModel: named 인자 사용 권장

파일 lib/app/modules/groups/data/data_sources/models/update_role_model.dart — CreateRoleModel과 동일하게 named 인자로 변경하세요.

-  factory UpdateRoleModel(
-    List<String> permissions,
-  ) = _UpdateRoleModel;
+  factory UpdateRoleModel({
+    required List<String> permissions,
+  }) = _UpdateRoleModel;

rg 결과: AuthorityEntity(permissions) 사용 중이며 'authorities' 레거시 키는 검색되지 않음 (참조: lib/app/modules/groups/domain/entities/authority_entity.dart 등).

lib/app/modules/groups/data/enums/group_role_permission.dart (3)

1-1: Flutter 의존성 제거 권장

이 파일은 Flutter API를 사용하지 않습니다. 불필요한 의존성을 줄이기 위해 material.dart import를 제거하세요.

-import 'package:flutter/material.dart';

2-2: json_annotation만 직접 사용으로 의존성 축소 (옵션)

Freezed 기능을 쓰지 않는 파일이므로 freezed_annotation 대신 json_annotation만 import해도 됩니다.

-import 'package:freezed_annotation/freezed_annotation.dart';
+import 'package:json_annotation/json_annotation.dart';

36-43: fromJson 안정성 개선 — extension static 사용은 Stable Dart에서 허용됨

  • firstWhere가 일치하지 않으면 StateError가 발생합니다. orElse로 명시적 FormatException을 던지도록 변경하세요.
  • extension 내부의 static 멤버는 Stable Dart에서 지원되므로 top-level로 옮길 필요 없습니다.

위치: lib/app/modules/groups/data/enums/group_role_permission.dart (36-43행)

-  static GroupRolePermission fromJson(String json) =>
-      _$GroupRolePermissionEnumMap.entries
-          .firstWhere((e) => e.value == json)
-          .key;
+  static GroupRolePermission fromJson(String json) {
+    final entry = _$GroupRolePermissionEnumMap.entries.firstWhere(
+      (e) => e.value == json,
+      orElse: () {
+        throw FormatException('Unknown GroupRolePermission: $json');
+      },
+    );
+    return entry.key;
+  }
📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 37e9297 and 8aef4b1.

📒 Files selected for processing (9)
  • lib/app/modules/groups/data/data_sources/models/create_role_model.dart (1 hunks)
  • lib/app/modules/groups/data/data_sources/models/role_model.dart (2 hunks)
  • lib/app/modules/groups/data/data_sources/models/update_role_model.dart (1 hunks)
  • lib/app/modules/groups/data/data_sources/remote/group_api.dart (2 hunks)
  • lib/app/modules/groups/data/enums/group_role_permission.dart (1 hunks)
  • lib/app/modules/groups/data/repositories/rest_group_repository.dart (2 hunks)
  • lib/app/modules/groups/domain/entities/authority_entity.dart (1 hunks)
  • lib/app/modules/groups/domain/entities/role_entity.dart (1 hunks)
  • lib/app/modules/groups/presentation/blocs/group_create_bloc.dart (2 hunks)
🧰 Additional context used
🧠 Learnings (1)
📚 Learning: 2024-11-08T18:23:32.322Z
Learnt from: dawnfire05
PR: gsainfoteam/ziggle-flutter#424
File: lib/app/modules/user/data/repositories/ziggle_rest_auth_repository.dart:10-12
Timestamp: 2024-11-08T18:23:32.322Z
Learning: Flutter 프로젝트의 `lib/app/modules/user/data/repositories` 경로에서 의존성 주입 시, `ZiggleRestAuthRepository`와 `GroupsRestAuthRepository`를 구분하기 위해서는 `named` 어노테이션을 사용해야 합니다.

Applied to files:

  • lib/app/modules/groups/presentation/blocs/group_create_bloc.dart
🔇 Additional comments (8)
lib/app/modules/groups/data/repositories/rest_group_repository.dart (1)

137-143: 역할 생성 매핑 구현은 적절함; name 직렬화 포맷만 확인 부탁

permissions를 enum→문자열로 변환하는 로직은 맞습니다. name에 role.name.name을 넣는 것이 백엔드가 기대하는 포맷(예: 'manager' vs 'MANAGER' 등)과 일치하는지 확인만 해주세요.

lib/app/modules/groups/domain/entities/role_entity.dart (1)

2-15: 권한을 enum으로 전환한 것 👍

도메인 타입 안정성/표현력이 좋아집니다. 이후 전역적으로 동일 타입을 일관 적용하면 유지보수에 유리합니다.

lib/app/modules/groups/data/data_sources/remote/group_api.dart (2)

8-8: CreateRoleModel import 추가 OK


116-120: createRole 시그니처 변경 OK

레포지토리와 정합성 맞습니다.

lib/app/modules/groups/data/data_sources/models/create_role_model.dart (1)

10-10: 필드명 permissions 전환 OK

API/도메인 용어 일치 좋아요.

lib/app/modules/groups/data/data_sources/models/role_model.dart (1)

15-16: enum 직렬화/역직렬화 확인 필요

GroupRolePermission의 JSON 매핑이 API가 기대하는 문자열과 일치하는지 확인하세요 — enum에 @jsonvalue와 extension(toJson/fromJson)이 있으나 생성된 part 파일(group_role_permission.g.dart 등)이 저장소에 없어 자동 검증이 불가합니다.

  • 확인 위치: lib/app/modules/groups/data/enums/group_role_permission.dart
  • 사용/영향: lib/app/modules/groups/data/data_sources/models/role_model.dart (permissions: List<GroupRolePermission)), lib/app/modules/groups/data/data_sources/models/create_role_model.dart (permissions: List), lib/app/modules/groups/data/repositories/rest_group_repository.dart (role.permissions.map((p) => p.toJson()).toList())

조치: build_runner로 생성된 group_role_permission.g.dart를 확인해 _$GroupRolePermissionEnumMap의 값들이 ('MEMBER_UPDATE' 등) API가 기대하는 문자열과 정확히 일치하는지 검증하고, 불일치 시 @jsonvalue 또는 변환 로직을 수정하세요.

lib/app/modules/groups/data/enums/group_role_permission.dart (2)

6-34: Enum/Json 매핑 LGTM

권한 값과 서버 전송 문자열이 명확히 일치하도록 잘 정의되어 있습니다.

서버 스키마(permissions 문자열)가 MEMBER_UPDATE 등과 1:1로 일치하는지 최종 확인 부탁드립니다.


4-4: 빌드 코드 생성 의존성 확인됨

pubspec.yaml에 json_annotation, json_serializable, build_runner가 포함되어 있어 json_serializable 코드 생성 설정은 충족됩니다. lib/app/modules/groups/data/enums/group_role_permission.dart의 part 'group_role_permission.g.dart';는 build_runner로 생성 필요.

part 'group_role_permission.g.dart';

@JsonEnum(alwaysCreate: true)
enum GroupRolePermission {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

이거 바꾸는 거 @JsonEnum 중에 fieldRename? 으로 있을걸요?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

fix: create role at app at group creation

3 participants