132 lines
3.9 KiB
TypeScript
132 lines
3.9 KiB
TypeScript
import {
|
|
Body,
|
|
Controller,
|
|
Get,
|
|
HttpCode,
|
|
Param,
|
|
Post,
|
|
Query,
|
|
} from '@nestjs/common';
|
|
import { ResponseSchemaService } from '../services/responseScheme.service';
|
|
import { HttpException } from 'src/exceptions/httpException';
|
|
import { EXCEPTION_CODE } from 'src/enums/exceptionCode';
|
|
import { RECORD_SUB_STATUS } from 'src/enums';
|
|
import { ApiTags } from '@nestjs/swagger';
|
|
import Joi from 'joi';
|
|
import { Logger } from 'src/logger';
|
|
import { SurveyNotFoundException } from 'src/exceptions/surveyNotFoundException';
|
|
import { WhitelistType } from 'src/interfaces/survey';
|
|
import { UserService } from 'src/modules/auth/services/user.service';
|
|
import { WorkspaceMemberService } from 'src/modules/workspace/services/workspaceMember.service';
|
|
|
|
@ApiTags('surveyResponse')
|
|
@Controller('/api/responseSchema')
|
|
export class ResponseSchemaController {
|
|
constructor(
|
|
private readonly responseSchemaService: ResponseSchemaService,
|
|
private readonly logger: Logger,
|
|
private readonly userService: UserService,
|
|
private readonly workspaceMemberService: WorkspaceMemberService,
|
|
) {}
|
|
|
|
@Get('/getSchema')
|
|
@HttpCode(200)
|
|
async getSchema(
|
|
@Query()
|
|
queryInfo: {
|
|
surveyPath: string;
|
|
},
|
|
) {
|
|
if (!queryInfo.surveyPath) {
|
|
throw new HttpException('参数有误', EXCEPTION_CODE.PARAMETER_ERROR);
|
|
}
|
|
const responseSchema =
|
|
await this.responseSchemaService.getResponseSchemaByPath(
|
|
queryInfo.surveyPath,
|
|
);
|
|
if (
|
|
!responseSchema ||
|
|
responseSchema.subStatus.status === RECORD_SUB_STATUS.REMOVED
|
|
) {
|
|
throw new HttpException(
|
|
'问卷已删除',
|
|
EXCEPTION_CODE.RESPONSE_SCHEMA_REMOVED,
|
|
);
|
|
}
|
|
|
|
// 去掉C端的敏感字段
|
|
if (responseSchema.code?.baseConf) {
|
|
responseSchema.code.baseConf.password = null;
|
|
responseSchema.code.baseConf.whitelist = [];
|
|
}
|
|
return {
|
|
code: 200,
|
|
data: responseSchema,
|
|
};
|
|
}
|
|
|
|
// 白名单验证
|
|
@Post('/:surveyPath/validate')
|
|
@HttpCode(200)
|
|
async whitelistValidate(@Param('surveyPath') surveyPath, @Body() body) {
|
|
const { value, error } = Joi.object({
|
|
password: Joi.string().allow(null, ''),
|
|
whitelist: Joi.string().allow(null, ''),
|
|
}).validate(body, { allowUnknown: true });
|
|
|
|
if (error) {
|
|
this.logger.error(`whitelistValidate error: ${error.message}`, {});
|
|
throw new HttpException('参数错误', EXCEPTION_CODE.PARAMETER_ERROR);
|
|
}
|
|
|
|
// 问卷信息
|
|
const schema =
|
|
await this.responseSchemaService.getResponseSchemaByPath(surveyPath);
|
|
if (!schema || schema.subStatus.status === RECORD_SUB_STATUS.REMOVED) {
|
|
throw new SurveyNotFoundException('该问卷不存在,无法提交');
|
|
}
|
|
|
|
const { password, whitelist: whitelistValue } = value;
|
|
const {
|
|
passwordSwitch,
|
|
password: settingPassword,
|
|
whitelistType,
|
|
whitelist,
|
|
} = schema.code.baseConf;
|
|
|
|
// 密码校验
|
|
if (passwordSwitch) {
|
|
if (settingPassword !== password) {
|
|
throw new HttpException('验证失败', EXCEPTION_CODE.WHITELIST_ERROR);
|
|
}
|
|
}
|
|
|
|
// 名单校验(手机号/邮箱)
|
|
if (whitelistType === WhitelistType.CUSTOM) {
|
|
if (!whitelist.includes(whitelistValue)) {
|
|
throw new HttpException('验证失败', EXCEPTION_CODE.WHITELIST_ERROR);
|
|
}
|
|
}
|
|
|
|
// 团队成员昵称校验
|
|
if (whitelistType === WhitelistType.MEMBER) {
|
|
const user = await this.userService.getUserByUsername(whitelistValue);
|
|
if (!user) {
|
|
throw new HttpException('验证失败', EXCEPTION_CODE.WHITELIST_ERROR);
|
|
}
|
|
|
|
const workspaceMember = await this.workspaceMemberService.findAllByUserId(
|
|
{ userId: user._id.toString() },
|
|
);
|
|
if (!workspaceMember.length) {
|
|
throw new HttpException('验证失败', EXCEPTION_CODE.WHITELIST_ERROR);
|
|
}
|
|
}
|
|
|
|
return {
|
|
code: 200,
|
|
data: null,
|
|
};
|
|
}
|
|
}
|