Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions server/src/enums/exceptionCode.ts
Original file line number Diff line number Diff line change
Expand Up @@ -25,4 +25,5 @@ export enum EXCEPTION_CODE {
RESPONSE_PAUSING = 9006, // 问卷已暂停

UPLOAD_FILE_ERROR = 5001, // 上传文件错误
SERVER_ERROR = 5002, // 获取数据失败
}
2 changes: 1 addition & 1 deletion server/src/models/surveyMeta.entity.ts
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ export class SurveyMeta extends BaseEntity {
deletedAt: Date;

@Column()
isCompletedeleted: boolean;
isCompleteDeleted: boolean;

@BeforeInsert()
initDefaultInfo() {
Expand Down
23 changes: 21 additions & 2 deletions server/src/modules/survey/__test/collaborator.service.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -376,9 +376,28 @@ describe('CollaboratorService', () => {
describe('getManageListByUserId', () => {
it('should return a list of collaborators who has manage permission by user id', async () => {
const userId = new ObjectId().toString();


const findSpy = jest.spyOn(repository, 'find').mockResolvedValue([
{
_id: '1',
surveyId: '1',
userId,
permissions: [SURVEY_PERMISSION.SURVEY_COOPERATION_MANAGE],
} as unknown as Collaborator,
]);

const result = await service.getManageListByUserId({ userId });


expect(findSpy).toHaveBeenCalledWith({
where: {
userId,
permissions: {
$elemMatch: {
$eq: SURVEY_PERMISSION.SURVEY_COOPERATION_MANAGE,
},
},
},
});
expect(result).toEqual([
{ _id: '1', surveyId: '1', userId, permissions: [SURVEY_PERMISSION.SURVEY_COOPERATION_MANAGE] },
]);
Expand Down
11 changes: 5 additions & 6 deletions server/src/modules/survey/controllers/recycleBin.controller.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,16 +21,15 @@ export class RecycleBinController {
@Get('')
@HttpCode(200)
async getCount(@Request() req) {


const userId = req.user._id.toString();
let isRecycleBin = true;
// 查询当前用户协作的问卷
let cooperationList = []
cooperationList =
await this.collaboratorService.getManageListByUserId({ userId });
cooperationList = await this.collaboratorService.getManageListByUserId({ userId });
const surveyIdList1 = cooperationList.map((item) => item.surveyId);
const surveyIdList2 = (await this.workspaceService.getAllSurveyIdListByUserId(userId, isRecycleBin)).data.surveyIdList
// 查询当前用户参与的空间下的回收站的问卷
const surveyIdList2 = (await this.workspaceService.getAllSurveyIdListByUserId(userId, true)).data.surveyIdList
const surveyIdList = [...new Set([...surveyIdList1, ...surveyIdList2])];
// 查询回收站中所有问卷总数
const allSurveyTotal =
await this.surveyMetaService.countSurveyMetaByGroupId({
userId,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -116,6 +116,7 @@ export class SurveyMetaController {
await this.collaboratorService.getCollaboratorListByUserId({ userId });
}
if (isRecycleBin) {
// 回收站查询当前用户协作的问卷
cooperationList =
await this.collaboratorService.getManageListByUserId({ userId });
}
Expand All @@ -126,6 +127,7 @@ export class SurveyMetaController {
const surveyIdList1 = cooperationList.map((item) => item.surveyId);
let surveyIdList2 = []
if (isRecycleBin) {
// 回收站查询当前用户参与的空间下的回收站的问卷
surveyIdList2 = (await this.workspaceService.getAllSurveyIdListByUserId(userId, isRecycleBin)).data.surveyIdList
}
const surveyIdList = [...new Set([...surveyIdList1, ...surveyIdList2])];
Expand Down
95 changes: 84 additions & 11 deletions server/src/modules/workspace/_test/workspace.service.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -188,23 +188,96 @@ describe('WorkspaceService', () => {

describe('getAllSurveyIdListByUserId', () => {
it('should return all survey id list of work space under a user', async () => {
const userId = '1';
const isRecycleBin = false;
const workspaceMemberList = [
{ userId: '1', workSpaceId: 'f'}
]
{ userId: '1', workspaceId: 'workspace1' },
{ userId: '1', workspaceId: 'workspace2' }
];
const surveyMetaList = [
{ workSpaceId: 'f', isDeleted: false, _id: 666 },
{ _id: new ObjectId('507f1f77bcf86cd799439011'), workspaceId: 'workspace1' },
{ _id: new ObjectId('507f1f77bcf86cd799439012'), workspaceId: 'workspace2' }
];

jest
.spyOn(mockWorkspaceMemberService, 'findAllByUserId')
.mockResolvedValue(workspaceMemberList as any);
jest
.spyOn(mockSurveyMetaService, 'getSurveyMetaListByWorkspaceIdList')
.mockResolvedValue(surveyMetaList as any)
// Mock WorkspaceMemberService.findAllByUserId
mockWorkspaceMemberService.findAllByUserId.mockResolvedValue(workspaceMemberList);

// Mock SurveyMetaService.getSurveyMetaListByWorkspaceIdList
mockSurveyMetaService.getSurveyMetaListByWorkspaceIdList.mockResolvedValue(surveyMetaList);

const result = await service.getAllSurveyIdListByUserId(userId, isRecycleBin);

// Verify the method calls
expect(mockWorkspaceMemberService.findAllByUserId).toHaveBeenCalledWith({ userId });
expect(mockSurveyMetaService.getSurveyMetaListByWorkspaceIdList).toHaveBeenCalledWith({
workspaceIdList: ['workspace1', 'workspace2'],
isDeleted: isRecycleBin
});

// Verify the result
expect(result).toEqual({
code: 200,
data: {
surveyIdList: [
'507f1f77bcf86cd799439011',
'507f1f77bcf86cd799439012'
]
}
});
});

it('should return empty list when user has no workspace memberships', async () => {
const userId = '1';
const isRecycleBin = true;

// Mock empty workspace member list
mockWorkspaceMemberService.findAllByUserId.mockResolvedValue([]);

// Mock empty survey meta list
mockSurveyMetaService.getSurveyMetaListByWorkspaceIdList.mockResolvedValue([]);

const result = await service.getAllSurveyIdListByUserId(userId, isRecycleBin);

expect(mockWorkspaceMemberService.findAllByUserId).toHaveBeenCalledWith({ userId });
expect(mockSurveyMetaService.getSurveyMetaListByWorkspaceIdList).toHaveBeenCalledWith({
workspaceIdList: [],
isDeleted: isRecycleBin
});

const result = await service.getAllSurveyIdListByUserId('1', false);
expect(result).toEqual({
code: 200,
data: {
surveyIdList: []
}
});
});

it('should handle recycle bin mode correctly', async () => {
const userId = '1';
const isRecycleBin = true;
const workspaceMemberList = [
{ userId: '1', workspaceId: 'workspace1' }
];
const surveyMetaList = [
{ _id: new ObjectId('507f1f77bcf86cd799439011'), workspaceId: 'workspace1' }
];

mockWorkspaceMemberService.findAllByUserId.mockResolvedValue(workspaceMemberList);
mockSurveyMetaService.getSurveyMetaListByWorkspaceIdList.mockResolvedValue(surveyMetaList);

const result = await service.getAllSurveyIdListByUserId(userId, isRecycleBin);

expect(mockSurveyMetaService.getSurveyMetaListByWorkspaceIdList).toHaveBeenCalledWith({
workspaceIdList: ['workspace1'],
isDeleted: true
});

expect(result).toEqual({code: 200, data: {surveyIdList: ['666']}});
expect(result).toEqual({
code: 200,
data: {
surveyIdList: ['507f1f77bcf86cd799439011']
}
});
});
});

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -312,7 +312,7 @@ const onRecover = async (row) => {

const onCompleteDelete = async (row) => {
try {
await ElMessageBox.confirm('将从回收站中永久删除改问卷,是否确认删除?', '提示', {
await ElMessageBox.confirm('将从回收站中永久删除该问卷,是否确认删除?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
Expand Down
12 changes: 7 additions & 5 deletions web/src/management/pages/list/index.vue
Original file line number Diff line number Diff line change
Expand Up @@ -243,8 +243,10 @@ const showExcelImport = ref(false)
const showCreateForm = ref(false)
const questionList = ref<Array<any>>([])
const createMethod = ref('')
const isRecycleBin = ref(false)
const isRecycleBin = computed(() => menuType.value === MenuType.RecycleBin);

const showAIGenerate = ref(false)

const fetchSpaceList = async (params?: any) => {
spaceLoading.value = true
workSpaceStore.changeWorkSpace('')
Expand Down Expand Up @@ -273,22 +275,22 @@ const handleSpaceSelect = async (id: string) => {
workSpaceStore.changeMenuType(MenuType.PersonalGroup)
workSpaceStore.changeWorkSpace('')
await fetchGroupList()
isRecycleBin.value = false
// isRecycleBin.value = false
break
case MenuType.SpaceGroup:
workSpaceStore.changeMenuType(MenuType.SpaceGroup)
workSpaceStore.changeWorkSpace('')
await fetchSpaceList()
isRecycleBin.value = false
// isRecycleBin.value = false
break
case MenuType.RecycleBin:
workSpaceStore.changeMenuType(MenuType.RecycleBin)
workSpaceStore.changeWorkSpace('')
isRecycleBin.value = true
// isRecycleBin.value = true
await fetchSurveyList()
break
default: {
isRecycleBin.value = false
// isRecycleBin.value = false
const parentMenu = spaceMenus.value.find((parent: any) =>
parent.children.find((children: any) => children.id.toString() === id)
)
Expand Down
4 changes: 3 additions & 1 deletion web/src/management/stores/workSpace.ts
Original file line number Diff line number Diff line change
Expand Up @@ -251,11 +251,13 @@ export const useWorkSpaceStore = defineStore('workSpace', () => {


async function getRecycleBinCount(params?: any) {
const recycleBinMenu = spaceMenus.value.find(menu => menu.id === MenuType.RecycleBin);

try {
const res: any = await getRecycleBinCountReq(params)
if (res.code === CODE_MAP.SUCCESS) {
const { count } = res.data
spaceMenus.value[2].count = count
recycleBinMenu && (recycleBinMenu.count = count)
} else {
ElMessage.error('getRecycleBinCount' + res.errmsg)
}
Expand Down
Loading