Bỏ qua, đến nội dung

Tham chiếu API — Departments

Resources

Lấy cây phòng ban

typescript
await agent.resource('departments').list({
  tree: true,
  appends: ['members', 'owners', 'roles', 'parent'],
});

Tạo phòng ban

typescript
await agent.resource('departments').create({
  values: {
    title: 'Phòng Kỹ thuật',
    parentId: parentDeptId,  // null cho phòng ban gốc
  },
});

Cập nhật phòng ban

typescript
await agent.resource('departments').update({
  filterByTk: deptId,
  values: {
    title: 'Phòng Công nghệ',
  },
});

Xóa phòng ban

typescript
await agent.resource('departments').destroy({
  filterByTk: deptId,
});

WARNING

Xóa phòng ban sẽ cascade xóa tất cả phòng ban con. Middleware destroyDepartmentCheck kiểm tra trước khi xóa.

Quản lý thành viên

Thêm thành viên

typescript
await agent.resource('departments.members', deptId).add({
  values: [userId1, userId2],
});

Xóa thành viên

typescript
await agent.resource('departments.members', deptId).remove({
  values: [userId1],
});

Danh sách user không thuộc phòng ban

typescript
await agent.resource('users').listExcludeDept({
  values: { departmentId: deptId },
});

Quản lý Owner (Trưởng phòng)

Đặt làm trưởng phòng

typescript
await agent.resource('departments').setOwner({
  values: {
    userId: userId,
    departmentId: deptId,
  },
});

Thao tác này cập nhật isOwner: true trong bảng departmentsUsers.

Gỡ quyền trưởng phòng

typescript
await agent.resource('departments').removeOwner({
  values: {
    userId: userId,
    departmentId: deptId,
  },
});

Tìm kiếm tổng hợp

typescript
await agent.resource('departments').aggregateSearch({
  values: {
    keyword: 'Nguyễn',
    type: 'user',    // 'user', 'department', hoặc bỏ trống để tìm cả hai
    last: 0,         // cursor cho phân trang
    limit: 10,       // số kết quả tối đa
  },
});

Kết quả trả về:

json
{
  "users": [
    { "id": 1, "username": "nguyenvana", "displayname": "Nguyễn Văn A", ... }
  ],
  "departments": [
    { "id": 10, "title": "Phòng Nguyễn Trãi", "parent": { ... } }
  ]
}

Department Object

TrườngKiểuMô tả
idsnowflakeIdID duy nhất (tạo tự động)
titlestringTên phòng ban
parentIdbigintID phòng ban cha (null nếu là gốc)
isLeafbooleantrue nếu không có phòng ban con
sortintegerThứ tự sắp xếp
childrenhasManyDanh sách phòng ban con
parentbelongsToPhòng ban cha
membersbelongsToManyThành viên (qua departmentsUsers)
ownersbelongsToManyTrưởng phòng (qua departmentsUsers với isOwner: true)
rolesbelongsToManyVai trò (qua departmentsRoles)
createdBybelongsToNgười tạo
updatedBybelongsToNgười cập nhật lần cuối

DepartmentsUsers Object (Bảng liên kết)

TrườngKiểuMô tả
departmentIdbigintID phòng ban
userIdbigintID user
isOwnerbooleantrue nếu là trưởng phòng (mặc định: false)
isMainboolean(Deprecated) Dùng user.mainDepartmentId thay thế

Middleware Pipeline

Plugin đăng ký các middleware sau theo thứ tự:

MiddlewareThời điểmMô tả
setDepartmentsInfoSau auth, trước setCurrentRoleĐưa thông tin phòng ban vào context
setDepartmentOwnersResource middlewareXử lý owners khi lấy dữ liệu phòng ban
destroyDepartmentCheckResource middlewareKiểm tra trước khi xóa phòng ban
updateDepartmentIsLeafResource middlewareCập nhật isLeaf khi thêm/xóa phòng ban con
resetUserDepartmentsCacheResource middlewareXóa cache phòng ban khi có thay đổi
setMainDepartmentResource middlewareXử lý logic phòng ban chính

ACL Snippets

Plugin đăng ký snippet pm.departments cho phép admin truy cập:

departments:*
roles:list
users:list
users:listExcludeDept
users.departments:*
roles.departments:*
departments.members:*

User đã đăng nhập (loggedIn) được phép gọi users:listExcludeDept.