feat: add organization-based document management - #47
Conversation
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: Organization UI Review profile: CHILL Plan: Pro Plus Run ID: 📒 Files selected for processing (4)
🚧 Files skipped from review as they are similar to previous changes (2)
📝 WalkthroughWalkthrough조직, 멤버십, 문서 소유권과 공유 기능을 추가했습니다. 문서 업로드와 조회 권한을 조직 기반으로 전환했습니다. 조직 관리 API와 PostgreSQL E2E 테스트를 추가했습니다. Changes조직 기반 문서 관리
Estimated code review effort: 5 (Critical) | ~120 minutes Sequence Diagram(s)sequenceDiagram
participant 관리자
participant UploadController
participant OrganizationAccessService
participant OrganizationsRepository
관리자->>UploadController: 문서 작업 요청
UploadController->>OrganizationAccessService: 조직 권한 검증
OrganizationAccessService->>OrganizationsRepository: 멤버십과 문서 접근 상태 조회
OrganizationsRepository-->>OrganizationAccessService: 접근 상태 반환
OrganizationAccessService-->>UploadController: 권한 결정 반환
UploadController->>OrganizationsRepository: 문서 변경·공유·이전 요청
OrganizationsRepository-->>UploadController: 변경 결과 반환
Possibly related PRs
Poem
🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✨ Finishing Touches🧪 Generate unit tests (beta)
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. Comment |
|
@coderabbitai review |
✅ Action performedReview finished.
|
There was a problem hiding this comment.
Pull request overview
Adds an organization/membership layer to the admin document-management domain so documents are owned by an organization, can be shared to other organizations, and enforce MANAGER/MEMBER/SUPER_ADMIN permissions across upload/list/view/manage/share/transfer flows (while keeping the global chatbot retrieval behavior intact).
Changes:
- Introduces organizations + memberships + document share/transfer persistence (schema + migrations) and corresponding admin APIs.
- Refactors upload/document operations to be organization-aware, including new
GET /upload/manageable, org document listing, and share/transfer endpoints. - Adds extensive unit + e2e coverage for org permissions, atomicity/locking invariants, and retrieval-global invariants.
Reviewed changes
Copilot reviewed 33 out of 33 changed files in this pull request and generated 2 comments.
Show a summary per file
| File | Description |
|---|---|
| test/organizations.e2e-spec.ts | E2E coverage for org admin controller (create org, invite/accept). |
| test/organization-database.e2e-spec.ts | DB-backed E2E invariants for membership/doc access, manageable listing, sharing/transfer, and retrieval scope. |
| src/upload/upload.service.ts | Refactors upload/document operations to enforce organization-based permissions and share/transfer. |
| src/upload/upload.service.spec.ts | Updates unit tests for org-aware upload service behaviors and access redaction. |
| src/upload/upload.module.ts | Wires OrganizationsModule + adds org document controller. |
| src/upload/upload.controller.ts | Updates upload APIs (remove super-admin-only restriction, add manageable/share/transfer/org-doc endpoints). |
| src/upload/dto/transfer-document.dto.ts | Adds DTO for transfer request payload. |
| src/upload/dto/document-list-item.dto.ts | Extends document list DTO with owner org/uploader/share/access metadata. |
| src/upload/dto/document-list-item.dto.spec.ts | Swagger schema probe to ensure nested DTOs are emitted properly. |
| src/retrieval/retrieval.repository.spec.ts | Adds invariant test asserting retrieval remains organization-agnostic. |
| src/pdf-processor/pdf-processor.worker.spec.ts | Updates worker tests for new ownerOrganizationId field and stricter option typing. |
| src/pdf-processor/documents.repository.ts | Adjusts uploader listing to include org-membership gating and SUPER_ADMIN revalidation. |
| src/organizations/organizations.service.ts | Implements org operations (create/list orgs, membership management, invitation accept/reject). |
| src/organizations/organizations.service.spec.ts | Unit tests for OrganizationsService behavior/error mapping. |
| src/organizations/organizations.repository.ts | Adds transactional org/membership/document share+transfer repository with locking/reauth. |
| src/organizations/organizations.repository.spec.ts | Source-level invariant tests around locking/transfer behavior. |
| src/organizations/organizations.module.ts | Declares org module providers/controllers and exports access/repo. |
| src/organizations/organizations.controller.ts | Adds admin HTTP API for orgs/memberships/invitations. |
| src/organizations/organization.types.ts | Defines shared org/document principal + access decision types. |
| src/organizations/organization-access.service.ts | Centralizes request-time authorization + upload-org resolution with DB revalidation. |
| src/organizations/organization-access.service.spec.ts | Unit tests for org/document access decisions and SUPER_ADMIN demotion safety. |
| src/organizations/organization-access.policy.ts | Pure policy function to evaluate per-document access decisions. |
| src/organizations/dto/organization.dto.ts | DTOs + validation for org create/list responses. |
| src/organizations/dto/membership.dto.ts | DTOs + validation for membership invite/update and invitation listing. |
| src/main.ts | Updates Swagger tags to reflect org-based document management. |
| src/db/schema.ts | Adds org/membership/share/transfer tables and document owner organization FK/relations. |
| src/db/organizations.schema.spec.ts | Asserts migration SQL creates/backfills org ownership + constraints correctly. |
| src/db/migration-lock.spec.ts | Tests advisory-lock wrapper used to serialize migrations. |
| src/db/index.ts | Adds advisory locking around migrations to prevent concurrent migrators. |
| src/app.module.ts | Registers OrganizationsModule in the main app module. |
| drizzle/meta/_journal.json | Registers new drizzle migration entry. |
| drizzle/0014_unique_dracula.sql | Migration creating org tables, backfilling documents + SUPER_ADMIN membership, constraints/indexes. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| this.assertDocumentMutation(result); | ||
| if (result.kind !== 'ok') { | ||
| throw new ConflictException('Upload reservation state changed'); | ||
| } | ||
| record = result.document; |
| it('treats empty/undefined as null', () => { | ||
| expect(parseExpiresAt(undefined)).toBeNull(); | ||
| expect(parseExpiresAt(null)).toBeNull(); | ||
| expect(parseExpiresAt('')).toBeNull(); | ||
| expect(parseExpiresAt(' ')).toBeNull(); | ||
| }); |
There was a problem hiding this comment.
Actionable comments posted: 7
🧹 Nitpick comments (8)
src/organizations/organization.types.ts (1)
3-7: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win
role을 admin 역할 유니온 타입으로 좁히세요.
role: string은 오타를 허용합니다.organizations.repository.ts는principal.role !== 'SUPER_ADMIN'비교로 권한을 판정하므로, 잘못된 문자열이 조용히 권한 없음으로 처리됩니다.adminRoleEnum기반 타입을 사용하면 컴파일 시점에 오류를 잡을 수 있습니다.♻️ 제안 리팩터
-import type { Document, OrganizationRole } from '../db'; +import type { Document, OrganizationRole } from '../db'; +import type { adminRoleEnum } from '../db/schema'; + +export type AdminRole = (typeof adminRoleEnum.enumValues)[number]; export interface AdminPrincipal { uuid: string; email: string; - role: string; + role: AdminRole; }🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@src/organizations/organization.types.ts` around lines 3 - 7, Update the role field in AdminPrincipal to use the admin role union type derived from adminRoleEnum instead of string, reusing the existing enum-based type definition so invalid role literals are rejected at compile time and comparisons in organizations.repository.ts remain type-safe.src/organizations/organizations.repository.spec.ts (1)
4-48: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win소스 텍스트 검증 대신 동작 검증으로 바꾸세요.
이 테스트는
organizations.repository.ts의 문자열을 검사합니다. 두 가지 약점이 있습니다.
- Line 26은 줄바꿈과 들여쓰기를 포함한 정확한 서식을 기대합니다. Prettier 설정이나 인자 배치가 바뀌면 동작이 정상이어도 실패합니다.
- 문자열이 존재해도 실행 순서나 권한 판정이 올바르다는 보장은 없습니다. 예를 들어 잠금이 권한 확인보다 뒤에 실행되어도 이 테스트는 통과합니다.
Drizzle 트랜잭션 더블을 주입해 호출 순서(
FOR UPDATE→ 권한 확인 → 업데이트)와 반환 결과 종류를 검증하는 방식을 권장합니다. Line 43의source.indexOf('async setShare')기준 슬라이스도 메서드가 추가되면 의도와 다른 범위를 검사합니다.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@src/organizations/organizations.repository.spec.ts` around lines 4 - 48, Replace the source-text assertions in the “OrganizationsRepository concurrency invariants” tests with behavioral tests using an injected Drizzle transaction double. Exercise the relevant repository methods and verify the required order—document row FOR UPDATE, organization locking, authorization evaluation, then conditional update—and assert the returned result kinds. Remove the formatting-sensitive transfer-section slice check and directly verify that share/transfer operations do not modify chunks or processing state.drizzle/0014_unique_dracula.sql (1)
44-49: 🗄️ Data Integrity & Integration | 🔵 Trivial | 💤 Low value기본 조직 upsert는 안전합니다. 다만 재적용 시 위험을 확인하세요.
organizations테이블은 같은 마이그레이션에서 생성되므로, 최초 적용 시ON CONFLICT는 실행되지 않습니다. 이후 다른 조직이is_default = true로 설정된 상태에서 이 문장을 다시 실행하면,organizations_single_default_unique인덱스 때문에 실패합니다. 재실행 경로가 없다면 조치는 필요하지 않습니다.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@drizzle/0014_unique_dracula.sql` around lines 44 - 49, 이 마이그레이션이 재실행될 수 있는 경로가 있는지 확인하고, 재실행된다면 organizations의 기존 기본 조직을 해제한 뒤 해당 upsert가 organizations_single_default_unique 제약을 위반하지 않도록 수정하세요. 재실행 경로가 없다면 현재 INSERT ... ON CONFLICT 구문은 변경하지 마세요.src/organizations/organizations.service.spec.ts (1)
104-334: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win초대/멤버십 충돌 및 성공 경로에 대한 테스트를 추가하십시오.
현재 테스트 스위트는 권한 재검증(TOCTOU), 마지막 매니저 보호, 초대 소유권 검증을 잘 다룹니다. 하지만 다음 경로는 테스트되지 않았습니다.
createOrganization의 slug 중복(ConflictException) 매핑.inviteMember의 초대/멤버십 중복(ConflictException) 매핑.removeMember의 성공 경로(정상 삭제).acceptInvitation이 저장소에서 falsy 값을 반환할 때 발생하는 "Invitation is no longer pending"ConflictException.rejectInvitation의 성공 경로와 "이미 처리됨"ConflictException경로.listMembers,listInvitations의 매핑 동작.이 경로들은 동일한 권한 민감 흐름에 속하므로, 회귀가 발생해도 현재 테스트로는 감지되지 않습니다.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@src/organizations/organizations.service.spec.ts` around lines 104 - 334, Extend the OrganizationsService tests to cover the missing conflict and success paths: verify createOrganization maps repository slug conflicts to ConflictException, inviteMember maps invitation or membership conflicts similarly, and removeMember completes successfully. Add acceptInvitation coverage for a falsy repository result, rejectInvitation coverage for both successful rejection and already-processed ConflictException, and verify listMembers and listInvitations return their expected mapped DTOs.src/retrieval/retrieval.repository.spec.ts (1)
24-36: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win소스 텍스트 매칭 테스트는 리팩터링에 취약합니다.
이 테스트는
retrieval.repository.ts의 원문을 문자열로 검사합니다. 코드 포맷팅이나 조건식을 동일한 의미로 재작성하면, 동작은 그대로여도 테스트가 실패합니다.
process.cwd()대신__dirname을 사용하는 것을 권장합니다.__dirname은 이 스펙 파일의 위치를 기준으로 하므로, 테스트 실행 디렉터리에 관계없이 안정적으로 대상 파일을 찾습니다.가능하다면 조직 스코프가 실제로 적용되지 않음을 검증하는 동작 기반 테스트(예: 쿼리 조건 목록을 모킹해 검사)로 전환하는 것을 고려하십시오.
♻️ __dirname 사용 제안
-import { join } from 'path'; +import { join } from 'path'; ... - const source = readFileSync( - join(process.cwd(), 'src', 'retrieval', 'retrieval.repository.ts'), - 'utf8', - ); + const source = readFileSync( + join(__dirname, 'retrieval.repository.ts'), + 'utf8', + );🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@src/retrieval/retrieval.repository.spec.ts` around lines 24 - 36, Update the fixture path construction in the “retrieval organization scope invariant” test to resolve retrieval.repository.ts from the spec file’s location using __dirname instead of process.cwd(), preserving the existing assertions. Prefer replacing source-text matching with a behavior-based test that mocks or inspects the query conditions when feasible, without changing the invariant being verified.src/upload/upload.service.ts (1)
493-505: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value
assertDocumentMutation을 assertion 서명으로 바꾸십시오.이 메서드는
ok가 아닌 모든 종류에서 예외를 던집니다. 그러나 반환 타입이void이므로 호출부(예: 205, 241-243, 264-266, 294-296, 346-348)마다 도달 불가한kind !== 'ok'분기를 유지해야 합니다. assertion 서명을 사용하면 타입 좁히기가 적용되고 중복 분기를 제거합니다.♻️ 제안: assertion 서명 적용
- private assertDocumentMutation(result: { - kind: 'ok' | 'not_found' | 'stale_owner' | 'forbidden' | 'state_changed'; - }): void { + private assertDocumentMutation<T extends { kind: string }>( + result: T, + ): asserts result is Extract<T, { kind: 'ok' }> { if (result.kind === 'ok') return;🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@src/upload/upload.service.ts` around lines 493 - 505, Update assertDocumentMutation in UploadService to use an assertion return signature that narrows result.kind to 'ok' after successful validation. Preserve the existing exceptions for every non-ok kind so callers can remove redundant kind !== 'ok' branches and rely on the assertion for type narrowing.src/pdf-processor/documents.repository.ts (1)
62-90: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick winsuper-admin 판정 SQL이 조직 저장소와 중복됩니다.
src/organizations/organizations.repository.ts:1087-1096의currentSuperAdminCondition이 같은adminsEXISTS 조건을 이미 정의합니다. 권한 술어가 두 파일에 중복되면 정책 변경 시 한쪽만 수정될 위험이 있습니다. 공용 헬퍼로 추출해 두 저장소가 같은 조건을 사용하도록 하십시오.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@src/pdf-processor/documents.repository.ts` around lines 62 - 90, Extract the duplicated SUPER_ADMIN admins EXISTS predicate from the document repository’s currentSuperAdmin logic and the organizations repository’s currentSuperAdminCondition into a shared helper. Update both repository queries to reuse that helper while preserving the existing principal role check and authorization behavior.src/upload/upload.controller.ts (1)
79-99: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick winlimit/offset 검증이 세 엔드포인트에 중복됩니다.
같은 파싱·검증 블록이
listMyUploads(79-99),listManageableDocuments(127-147),OrganizationDocumentsController.list(441-462)에 반복됩니다. 전용 파이프 또는 공용 헬퍼로 추출하면 규칙 변경 시 한 곳만 수정합니다.♻️ 제안: 공용 파싱 헬퍼 추출
+function parsePaging(limit?: string, offset?: string) { + const limitNum = limit != null ? parseInt(limit, 10) : undefined; + const offsetNum = offset != null ? parseInt(offset, 10) : undefined; + if (limit != null && (Number.isNaN(limitNum) || (limitNum as number) < 1)) { + throw new BadRequestException('limit must be a positive number'); + } + if (offset != null && (Number.isNaN(offsetNum) || (offsetNum as number) < 0)) { + throw new BadRequestException('offset must be a non-negative number'); + } + return { limit: limitNum, offset: offsetNum }; +}🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@src/upload/upload.controller.ts` around lines 79 - 99, Extract the repeated limit/offset parsing and validation from listMyUploads, listManageableDocuments, and OrganizationDocumentsController.list into one shared helper or dedicated pipe. Update all three endpoints to use it while preserving the existing positive-limit, non-negative-offset, and BadRequestException behavior.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@src/db/index.ts`:
- Around line 82-85: Update the migration flow around withMigrationAdvisoryLock
to reserve one physical connection from the postgres({ max: 1 }) instance before
running migrations. Execute pg_advisory_lock, migrate, and pg_advisory_unlock on
that reserved connection, then always call release() after completion, including
failure paths.
- Around line 27-38: Update withMigrationAdvisoryLock to bound the wait for
MIGRATION_LOCK_SQL, using a lock timeout or bounded pg_try_advisory_lock retry
strategy. In its finally block, handle MIGRATION_UNLOCK_SQL failures by
recording them without replacing the operation’s original error, while
preserving normal unlock behavior when it succeeds.
In `@src/organizations/organization-access.service.ts`:
- Around line 20-22: createOrganization 경로에서 JWT의 role 클레임만 확인하지 말고
OrganizationAccessService.isCurrentSuperAdmin(principal)을 호출해 DB의 최신 SUPER_ADMIN
권한을 재검증하도록 변경하세요. 기존 isSuperAdmin 및 SuperAdminGuard의 클레임 기반 확인은 보조 검증으로만 유지하고,
권한이 회수된 사용자는 토큰이 만료되지 않았어도 거부되게 하세요.
In `@src/organizations/organizations.repository.ts`:
- Around line 1049-1063: Remove the broad LOCK TABLE statement from
isSoleNormalizedAdminIdentity and add the proposed unique functional index on
lower(trim(email)) through the appropriate migration. Preserve the
normalized-email lookup and actorIdpUuid validation, relying on the index to
enforce uniqueness without blocking unrelated admins INSERT or UPDATE
operations.
- Around line 204-233: Update createInvitation in
src/organizations/organizations.repository.ts (lines 204-233) to check, after
locking the organization, for an existing membership matching the invitee email
or memberIdpUuid and return an explicit result when one exists instead of
inserting a duplicate; update the related schema definitions in src/db/schema.ts
(lines 139-148) with a status-independent organization_id/invitee_email unique
index, and ensure its migration removes existing duplicate rows before creating
the index.
- Around line 623-659: Update the ordering in listOrganizationDocuments and
listManageableDocuments to use documents.createdAt descending followed by
documents.id as a deterministic tie-breaker. Apply the same ordering to both the
paginated ID query and the final document query so pagination and returned
results remain consistent.
In `@test/organization-database.e2e-spec.ts`:
- Around line 928-936: Update the documentChunks insert near the returned chunk
to explicitly populate the required description field, using description: '' or
the appropriate chunk description while preserving the existing values.
---
Nitpick comments:
In `@drizzle/0014_unique_dracula.sql`:
- Around line 44-49: 이 마이그레이션이 재실행될 수 있는 경로가 있는지 확인하고, 재실행된다면 organizations의 기존
기본 조직을 해제한 뒤 해당 upsert가 organizations_single_default_unique 제약을 위반하지 않도록 수정하세요.
재실행 경로가 없다면 현재 INSERT ... ON CONFLICT 구문은 변경하지 마세요.
In `@src/organizations/organization.types.ts`:
- Around line 3-7: Update the role field in AdminPrincipal to use the admin role
union type derived from adminRoleEnum instead of string, reusing the existing
enum-based type definition so invalid role literals are rejected at compile time
and comparisons in organizations.repository.ts remain type-safe.
In `@src/organizations/organizations.repository.spec.ts`:
- Around line 4-48: Replace the source-text assertions in the
“OrganizationsRepository concurrency invariants” tests with behavioral tests
using an injected Drizzle transaction double. Exercise the relevant repository
methods and verify the required order—document row FOR UPDATE, organization
locking, authorization evaluation, then conditional update—and assert the
returned result kinds. Remove the formatting-sensitive transfer-section slice
check and directly verify that share/transfer operations do not modify chunks or
processing state.
In `@src/organizations/organizations.service.spec.ts`:
- Around line 104-334: Extend the OrganizationsService tests to cover the
missing conflict and success paths: verify createOrganization maps repository
slug conflicts to ConflictException, inviteMember maps invitation or membership
conflicts similarly, and removeMember completes successfully. Add
acceptInvitation coverage for a falsy repository result, rejectInvitation
coverage for both successful rejection and already-processed ConflictException,
and verify listMembers and listInvitations return their expected mapped DTOs.
In `@src/pdf-processor/documents.repository.ts`:
- Around line 62-90: Extract the duplicated SUPER_ADMIN admins EXISTS predicate
from the document repository’s currentSuperAdmin logic and the organizations
repository’s currentSuperAdminCondition into a shared helper. Update both
repository queries to reuse that helper while preserving the existing principal
role check and authorization behavior.
In `@src/retrieval/retrieval.repository.spec.ts`:
- Around line 24-36: Update the fixture path construction in the “retrieval
organization scope invariant” test to resolve retrieval.repository.ts from the
spec file’s location using __dirname instead of process.cwd(), preserving the
existing assertions. Prefer replacing source-text matching with a behavior-based
test that mocks or inspects the query conditions when feasible, without changing
the invariant being verified.
In `@src/upload/upload.controller.ts`:
- Around line 79-99: Extract the repeated limit/offset parsing and validation
from listMyUploads, listManageableDocuments, and
OrganizationDocumentsController.list into one shared helper or dedicated pipe.
Update all three endpoints to use it while preserving the existing
positive-limit, non-negative-offset, and BadRequestException behavior.
In `@src/upload/upload.service.ts`:
- Around line 493-505: Update assertDocumentMutation in UploadService to use an
assertion return signature that narrows result.kind to 'ok' after successful
validation. Preserve the existing exceptions for every non-ok kind so callers
can remove redundant kind !== 'ok' branches and rely on the assertion for type
narrowing.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: CHILL
Plan: Pro Plus
Run ID: 96304784-9588-4610-b198-64edd856a4a3
📒 Files selected for processing (33)
drizzle/0014_unique_dracula.sqldrizzle/meta/0014_snapshot.jsondrizzle/meta/_journal.jsonsrc/app.module.tssrc/db/index.tssrc/db/migration-lock.spec.tssrc/db/organizations.schema.spec.tssrc/db/schema.tssrc/main.tssrc/organizations/dto/membership.dto.tssrc/organizations/dto/organization.dto.tssrc/organizations/organization-access.policy.tssrc/organizations/organization-access.service.spec.tssrc/organizations/organization-access.service.tssrc/organizations/organization.types.tssrc/organizations/organizations.controller.tssrc/organizations/organizations.module.tssrc/organizations/organizations.repository.spec.tssrc/organizations/organizations.repository.tssrc/organizations/organizations.service.spec.tssrc/organizations/organizations.service.tssrc/pdf-processor/documents.repository.tssrc/pdf-processor/pdf-processor.worker.spec.tssrc/retrieval/retrieval.repository.spec.tssrc/upload/dto/document-list-item.dto.spec.tssrc/upload/dto/document-list-item.dto.tssrc/upload/dto/transfer-document.dto.tssrc/upload/upload.controller.tssrc/upload/upload.module.tssrc/upload/upload.service.spec.tssrc/upload/upload.service.tstest/organization-database.e2e-spec.tstest/organizations.e2e-spec.ts
|
@coderabbitai review |
✅ Action performedReview finished.
|
|
@coderabbitai review |
✅ Action performedReview finished.
|
Changes
MANAGER/MEMBER권한 추가GET /upload/manageable추가 및 기존/upload동작 유지SUPER_ADMIN을 기본infoteam조직으로 migrationValidation
Deployment Note
Migration 적용 시 기존 backend writer를 중지한 뒤 DB를 백업하고, migration 완료 후 새 버전만 실행해야 함
Summary by CodeRabbit
새 기능
개선
테스트