-
-
Notifications
You must be signed in to change notification settings - Fork 206
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. Weβll occasionally send you account related emails.
Already on GitHub? Sign in to your account
feat: migrate 'profile/info' route to nestjs #2420
Changes from all commits
436df25
b8e900a
8018e56
b048487
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Large diffs are not rendered by default.
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -44,7 +44,8 @@ export interface GeneralInfo { | |
aboutMyself?: string | null; | ||
location: Location; | ||
educationHistory?: any | null; | ||
englishLevel?: EnglishLevel | null; | ||
// TODO: String type is too abstract for englishLevel. | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Then why do we have it here? Probably you've misconfigured some BE API decorators, could you please check? |
||
englishLevel?: EnglishLevel | null | string; | ||
languages: string[]; | ||
} | ||
|
||
|
@@ -144,6 +145,7 @@ export interface StageInterviewDetailedFeedback { | |
// This type have to updated to refer to `InterviewFeedbackStepData`, when profile is migrated to nestjs | ||
feedback: | ||
| LegacyFeedback | ||
| object | ||
| { | ||
steps: Record< | ||
string, | ||
|
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
@@ -1,14 +1,21 @@ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import { In, Repository } from 'typeorm'; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import { Injectable } from '@nestjs/common'; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import { InjectRepository } from '@nestjs/typeorm'; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import { StageInterviewFeedbackJson } from '@common/models'; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import { CourseTask } from '@entities/courseTask'; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import { StageInterview } from '@entities/stageInterview'; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import { TaskInterviewStudent } from '@entities/taskInterviewStudent'; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import { UsersService } from 'src/users/users.service'; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import { StageInterviewStudent, Student } from '@entities/index'; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import { AvailableStudentDto } from './dto/available-student.dto'; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import { StageInterviewFeedbackJson, StageInterviewDetailedFeedback } from '@common/models'; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import { CourseTask } from '@entities/courseTask'; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Course, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Mentor, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
StageInterview, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
StageInterviewFeedback, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
StageInterviewStudent, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Student, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
TaskInterviewStudent, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
User, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} from '@entities/index'; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import { TaskType } from '@entities/task'; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import { AvailableStudentDto } from './dto/available-student.dto'; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
@Injectable() | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
export class InterviewsService { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
@@ -19,6 +26,8 @@ export class InterviewsService { | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
readonly taskInterviewStudentRepository: Repository<TaskInterviewStudent>, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
@InjectRepository(Student) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
readonly studentRepository: Repository<Student>, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
@InjectRepository(StageInterview) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
readonly stageInterviewRepository: Repository<StageInterview>, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
readonly userService: UsersService, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
) {} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
@@ -184,4 +193,118 @@ export class InterviewsService { | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
private isGoodCandidate(stageInterviews: StageInterview[]) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return stageInterviews.some(i => i.isCompleted && i.isGoodCandidate); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
async getStageInterviewFeedback(githubId: string): Promise<StageInterviewDetailedFeedback[]> { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const data = await this.stageInterviewRepository | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
.createQueryBuilder('stageInterview') | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
.select('"stageInterview"."decision" AS "decision"') | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
.addSelect('"stageInterview"."isGoodCandidate" AS "isGoodCandidate"') | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
.addSelect('"stageInterview"."score" AS "interviewScore"') | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
.addSelect('"course"."name" AS "courseName"') | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
.addSelect('"course"."fullName" AS "courseFullName"') | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
.addSelect('"stageInterviewFeedback"."json" AS "interviewResultJson"') | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
.addSelect('"stageInterviewFeedback"."updatedDate" AS "interviewFeedbackDate"') | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
.addSelect('"stageInterviewFeedback"."version" AS "feedbackVersion"') | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
.addSelect('"userMentor"."firstName" AS "interviewerFirstName"') | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
.addSelect('"userMentor"."lastName" AS "interviewerLastName"') | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
.addSelect('"userMentor"."githubId" AS "interviewerGithubId"') | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
.addSelect('"courseTask"."maxScore" AS "maxScore"') | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
.leftJoin(Student, 'student', '"student"."id" = "stageInterview"."studentId"') | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
.leftJoin(User, 'user', '"user"."id" = "student"."userId"') | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
.leftJoin(Course, 'course', '"course"."id" = "stageInterview"."courseId"') | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
.leftJoin( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
StageInterviewFeedback, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
'stageInterviewFeedback', | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
'"stageInterview"."id" = "stageInterviewFeedback"."stageInterviewId"', | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
.leftJoin(CourseTask, 'courseTask', '"courseTask"."id" = "stageInterview"."courseTaskId"') | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
.leftJoin(Mentor, 'mentor', '"mentor"."id" = "stageInterview"."mentorId"') | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
.leftJoin(User, 'userMentor', '"userMentor"."id" = "mentor"."userId"') | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
.where('"user"."githubId" = :githubId', { githubId }) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
.andWhere('"stageInterview"."isCompleted" = true') | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
.orderBy('"course"."updatedDate"', 'ASC') | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
.getRawMany(); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return data | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
.map((feedbackData: FeedbackData) => { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
feedbackVersion, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
decision, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
interviewFeedbackDate, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
interviewerFirstName, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
courseFullName, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
courseName, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
interviewerLastName, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
interviewerGithubId, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
isGoodCandidate, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
interviewScore, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
interviewResultJson, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
maxScore, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} = feedbackData; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Comment on lines
+229
to
+243
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const feedbackTemplate = JSON.parse(interviewResultJson) as any; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const { score, feedback } = !feedbackVersion | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
? InterviewsService.parseLegacyFeedback(feedbackTemplate) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
: { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
feedback: feedbackTemplate, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
score: interviewScore ?? 0, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Comment on lines
+246
to
+251
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
version: feedbackVersion ?? 0, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
date: interviewFeedbackDate, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
decision, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
isGoodCandidate, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
courseName, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
courseFullName, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
feedback, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
score, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
interviewer: { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
name: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
this.userService.getFullName({ firstName: interviewerFirstName, lastName: interviewerLastName }) || | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
interviewerGithubId, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
githubId: interviewerGithubId, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
maxScore, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
.filter(Boolean); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Comment on lines
+197
to
+272
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Maybe we should do something like this?
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
/** | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
* @deprecated - should be removed once Artsiom A. makes migration of the legacy feedback format | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I think it's better to attach the issue number instead of writing that Artsiom will do it. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
*/ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
private static parseLegacyFeedback(interviewResult: StageInterviewFeedbackJson) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const { english, programmingTask, resume } = interviewResult; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const { rating, htmlCss, common, dataStructures } = InterviewsService.getInterviewRatings(interviewResult); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
score: rating, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
feedback: { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
english: english.levelMentorOpinion ? english.levelMentorOpinion : english.levelStudentOpinion, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
programmingTask, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
comment: resume.comment, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
skills: { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
htmlCss, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
common, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
dataStructures, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
type FeedbackData = { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
decision: string; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
isGoodCandidate: boolean; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
courseName: string; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
courseFullName: string; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
interviewResultJson: any; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
interviewFeedbackDate: string; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
interviewerFirstName: string; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
interviewerLastName: string; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
interviewerGithubId: string; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
feedbackVersion: null | number; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
interviewScore: null | number; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
maxScore: number; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}; |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,3 +1,5 @@ | ||
export * from './profile-course.dto'; | ||
export * from './update-user.dto'; | ||
export * from './update-profile.dto'; | ||
export * from './profile-info.dto'; | ||
export * from './update-profile-info.dto'; |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,119 @@ | ||
import { ApiProperty } from '@nestjs/swagger'; | ||
import { Type } from 'class-transformer'; | ||
import { IsBoolean, IsOptional } from 'class-validator'; | ||
|
||
export interface Permissions { | ||
isProfileVisible: boolean; | ||
isAboutVisible: boolean; | ||
isEducationVisible: boolean; | ||
isEnglishVisible: boolean; | ||
isEmailVisible: boolean; | ||
isTelegramVisible: boolean; | ||
isSkypeVisible: boolean; | ||
isWhatsAppVisible: boolean; | ||
isPhoneVisible: boolean; | ||
isContactsNotesVisible: boolean; | ||
isLinkedInVisible: boolean; | ||
isPublicFeedbackVisible: boolean; | ||
isMentorStatsVisible: boolean; | ||
isStudentStatsVisible: boolean; | ||
isStageInterviewFeedbackVisible: boolean; | ||
isCoreJsFeedbackVisible: boolean; | ||
isConsentsVisible: boolean; | ||
isExpellingReasonVisible: boolean; | ||
} | ||
|
||
class PublicVisibilitySettings { | ||
@ApiProperty() | ||
@IsBoolean() | ||
all: boolean; | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I'd propose to use more semantic name for this flag, like |
||
} | ||
|
||
class PartialStudentVisibilitySettings extends PublicVisibilitySettings { | ||
@ApiProperty() | ||
@IsBoolean() | ||
student: boolean; | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I'd propose to use more semantic name for this flag, like |
||
} | ||
|
||
class ContactsVisibilitySettings extends PublicVisibilitySettings { | ||
@ApiProperty() | ||
@IsBoolean() | ||
student: boolean; | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Same as above |
||
} | ||
|
||
class VisibilitySettings extends PublicVisibilitySettings { | ||
@ApiProperty() | ||
@IsBoolean() | ||
mentor: boolean; | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Same as above |
||
|
||
@ApiProperty() | ||
@IsBoolean() | ||
student: boolean; | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Same as above |
||
} | ||
|
||
export class ConfigurableProfilePermissions { | ||
@ApiProperty({ required: false, type: PublicVisibilitySettings }) | ||
@Type(() => PublicVisibilitySettings) | ||
@IsOptional() | ||
isProfileVisible?: PublicVisibilitySettings; | ||
|
||
@ApiProperty({ required: false, type: VisibilitySettings }) | ||
@Type(() => VisibilitySettings) | ||
@IsOptional() | ||
isAboutVisible?: VisibilitySettings; | ||
|
||
@ApiProperty({ required: false, type: VisibilitySettings }) | ||
@Type(() => VisibilitySettings) | ||
@IsOptional() | ||
isEducationVisible?: VisibilitySettings; | ||
|
||
@ApiProperty({ required: false, type: PartialStudentVisibilitySettings }) | ||
@Type(() => PartialStudentVisibilitySettings) | ||
@IsOptional() | ||
isEnglishVisible?: PartialStudentVisibilitySettings; | ||
|
||
@ApiProperty({ required: false, type: ContactsVisibilitySettings }) | ||
@Type(() => ContactsVisibilitySettings) | ||
@IsOptional() | ||
isEmailVisible?: ContactsVisibilitySettings; | ||
|
||
@ApiProperty({ required: false, type: ContactsVisibilitySettings }) | ||
@Type(() => ContactsVisibilitySettings) | ||
@IsOptional() | ||
isTelegramVisible?: ContactsVisibilitySettings; | ||
|
||
@ApiProperty({ required: false, type: ContactsVisibilitySettings }) | ||
@Type(() => ContactsVisibilitySettings) | ||
@IsOptional() | ||
isSkypeVisible?: ContactsVisibilitySettings; | ||
|
||
@ApiProperty({ required: false, type: ContactsVisibilitySettings }) | ||
@Type(() => ContactsVisibilitySettings) | ||
@IsOptional() | ||
isPhoneVisible?: ContactsVisibilitySettings; | ||
|
||
@ApiProperty({ required: false, type: ContactsVisibilitySettings }) | ||
@Type(() => ContactsVisibilitySettings) | ||
@IsOptional() | ||
isContactsNotesVisible?: ContactsVisibilitySettings; | ||
|
||
@ApiProperty({ required: false, type: VisibilitySettings }) | ||
@Type(() => VisibilitySettings) | ||
@IsOptional() | ||
isLinkedInVisible?: VisibilitySettings; | ||
|
||
@ApiProperty({ required: false, type: VisibilitySettings }) | ||
@Type(() => VisibilitySettings) | ||
@IsOptional() | ||
isPublicFeedbackVisible?: VisibilitySettings; | ||
|
||
@ApiProperty({ required: false, type: VisibilitySettings }) | ||
@Type(() => VisibilitySettings) | ||
@IsOptional() | ||
isMentorStatsVisible?: VisibilitySettings; | ||
|
||
@ApiProperty({ required: false, type: PartialStudentVisibilitySettings }) | ||
@Type(() => PartialStudentVisibilitySettings) | ||
@IsOptional() | ||
isStudentStatsVisible?: PartialStudentVisibilitySettings; | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I see nothing related with CV above, why do we have CV in name of this variable? π