mirror of
https://github.com/yangshun/tech-interview-handbook.git
synced 2025-07-29 13:13:54 +08:00
[offers][feat] add edit profile endpoint
This commit is contained in:
@ -66,10 +66,9 @@ function Test() {
|
||||
},
|
||||
offers: [
|
||||
{
|
||||
// Comments: '',
|
||||
companyId: 'cl95u79f000007im531ysjg79',
|
||||
job: {
|
||||
base: {
|
||||
|
||||
OffersFullTime: {
|
||||
baseSalary: {
|
||||
currency: 'SGD',
|
||||
value: 84000,
|
||||
},
|
||||
@ -89,16 +88,16 @@ function Test() {
|
||||
value: 104100,
|
||||
},
|
||||
},
|
||||
// Comments: '',
|
||||
companyId: 'cl95u79f000007im531ysjg79',
|
||||
jobType: 'FULLTIME',
|
||||
location: 'Singapore, Singapore',
|
||||
monthYearReceived: new Date('2022-09-30T07:58:54.000Z'),
|
||||
negotiationStrategy: 'Leveraged having multiple offers',
|
||||
},
|
||||
{
|
||||
comments: undefined,
|
||||
companyId: 'cl95u79f000007im531ysjg79',
|
||||
job: {
|
||||
base: {
|
||||
OffersFullTime: {
|
||||
baseSalary: {
|
||||
currency: 'SGD',
|
||||
value: 84000,
|
||||
},
|
||||
@ -118,6 +117,8 @@ function Test() {
|
||||
value: 104100,
|
||||
},
|
||||
},
|
||||
comments: undefined,
|
||||
companyId: 'cl95u79f000007im531ysjg79',
|
||||
jobType: 'FULLTIME',
|
||||
location: 'Singapore, Singapore',
|
||||
monthYearReceived: new Date('2022-09-30T07:58:54.000Z'),
|
||||
@ -127,12 +128,12 @@ function Test() {
|
||||
});
|
||||
};
|
||||
|
||||
const profileId = 'cl95u9ju500eo7ipd54kurv8d'; // Remember to change this filed after testing deleting
|
||||
const profileId = 'cl96stky5002ew32gx2kale2x'; // Remember to change this filed after testing deleting
|
||||
const data = trpc.useQuery([
|
||||
`offers.profile.listOne`,
|
||||
{
|
||||
profileId,
|
||||
token: 'dccc05133962013ba8b4ee396e51baee1b53a66051732b48fd015129ae1d593e',
|
||||
token: 'afca11e436d21bde24543718fa957c6c625335439dc504f24ee35eae7b5ef1ba',
|
||||
},
|
||||
], {
|
||||
onError(err) {
|
||||
@ -145,16 +146,385 @@ function Test() {
|
||||
const handleDelete = (id: string) => {
|
||||
deleteMutation.mutate({
|
||||
profileId: id,
|
||||
token: 'dccc05133962013ba8b4ee396e51baee1b53a66051732b48fd015129ae1d593e',
|
||||
token: 'afca11e436d21bde24543718fa957c6c625335439dc504f24ee35eae7b5ef1ba',
|
||||
});
|
||||
};
|
||||
|
||||
const updateMutation = trpc.useMutation(['offers.profile.update'], {
|
||||
onError(err: any) {
|
||||
alert(err);
|
||||
},
|
||||
onSuccess(response) {
|
||||
setCreatedData(JSON.stringify(response));
|
||||
},
|
||||
});
|
||||
|
||||
const handleUpdate = () => {
|
||||
updateMutation.mutate({
|
||||
background: {
|
||||
educations: [
|
||||
{
|
||||
backgroundId: "cl96stky6002fw32g6vj4meyr",
|
||||
endDate: new Date("2018-09-30T07:58:54.000Z"),
|
||||
field: "Computer Science",
|
||||
id: "cl96stky6002gw32gey2ffawd",
|
||||
school: "National University of Singapore",
|
||||
startDate: new Date("2014-09-30T07:58:54.000Z"),
|
||||
type: "Bachelors"
|
||||
}
|
||||
],
|
||||
experiences: [
|
||||
{
|
||||
backgroundId: "cl96stky6002fw32g6vj4meyr",
|
||||
company: {
|
||||
createdAt: new Date("2022-10-12T16:19:05.196Z"),
|
||||
description: "Meta Platforms, Inc., doing business as Meta and formerly named Facebook, Inc., and TheFacebook, Inc., is an American multinational technology conglomerate based in Menlo Park, California. The company owns Facebook, Instagram, and WhatsApp, among other products and services.",
|
||||
id: "cl95u79f000007im531ysjg79",
|
||||
logoUrl: "https://logo.clearbit.com/meta.com",
|
||||
name: "Meta",
|
||||
slug: "meta",
|
||||
updatedAt: new Date("2022-10-12T16:19:05.196Z")
|
||||
},
|
||||
companyId: "cl95u79f000007im531ysjg79",
|
||||
durationInMonths: 24,
|
||||
id: "cl96stky6002iw32gpt6t87s2",
|
||||
jobType: "FULLTIME",
|
||||
level: "Junior",
|
||||
monthlySalary: null,
|
||||
monthlySalaryId: null,
|
||||
specialization: "Front End",
|
||||
title: "Software Engineer",
|
||||
totalCompensation: {
|
||||
currency: "SGD",
|
||||
id: "cl96stky6002jw32g73svfacr",
|
||||
value: 104100
|
||||
},
|
||||
totalCompensationId: "cl96stky6002jw32g73svfacr"
|
||||
}
|
||||
],
|
||||
id: "cl96stky6002fw32g6vj4meyr",
|
||||
offersProfileId: "cl96stky5002ew32gx2kale2x",
|
||||
specificYoes: [
|
||||
{
|
||||
backgroundId: "cl96stky6002fw32g6vj4meyr",
|
||||
domain: "Backend",
|
||||
id: "cl96t7890004tw32g5in3px5j",
|
||||
yoe: 2
|
||||
},
|
||||
{
|
||||
backgroundId: "cl96stky6002fw32g6vj4meyr",
|
||||
domain: "Backend",
|
||||
id: "cl96tb87x004xw32gnu17jbzv",
|
||||
yoe: 2
|
||||
},
|
||||
{
|
||||
backgroundId: "cl96stky6002fw32g6vj4meyr",
|
||||
domain: "Backend",
|
||||
id: "cl976t39z00007iygt3np3cgo",
|
||||
yoe: 2
|
||||
},
|
||||
{
|
||||
backgroundId: "cl96stky6002fw32g6vj4meyr",
|
||||
domain: "Front End",
|
||||
id: "cl96stky7002mw32gn4jc7uml",
|
||||
yoe: 2
|
||||
},
|
||||
{
|
||||
backgroundId: "cl96stky6002fw32g6vj4meyr",
|
||||
domain: "Full Stack",
|
||||
id: "cl96stky7002nw32gpprghtxr",
|
||||
yoe: 2
|
||||
},
|
||||
{
|
||||
backgroundId: "cl96stky6002fw32g6vj4meyr",
|
||||
domain: "Backend",
|
||||
id: "cl976we5h000p7iygiomdo9fh",
|
||||
yoe: 2
|
||||
}
|
||||
],
|
||||
totalYoe: 6
|
||||
},
|
||||
createdAt: "2022-10-13T08:28:13.518Z",
|
||||
discussion: [],
|
||||
id: "cl96stky5002ew32gx2kale2x",
|
||||
isEditable: true,
|
||||
offers: [
|
||||
{
|
||||
OffersFullTime: {
|
||||
baseSalary: {
|
||||
currency: "SGD",
|
||||
id: "cl976t4de00067iyg3pjir7k9",
|
||||
value: 1999999999
|
||||
},
|
||||
baseSalaryId: "cl976t4de00067iyg3pjir7k9",
|
||||
bonus: {
|
||||
currency: "SGD",
|
||||
id: "cl976t4de00087iygcnlmh8aw",
|
||||
value: 1410065407
|
||||
},
|
||||
bonusId: "cl976t4de00087iygcnlmh8aw",
|
||||
id: "cl976t4de00057iygq3ktce3v",
|
||||
level: "EXPERT",
|
||||
specialization: "FRONTEND",
|
||||
stocks: {
|
||||
currency: "SGD",
|
||||
id: "cl976t4df000a7iygkrsgr1xh",
|
||||
value: -558038585
|
||||
},
|
||||
stocksId: "cl976t4df000a7iygkrsgr1xh",
|
||||
title: "Software Engineer",
|
||||
totalCompensation: {
|
||||
currency: "SGD",
|
||||
id: "cl976t4df000c7iyg73ryf5uw",
|
||||
value: 55555555
|
||||
},
|
||||
totalCompensationId: "cl976t4df000c7iyg73ryf5uw"
|
||||
},
|
||||
OffersIntern: null,
|
||||
comments: "this IS SO IEUHDAEUIGDI",
|
||||
company: {
|
||||
createdAt: new Date("2022-10-12T16:19:05.196Z"),
|
||||
description: "Meta Platforms, Inc., doing business as Meta and formerly named Facebook, Inc., and TheFacebook, Inc., is an American multinational technology conglomerate based in Menlo Park, California. The company owns Facebook, Instagram, and WhatsApp, among other products and services.",
|
||||
id: "cl95u79f000007im531ysjg79",
|
||||
logoUrl: "https://logo.clearbit.com/meta.com",
|
||||
name: "Meta",
|
||||
slug: "meta",
|
||||
updatedAt: new Date("2022-10-12T16:19:05.196Z")
|
||||
},
|
||||
companyId: "cl95u79f000007im531ysjg79",
|
||||
id: "cl976t4de00047iygl0zbce11",
|
||||
jobType: "FULLTIME",
|
||||
location: "Singapore, Singapore",
|
||||
monthYearReceived: new Date("2022-09-30T07:58:54.000Z"),
|
||||
negotiationStrategy: "Charmed the guy with my face",
|
||||
offersFullTimeId: "cl976t4de00057iygq3ktce3v",
|
||||
offersInternId: null,
|
||||
profileId: "cl96stky5002ew32gx2kale2x"
|
||||
},
|
||||
{
|
||||
OffersFullTime: {
|
||||
baseSalary: {
|
||||
currency: "SGD",
|
||||
id: "cl96stky80033w32gxw5goc4z",
|
||||
value: 84000
|
||||
},
|
||||
baseSalaryId: "cl96stky80033w32gxw5goc4z",
|
||||
bonus: {
|
||||
currency: "SGD",
|
||||
id: "cl96stky80035w32gajjwdo1p",
|
||||
value: 123456789
|
||||
},
|
||||
bonusId: "cl96stky80035w32gajjwdo1p",
|
||||
id: "cl96stky80032w32gep9ovgj3",
|
||||
level: "Junior",
|
||||
specialization: "Front End",
|
||||
stocks: {
|
||||
currency: "SGD",
|
||||
id: "cl96stky90037w32gu04t6ybh",
|
||||
value: 100
|
||||
},
|
||||
stocksId: "cl96stky90037w32gu04t6ybh",
|
||||
title: "Software Engineer",
|
||||
totalCompensation: {
|
||||
currency: "SGD",
|
||||
id: "cl96stky90039w32glbpktd0o",
|
||||
value: 104100
|
||||
},
|
||||
totalCompensationId: "cl96stky90039w32glbpktd0o"
|
||||
},
|
||||
OffersIntern: null,
|
||||
comments: null,
|
||||
company: {
|
||||
createdAt: new Date("2022-10-12T16:19:05.196Z"),
|
||||
description: "Meta Platforms, Inc., doing business as Meta and formerly named Facebook, Inc., and TheFacebook, Inc., is an American multinational technology conglomerate based in Menlo Park, California. The company owns Facebook, Instagram, and WhatsApp, among other products and services.",
|
||||
id: "cl95u79f000007im531ysjg79",
|
||||
logoUrl: "https://logo.clearbit.com/meta.com",
|
||||
name: "Meta",
|
||||
slug: "meta",
|
||||
updatedAt: new Date("2022-10-12T16:19:05.196Z")
|
||||
},
|
||||
companyId: "cl95u79f000007im531ysjg79",
|
||||
id: "cl96stky80031w32gau9mu1gs",
|
||||
jobType: "FULLTIME",
|
||||
location: "Singapore, Singapore",
|
||||
monthYearReceived: new Date("2022-09-30T07:58:54.000Z"),
|
||||
negotiationStrategy: "Leveraged having million offers",
|
||||
offersFullTimeId: "cl96stky80032w32gep9ovgj3",
|
||||
offersInternId: null,
|
||||
profileId: "cl96stky5002ew32gx2kale2x"
|
||||
},
|
||||
{
|
||||
OffersFullTime: {
|
||||
baseSalary: {
|
||||
currency: "SGD",
|
||||
id: "cl96stky9003dw32gcvqbijlo",
|
||||
value: 1
|
||||
},
|
||||
baseSalaryId: "cl96stky9003dw32gcvqbijlo",
|
||||
bonus: {
|
||||
currency: "SGD",
|
||||
id: "cl96stky9003fw32goc3zqxwr",
|
||||
value: 0
|
||||
},
|
||||
bonusId: "cl96stky9003fw32goc3zqxwr",
|
||||
id: "cl96stky9003cw32g5v10izfu",
|
||||
level: "Senior",
|
||||
specialization: "Front End",
|
||||
stocks: {
|
||||
currency: "SGD",
|
||||
id: "cl96stky9003hw32g1lbbkqqr",
|
||||
value: 999999
|
||||
},
|
||||
stocksId: "cl96stky9003hw32g1lbbkqqr",
|
||||
title: "Software Engineer DOG",
|
||||
totalCompensation: {
|
||||
currency: "SGD",
|
||||
id: "cl96stky9003jw32gzumcoi7v",
|
||||
value: 999999
|
||||
},
|
||||
totalCompensationId: "cl96stky9003jw32gzumcoi7v"
|
||||
},
|
||||
OffersIntern: null,
|
||||
comments: null,
|
||||
company: {
|
||||
createdAt: new Date("2022-10-12T16:19:05.196Z"),
|
||||
description: "Meta Platforms, Inc., doing business as Meta and formerly named Facebook, Inc., and TheFacebook, Inc., is an American multinational technology conglomerate based in Menlo Park, California. The company owns Facebook, Instagram, and WhatsApp, among other products and services.",
|
||||
id: "cl95u79f000007im531ysjg79",
|
||||
logoUrl: "https://logo.clearbit.com/meta.com",
|
||||
name: "Meta",
|
||||
slug: "meta",
|
||||
updatedAt: new Date("2022-10-12T16:19:05.196Z")
|
||||
},
|
||||
companyId: "cl95u79f000007im531ysjg79",
|
||||
id: "cl96stky9003bw32gc3l955vr",
|
||||
jobType: "FULLTIME",
|
||||
location: "Singapore, Singapore",
|
||||
monthYearReceived: new Date("2022-09-30T07:58:54.000Z"),
|
||||
negotiationStrategy: "LOst out having multiple offers",
|
||||
offersFullTimeId: "cl96stky9003cw32g5v10izfu",
|
||||
offersInternId: null,
|
||||
profileId: "cl96stky5002ew32gx2kale2x"
|
||||
},
|
||||
{
|
||||
OffersFullTime: {
|
||||
baseSalary: {
|
||||
currency: "SGD",
|
||||
id: "cl976wf28000v7iygmk1b7qaq",
|
||||
value: 1999999999
|
||||
},
|
||||
baseSalaryId: "cl976wf28000v7iygmk1b7qaq",
|
||||
bonus: {
|
||||
currency: "SGD",
|
||||
id: "cl976wf28000x7iyg63w7kcli",
|
||||
value: 1410065407
|
||||
},
|
||||
bonusId: "cl976wf28000x7iyg63w7kcli",
|
||||
id: "cl976wf28000u7iyg6euei8e9",
|
||||
level: "EXPERT",
|
||||
specialization: "FRONTEND",
|
||||
stocks: {
|
||||
currency: "SGD",
|
||||
id: "cl976wf28000z7iyg9ivun6ap",
|
||||
value: 111222333
|
||||
},
|
||||
stocksId: "cl976wf28000z7iyg9ivun6ap",
|
||||
title: "Software Engineer",
|
||||
totalCompensation: {
|
||||
currency: "SGD",
|
||||
id: "cl976wf2800117iygmzsc0xit",
|
||||
value: 55555555
|
||||
},
|
||||
totalCompensationId: "cl976wf2800117iygmzsc0xit"
|
||||
},
|
||||
OffersIntern: null,
|
||||
comments: "this IS SO COOL",
|
||||
company: {
|
||||
createdAt: new Date("2022-10-12T16:19:05.196Z"),
|
||||
description: "Meta Platforms, Inc., doing business as Meta and formerly named Facebook, Inc., and TheFacebook, Inc., is an American multinational technology conglomerate based in Menlo Park, California. The company owns Facebook, Instagram, and WhatsApp, among other products and services.",
|
||||
id: "cl95u79f000007im531ysjg79",
|
||||
logoUrl: "https://logo.clearbit.com/meta.com",
|
||||
name: "Meta",
|
||||
slug: "meta",
|
||||
updatedAt: new Date("2022-10-12T16:19:05.196Z")
|
||||
},
|
||||
companyId: "cl95u79f000007im531ysjg79",
|
||||
id: "cl976wf28000t7iyga4noyz7s",
|
||||
jobType: "FULLTIME",
|
||||
location: "Singapore, Singapore",
|
||||
monthYearReceived: new Date("2022-09-30T07:58:54.000Z"),
|
||||
negotiationStrategy: "Charmed the guy with my face",
|
||||
offersFullTimeId: "cl976wf28000u7iyg6euei8e9",
|
||||
offersInternId: null,
|
||||
profileId: "cl96stky5002ew32gx2kale2x"
|
||||
},
|
||||
{
|
||||
OffersFullTime: {
|
||||
baseSalary: {
|
||||
currency: "SGD",
|
||||
id: "cl96tbb3o0053w32gz11paaxu",
|
||||
value: 1999999999
|
||||
},
|
||||
baseSalaryId: "cl96tbb3o0053w32gz11paaxu",
|
||||
bonus: {
|
||||
currency: "SGD",
|
||||
id: "cl96tbb3o0055w32gpyqgz5hx",
|
||||
value: 1410065407
|
||||
},
|
||||
bonusId: "cl96tbb3o0055w32gpyqgz5hx",
|
||||
id: "cl96tbb3o0052w32guguajzin",
|
||||
level: "EXPERT",
|
||||
specialization: "FRONTEND",
|
||||
stocks: {
|
||||
currency: "SGD",
|
||||
id: "cl96tbb3o0057w32gu4nyxguf",
|
||||
value: 500
|
||||
},
|
||||
stocksId: "cl96tbb3o0057w32gu4nyxguf",
|
||||
title: "Software Engineer",
|
||||
totalCompensation: {
|
||||
currency: "SGD",
|
||||
id: "cl96tbb3o0059w32gm3iy1zk4",
|
||||
value: 55555555
|
||||
},
|
||||
totalCompensationId: "cl96tbb3o0059w32gm3iy1zk4"
|
||||
},
|
||||
OffersIntern: null,
|
||||
comments: "this rocks",
|
||||
company: {
|
||||
createdAt: new Date("2022-10-12T16:19:05.196Z"),
|
||||
description: "Meta Platforms, Inc., doing business as Meta and formerly named Facebook, Inc., and TheFacebook, Inc., is an American multinational technology conglomerate based in Menlo Park, California. The company owns Facebook, Instagram, and WhatsApp, among other products and services.",
|
||||
id: "cl95u79f000007im531ysjg79",
|
||||
logoUrl: "https://logo.clearbit.com/meta.com",
|
||||
name: "Meta",
|
||||
slug: "meta",
|
||||
updatedAt: new Date("2022-10-12T16:19:05.196Z")
|
||||
},
|
||||
companyId: "cl95u79f000007im531ysjg79",
|
||||
id: "cl96tbb3o0051w32gjrpaiiit",
|
||||
jobType: "FULLTIME",
|
||||
location: "Singapore, Singapore",
|
||||
monthYearReceived: new Date("2022-09-30T07:58:54.000Z"),
|
||||
negotiationStrategy: "Charmed the guy with my face",
|
||||
offersFullTimeId: "cl96tbb3o0052w32guguajzin",
|
||||
offersInternId: null,
|
||||
profileId: "cl96stky5002ew32gx2kale2x"
|
||||
}
|
||||
],
|
||||
profileName: "ailing bryann stuart ziqing",
|
||||
token: "afca11e436d21bde24543718fa957c6c625335439dc504f24ee35eae7b5ef1ba",
|
||||
userId: null
|
||||
});
|
||||
}
|
||||
|
||||
return (
|
||||
<>
|
||||
<div>{createdData}</div>
|
||||
<button type="button" onClick={handleClick}>
|
||||
Click Me!
|
||||
</button>
|
||||
<button type="button" onClick={handleUpdate}>
|
||||
UPDATE!
|
||||
</button>
|
||||
<button
|
||||
className="text-danger-600"
|
||||
type="button"
|
||||
|
@ -9,50 +9,92 @@ import type { offersProfile } from '~/types/offers-profile';
|
||||
|
||||
const valuation = z.object({
|
||||
currency: z.string(),
|
||||
id: z.string().optional(),
|
||||
value: z.number(),
|
||||
});
|
||||
|
||||
// TODO: handle both full time and intern
|
||||
const company = z.object({
|
||||
createdAt: z.date(),
|
||||
description: z.string().nullish(),
|
||||
id: z.string().optional(),
|
||||
logoUrl: z.string().nullish(),
|
||||
name: z.string(),
|
||||
slug: z.string(),
|
||||
updatedAt: z.date()
|
||||
})
|
||||
|
||||
const offer = z.object({
|
||||
comments: z.string().optional(),
|
||||
companyId: z.string(),
|
||||
job: z.object({
|
||||
base: valuation.optional(), // Full time
|
||||
bonus: valuation.optional(), // Full time
|
||||
internshipCycle: z.string().optional(), // Intern
|
||||
level: z.string().optional(), // Full time
|
||||
monthlySalary: valuation.optional(), // Intern
|
||||
OffersFullTime: z.object({
|
||||
baseSalary: valuation.nullish(),
|
||||
baseSalaryId: z.string().nullish(),
|
||||
bonus: valuation.nullish(),
|
||||
bonusId: z.string().nullish(),
|
||||
id: z.string().optional(),
|
||||
level: z.string().nullish(),
|
||||
specialization: z.string(),
|
||||
startYear: z.number().optional(), // Intern
|
||||
stocks: valuation.optional(), // Full time
|
||||
stocks: valuation.nullish(),
|
||||
stocksId: z.string().nullish(),
|
||||
title: z.string(),
|
||||
totalCompensation: valuation.optional(), // Full time
|
||||
}),
|
||||
totalCompensation: valuation.nullish(),
|
||||
totalCompensationId: z.string().nullish(),
|
||||
}).nullish(),
|
||||
OffersIntern: z.object({
|
||||
id: z.string().optional(),
|
||||
internshipCycle: z.string().nullish(),
|
||||
monthlySalary: valuation.nullish(),
|
||||
specialization: z.string(),
|
||||
startYear: z.number().nullish(),
|
||||
title: z.string(),
|
||||
totalCompensation: valuation.nullish(), // Full time
|
||||
}).nullish(),
|
||||
comments: z.string().nullish(),
|
||||
company: company.nullish(),
|
||||
companyId: z.string(),
|
||||
id: z.string().optional(),
|
||||
jobType: z.string(),
|
||||
location: z.string(),
|
||||
monthYearReceived: z.date(),
|
||||
negotiationStrategy: z.string().optional(),
|
||||
negotiationStrategy: z.string().nullish(),
|
||||
offersFullTimeId: z.string().nullish(),
|
||||
offersInternId: z.string().nullish(),
|
||||
profileId: z.string().nullish(),
|
||||
});
|
||||
|
||||
const experience = z.object({
|
||||
companyId: z.string().optional(),
|
||||
durationInMonths: z.number().optional(),
|
||||
jobType: z.string().optional(),
|
||||
level: z.string().optional(),
|
||||
monthlySalary: valuation.optional(),
|
||||
specialization: z.string().optional(),
|
||||
title: z.string().optional(),
|
||||
totalCompensation: valuation.optional(),
|
||||
backgroundId: z.string().nullish(),
|
||||
company: company.nullish(),
|
||||
companyId: z.string().nullish(),
|
||||
durationInMonths: z.number().nullish(),
|
||||
id: z.string().optional(),
|
||||
jobType: z.string().nullish(),
|
||||
level: z.string().nullish(),
|
||||
monthlySalary: valuation.nullish(),
|
||||
monthlySalaryId: z.string().nullish(),
|
||||
specialization: z.string().nullish(),
|
||||
title: z.string().nullish(),
|
||||
totalCompensation: valuation.nullish(),
|
||||
totalCompensationId: z.string().nullish()
|
||||
});
|
||||
|
||||
const education = z.object({
|
||||
endDate: z.date().optional(),
|
||||
field: z.string().optional(),
|
||||
school: z.string().optional(),
|
||||
startDate: z.date().optional(),
|
||||
type: z.string().optional(),
|
||||
backgroundId: z.string().nullish(),
|
||||
endDate: z.date().nullish(),
|
||||
field: z.string().nullish(),
|
||||
id: z.string().optional(),
|
||||
school: z.string().nullish(),
|
||||
startDate: z.date().nullish(),
|
||||
type: z.string().nullish(),
|
||||
});
|
||||
|
||||
const reply = z.object({
|
||||
createdAt: z.date().nullish(),
|
||||
id: z.string().optional(),
|
||||
messages: z.string().nullish(),
|
||||
profileId: z.string().nullish(),
|
||||
replyingToId: z.string().nullish(),
|
||||
userId: z.string().nullish()
|
||||
})
|
||||
|
||||
type WithIsEditable<T> = T & {
|
||||
isEditable: boolean;
|
||||
};
|
||||
@ -272,24 +314,25 @@ export const offersProfileRouter = createRouter()
|
||||
create: input.offers.map((x) => {
|
||||
if (
|
||||
x.jobType === 'INTERN' &&
|
||||
x.job.internshipCycle !== undefined &&
|
||||
x.job.monthlySalary?.currency !== undefined &&
|
||||
x.job.monthlySalary.value !== undefined &&
|
||||
x.job.startYear !== undefined
|
||||
x.OffersIntern &&
|
||||
x.OffersIntern.internshipCycle &&
|
||||
x.OffersIntern.monthlySalary?.currency &&
|
||||
x.OffersIntern.monthlySalary.value &&
|
||||
x.OffersIntern.startYear
|
||||
) {
|
||||
return {
|
||||
OffersIntern: {
|
||||
create: {
|
||||
internshipCycle: x.job.internshipCycle,
|
||||
internshipCycle: x.OffersIntern.internshipCycle,
|
||||
monthlySalary: {
|
||||
create: {
|
||||
currency: x.job.monthlySalary?.currency,
|
||||
value: x.job.monthlySalary?.value,
|
||||
currency: x.OffersIntern.monthlySalary?.currency,
|
||||
value: x.OffersIntern.monthlySalary?.value,
|
||||
},
|
||||
},
|
||||
specialization: x.job.specialization,
|
||||
startYear: x.job.startYear,
|
||||
title: x.job.title,
|
||||
specialization: x.OffersIntern.specialization,
|
||||
startYear: x.OffersIntern.startYear,
|
||||
title: x.OffersIntern.title,
|
||||
},
|
||||
},
|
||||
comments: x.comments,
|
||||
@ -306,44 +349,45 @@ export const offersProfileRouter = createRouter()
|
||||
}
|
||||
if (
|
||||
x.jobType === 'FULLTIME' &&
|
||||
x.job.base?.currency !== undefined &&
|
||||
x.job.base?.value !== undefined &&
|
||||
x.job.bonus?.currency !== undefined &&
|
||||
x.job.bonus?.value !== undefined &&
|
||||
x.job.stocks?.currency !== undefined &&
|
||||
x.job.stocks?.value !== undefined &&
|
||||
x.job.totalCompensation?.currency !== undefined &&
|
||||
x.job.totalCompensation?.value !== undefined &&
|
||||
x.job.level !== undefined
|
||||
x.OffersFullTime &&
|
||||
x.OffersFullTime.baseSalary?.currency &&
|
||||
x.OffersFullTime.baseSalary?.value &&
|
||||
x.OffersFullTime.bonus?.currency &&
|
||||
x.OffersFullTime.bonus?.value &&
|
||||
x.OffersFullTime.stocks?.currency &&
|
||||
x.OffersFullTime.stocks?.value &&
|
||||
x.OffersFullTime.totalCompensation?.currency &&
|
||||
x.OffersFullTime.totalCompensation?.value &&
|
||||
x.OffersFullTime.level
|
||||
) {
|
||||
return {
|
||||
OffersFullTime: {
|
||||
create: {
|
||||
baseSalary: {
|
||||
create: {
|
||||
currency: x.job.base?.currency,
|
||||
value: x.job.base?.value,
|
||||
currency: x.OffersFullTime.baseSalary?.currency,
|
||||
value: x.OffersFullTime.baseSalary?.value,
|
||||
},
|
||||
},
|
||||
bonus: {
|
||||
create: {
|
||||
currency: x.job.bonus?.currency,
|
||||
value: x.job.bonus?.value,
|
||||
currency: x.OffersFullTime.bonus?.currency,
|
||||
value: x.OffersFullTime.bonus?.value,
|
||||
},
|
||||
},
|
||||
level: x.job.level,
|
||||
specialization: x.job.specialization,
|
||||
level: x.OffersFullTime.level,
|
||||
specialization: x.OffersFullTime.specialization,
|
||||
stocks: {
|
||||
create: {
|
||||
currency: x.job.stocks?.currency,
|
||||
value: x.job.stocks?.value,
|
||||
currency: x.OffersFullTime.stocks?.currency,
|
||||
value: x.OffersFullTime.stocks?.value,
|
||||
},
|
||||
},
|
||||
title: x.job.title,
|
||||
title: x.OffersFullTime.title,
|
||||
totalCompensation: {
|
||||
create: {
|
||||
currency: x.job.totalCompensation?.currency,
|
||||
value: x.job.totalCompensation?.value,
|
||||
currency: x.OffersFullTime.totalCompensation?.currency,
|
||||
value: x.OffersFullTime.totalCompensation?.value,
|
||||
},
|
||||
},
|
||||
},
|
||||
@ -426,7 +470,550 @@ export const offersProfileRouter = createRouter()
|
||||
}
|
||||
// TODO: Throw 401
|
||||
},
|
||||
});
|
||||
// .mutation('update', {
|
||||
})
|
||||
.mutation('update', {
|
||||
input: z.object({
|
||||
background: z.object({
|
||||
educations: z.array(education),
|
||||
experiences: z.array(experience),
|
||||
id: z.string().optional(),
|
||||
offersProfileId: z.string().optional(),
|
||||
specificYoes: z.array(
|
||||
z.object({
|
||||
backgroundId: z.string().optional(),
|
||||
domain: z.string(),
|
||||
id: z.string().optional(),
|
||||
yoe: z.number()
|
||||
}),
|
||||
),
|
||||
totalYoe: z.number(),
|
||||
}),
|
||||
createdAt: z.string().optional(),
|
||||
discussion: z.array(reply),
|
||||
id: z.string(),
|
||||
isEditable: z.boolean().nullish(),
|
||||
offers: z.array(offer),
|
||||
profileName: z.string(),
|
||||
token: z.string(),
|
||||
userId: z.string().nullish()
|
||||
}),
|
||||
async resolve({ ctx, input }) {
|
||||
const profileToUpdate = await ctx.prisma.offersProfile.findFirst({
|
||||
where: {
|
||||
id: input.id,
|
||||
},
|
||||
});
|
||||
const profileEditToken = profileToUpdate?.editToken;
|
||||
|
||||
// });
|
||||
if (profileEditToken === input.token) {
|
||||
await ctx.prisma.offersProfile.update({
|
||||
data: {
|
||||
profileName: input.profileName,
|
||||
},
|
||||
where: {
|
||||
id: input.id,
|
||||
}
|
||||
});
|
||||
|
||||
await ctx.prisma.offersBackground.update({
|
||||
data: {
|
||||
totalYoe: input.background.totalYoe
|
||||
},
|
||||
where: {
|
||||
id: input.background.id
|
||||
}
|
||||
})
|
||||
|
||||
for (const edu of input.background.educations) {
|
||||
if (edu.id) {
|
||||
await ctx.prisma.offersEducation.update({
|
||||
data: {
|
||||
endDate: edu.endDate,
|
||||
field: edu.field,
|
||||
school: edu.school,
|
||||
startDate: edu.startDate,
|
||||
type: edu.type,
|
||||
},
|
||||
where: {
|
||||
id: edu.id
|
||||
}
|
||||
})
|
||||
} else {
|
||||
await ctx.prisma.offersBackground.update({
|
||||
data: {
|
||||
educations: {
|
||||
create:
|
||||
{
|
||||
endDate: edu.endDate,
|
||||
field: edu.field,
|
||||
school: edu.school,
|
||||
startDate: edu.startDate,
|
||||
type: edu.type,
|
||||
}
|
||||
}
|
||||
},
|
||||
where: {
|
||||
id: input.background.id
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
for (const exp of input.background.experiences) {
|
||||
if (exp.id) {
|
||||
await ctx.prisma.offersExperience.update({
|
||||
data: {
|
||||
companyId: exp.companyId,
|
||||
durationInMonths: exp.durationInMonths,
|
||||
level: exp.level,
|
||||
specialization: exp.specialization,
|
||||
},
|
||||
where: {
|
||||
id: exp.id
|
||||
}
|
||||
})
|
||||
|
||||
if (exp.monthlySalary) {
|
||||
await ctx.prisma.offersCurrency.update({
|
||||
data: {
|
||||
currency: exp.monthlySalary.currency,
|
||||
value: exp.monthlySalary.value,
|
||||
},
|
||||
where: {
|
||||
id: exp.monthlySalary.id
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
if (exp.totalCompensation) {
|
||||
await ctx.prisma.offersCurrency.update({
|
||||
data: {
|
||||
currency: exp.totalCompensation.currency,
|
||||
value: exp.totalCompensation.value,
|
||||
},
|
||||
where: {
|
||||
id: exp.totalCompensation.id
|
||||
}
|
||||
})
|
||||
}
|
||||
} else if (!exp.id) {
|
||||
if (exp.jobType === 'FULLTIME' && exp.totalCompensation?.currency !== undefined && exp.totalCompensation.value !== undefined) {
|
||||
if (exp.companyId) {
|
||||
await ctx.prisma.offersBackground.update({
|
||||
data: {
|
||||
experiences: {
|
||||
create: {
|
||||
company: {
|
||||
connect: {
|
||||
id: exp.companyId,
|
||||
},
|
||||
},
|
||||
durationInMonths: exp.durationInMonths,
|
||||
jobType: exp.jobType,
|
||||
level: exp.level,
|
||||
specialization: exp.specialization,
|
||||
title: exp.title,
|
||||
totalCompensation: {
|
||||
create: {
|
||||
currency: exp.totalCompensation?.currency,
|
||||
value: exp.totalCompensation?.value,
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
},
|
||||
where: {
|
||||
id: input.background.id
|
||||
}
|
||||
})
|
||||
} else {
|
||||
await ctx.prisma.offersBackground.update({
|
||||
data: {
|
||||
experiences: {
|
||||
create: {
|
||||
durationInMonths: exp.durationInMonths,
|
||||
jobType: exp.jobType,
|
||||
level: exp.level,
|
||||
specialization: exp.specialization,
|
||||
title: exp.title,
|
||||
totalCompensation: {
|
||||
create: {
|
||||
currency: exp.totalCompensation?.currency,
|
||||
value: exp.totalCompensation?.value,
|
||||
},
|
||||
},
|
||||
}
|
||||
}
|
||||
},
|
||||
where: {
|
||||
id: input.background.id
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
else if (
|
||||
exp.jobType === 'INTERN' &&
|
||||
exp.monthlySalary?.currency !== undefined &&
|
||||
exp.monthlySalary.value !== undefined
|
||||
) {
|
||||
if (exp.companyId) {
|
||||
await ctx.prisma.offersBackground.update({
|
||||
data: {
|
||||
experiences: {
|
||||
create: {
|
||||
company: {
|
||||
connect: {
|
||||
id: exp.companyId,
|
||||
},
|
||||
},
|
||||
durationInMonths: exp.durationInMonths,
|
||||
jobType: exp.jobType,
|
||||
monthlySalary: {
|
||||
create: {
|
||||
currency: exp.monthlySalary?.currency,
|
||||
value: exp.monthlySalary?.value,
|
||||
},
|
||||
},
|
||||
specialization: exp.specialization,
|
||||
title: exp.title,
|
||||
}
|
||||
}
|
||||
},
|
||||
where: {
|
||||
id: input.background.id
|
||||
}
|
||||
})
|
||||
} else {
|
||||
await ctx.prisma.offersBackground.update({
|
||||
data: {
|
||||
experiences: {
|
||||
create: {
|
||||
durationInMonths: exp.durationInMonths,
|
||||
jobType: exp.jobType,
|
||||
monthlySalary: {
|
||||
create: {
|
||||
currency: exp.monthlySalary?.currency,
|
||||
value: exp.monthlySalary?.value,
|
||||
},
|
||||
},
|
||||
specialization: exp.specialization,
|
||||
title: exp.title,
|
||||
}
|
||||
}
|
||||
},
|
||||
where: {
|
||||
id: input.background.id
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
for (const yoe of input.background.specificYoes) {
|
||||
if (yoe.id) {
|
||||
await ctx.prisma.offersSpecificYoe.update({
|
||||
data: {
|
||||
...yoe
|
||||
},
|
||||
where: {
|
||||
id: yoe.id
|
||||
}
|
||||
})
|
||||
} else {
|
||||
await ctx.prisma.offersBackground.update({
|
||||
data: {
|
||||
specificYoes: {
|
||||
create:
|
||||
{
|
||||
domain: yoe.domain,
|
||||
yoe: yoe.yoe,
|
||||
}
|
||||
}
|
||||
},
|
||||
where: {
|
||||
id: input.background.id
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
for (const offerToUpdate of input.offers) {
|
||||
if (offerToUpdate.id) {
|
||||
await ctx.prisma.offersOffer.update({
|
||||
data: {
|
||||
comments: offerToUpdate.comments,
|
||||
companyId: offerToUpdate.companyId,
|
||||
location: offerToUpdate.location,
|
||||
monthYearReceived: offerToUpdate.monthYearReceived,
|
||||
negotiationStrategy: offerToUpdate.negotiationStrategy,
|
||||
},
|
||||
where: {
|
||||
id: offerToUpdate.id
|
||||
}
|
||||
})
|
||||
|
||||
if (offerToUpdate.jobType === "INTERN" || offerToUpdate.jobType === "FULLTIME") {
|
||||
await ctx.prisma.offersOffer.update({
|
||||
data: {
|
||||
jobType: offerToUpdate.jobType
|
||||
},
|
||||
where: {
|
||||
id: offerToUpdate.id
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
if (offerToUpdate.OffersIntern?.monthlySalary) {
|
||||
await ctx.prisma.offersIntern.update({
|
||||
data: {
|
||||
internshipCycle: offerToUpdate.OffersIntern.internshipCycle ?? undefined,
|
||||
specialization: offerToUpdate.OffersIntern.specialization,
|
||||
startYear: offerToUpdate.OffersIntern.startYear ?? undefined,
|
||||
title: offerToUpdate.OffersIntern.title,
|
||||
},
|
||||
where: {
|
||||
id: offerToUpdate.OffersIntern.id,
|
||||
}
|
||||
})
|
||||
await ctx.prisma.offersCurrency.update({
|
||||
data: {
|
||||
currency: offerToUpdate.OffersIntern.monthlySalary.currency,
|
||||
value: offerToUpdate.OffersIntern.monthlySalary.value
|
||||
},
|
||||
where: {
|
||||
id: offerToUpdate.OffersIntern.monthlySalary.id
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
if (offerToUpdate.OffersFullTime?.totalCompensation) {
|
||||
await ctx.prisma.offersFullTime.update({
|
||||
data: {
|
||||
level: offerToUpdate.OffersFullTime.level ?? undefined,
|
||||
specialization: offerToUpdate.OffersFullTime.specialization,
|
||||
title: offerToUpdate.OffersFullTime.title,
|
||||
},
|
||||
where: {
|
||||
id: offerToUpdate.OffersFullTime.id,
|
||||
}
|
||||
})
|
||||
if (offerToUpdate.OffersFullTime.baseSalary) {
|
||||
await ctx.prisma.offersCurrency.update({
|
||||
data: {
|
||||
currency: offerToUpdate.OffersFullTime.baseSalary.currency,
|
||||
value: offerToUpdate.OffersFullTime.baseSalary.value
|
||||
},
|
||||
where: {
|
||||
id: offerToUpdate.OffersFullTime.baseSalary.id
|
||||
}
|
||||
})
|
||||
}
|
||||
if (offerToUpdate.OffersFullTime.bonus) {
|
||||
await ctx.prisma.offersCurrency.update({
|
||||
data: {
|
||||
currency: offerToUpdate.OffersFullTime.bonus.currency,
|
||||
value: offerToUpdate.OffersFullTime.bonus.value
|
||||
},
|
||||
where: {
|
||||
id: offerToUpdate.OffersFullTime.bonus.id
|
||||
}
|
||||
})
|
||||
}
|
||||
if (offerToUpdate.OffersFullTime.stocks) {
|
||||
await ctx.prisma.offersCurrency.update({
|
||||
data: {
|
||||
currency: offerToUpdate.OffersFullTime.stocks.currency,
|
||||
value: offerToUpdate.OffersFullTime.stocks.value
|
||||
},
|
||||
where: {
|
||||
id: offerToUpdate.OffersFullTime.stocks.id
|
||||
}
|
||||
})
|
||||
}
|
||||
await ctx.prisma.offersCurrency.update({
|
||||
data: {
|
||||
currency: offerToUpdate.OffersFullTime.totalCompensation.currency,
|
||||
value: offerToUpdate.OffersFullTime.totalCompensation.value
|
||||
},
|
||||
where: {
|
||||
id: offerToUpdate.OffersFullTime.totalCompensation.id
|
||||
}
|
||||
})
|
||||
}
|
||||
} else {
|
||||
if (
|
||||
offerToUpdate.jobType === "INTERN" &&
|
||||
offerToUpdate.OffersIntern &&
|
||||
offerToUpdate.OffersIntern.internshipCycle &&
|
||||
offerToUpdate.OffersIntern.monthlySalary?.currency &&
|
||||
offerToUpdate.OffersIntern.monthlySalary.value &&
|
||||
offerToUpdate.OffersIntern.startYear
|
||||
) {
|
||||
await ctx.prisma.offersProfile.update({
|
||||
data: {
|
||||
offers: {
|
||||
create: {
|
||||
OffersIntern: {
|
||||
create: {
|
||||
internshipCycle: offerToUpdate.OffersIntern.internshipCycle,
|
||||
monthlySalary: {
|
||||
create: {
|
||||
currency: offerToUpdate.OffersIntern.monthlySalary?.currency,
|
||||
value: offerToUpdate.OffersIntern.monthlySalary?.value,
|
||||
},
|
||||
},
|
||||
specialization: offerToUpdate.OffersIntern.specialization,
|
||||
startYear: offerToUpdate.OffersIntern.startYear,
|
||||
title: offerToUpdate.OffersIntern.title,
|
||||
},
|
||||
},
|
||||
comments: offerToUpdate.comments,
|
||||
company: {
|
||||
connect: {
|
||||
id: offerToUpdate.companyId,
|
||||
},
|
||||
},
|
||||
jobType: offerToUpdate.jobType,
|
||||
location: offerToUpdate.location,
|
||||
monthYearReceived: offerToUpdate.monthYearReceived,
|
||||
negotiationStrategy: offerToUpdate.negotiationStrategy,
|
||||
}
|
||||
}
|
||||
},
|
||||
where: {
|
||||
id: input.id,
|
||||
}
|
||||
})
|
||||
}
|
||||
if (
|
||||
offerToUpdate.jobType === 'FULLTIME' &&
|
||||
offerToUpdate.OffersFullTime &&
|
||||
offerToUpdate.OffersFullTime.baseSalary?.currency &&
|
||||
offerToUpdate.OffersFullTime.baseSalary?.value &&
|
||||
offerToUpdate.OffersFullTime.bonus?.currency &&
|
||||
offerToUpdate.OffersFullTime.bonus?.value &&
|
||||
offerToUpdate.OffersFullTime.stocks?.currency &&
|
||||
offerToUpdate.OffersFullTime.stocks?.value &&
|
||||
offerToUpdate.OffersFullTime.totalCompensation?.currency &&
|
||||
offerToUpdate.OffersFullTime.totalCompensation?.value &&
|
||||
offerToUpdate.OffersFullTime.level
|
||||
) {
|
||||
await ctx.prisma.offersProfile.update({
|
||||
data: {
|
||||
offers: {
|
||||
create: {
|
||||
OffersFullTime: {
|
||||
create: {
|
||||
baseSalary: {
|
||||
create: {
|
||||
currency: offerToUpdate.OffersFullTime.baseSalary?.currency,
|
||||
value: offerToUpdate.OffersFullTime.baseSalary?.value,
|
||||
},
|
||||
},
|
||||
bonus: {
|
||||
create: {
|
||||
currency: offerToUpdate.OffersFullTime.bonus?.currency,
|
||||
value: offerToUpdate.OffersFullTime.bonus?.value,
|
||||
},
|
||||
},
|
||||
level: offerToUpdate.OffersFullTime.level,
|
||||
specialization: offerToUpdate.OffersFullTime.specialization,
|
||||
stocks: {
|
||||
create: {
|
||||
currency: offerToUpdate.OffersFullTime.stocks?.currency,
|
||||
value: offerToUpdate.OffersFullTime.stocks?.value,
|
||||
},
|
||||
},
|
||||
title: offerToUpdate.OffersFullTime.title,
|
||||
totalCompensation: {
|
||||
create: {
|
||||
currency: offerToUpdate.OffersFullTime.totalCompensation?.currency,
|
||||
value: offerToUpdate.OffersFullTime.totalCompensation?.value,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
comments: offerToUpdate.comments,
|
||||
company: {
|
||||
connect: {
|
||||
id: offerToUpdate.companyId,
|
||||
},
|
||||
},
|
||||
jobType: offerToUpdate.jobType,
|
||||
location: offerToUpdate.location,
|
||||
monthYearReceived: offerToUpdate.monthYearReceived,
|
||||
negotiationStrategy: offerToUpdate.negotiationStrategy,
|
||||
}
|
||||
}
|
||||
},
|
||||
where: {
|
||||
id: input.id,
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
// TODO: add analysis to profile object then return
|
||||
const result = await ctx.prisma.offersProfile.findFirst({
|
||||
include: {
|
||||
background: {
|
||||
include: {
|
||||
educations: true,
|
||||
experiences: {
|
||||
include: {
|
||||
company: true,
|
||||
monthlySalary: true,
|
||||
totalCompensation: true,
|
||||
},
|
||||
},
|
||||
specificYoes: true,
|
||||
},
|
||||
},
|
||||
discussion: {
|
||||
include: {
|
||||
replies: true,
|
||||
replyingTo: true,
|
||||
},
|
||||
},
|
||||
offers: {
|
||||
include: {
|
||||
OffersFullTime: {
|
||||
include: {
|
||||
baseSalary: true,
|
||||
bonus: true,
|
||||
stocks: true,
|
||||
totalCompensation: true,
|
||||
},
|
||||
},
|
||||
OffersIntern: {
|
||||
include: {
|
||||
monthlySalary: true,
|
||||
},
|
||||
},
|
||||
company: true,
|
||||
},
|
||||
},
|
||||
},
|
||||
where: {
|
||||
id: input.id,
|
||||
},
|
||||
});
|
||||
|
||||
if (result) {
|
||||
return exclude(computeIsEditable(result, input.token), 'editToken')
|
||||
}
|
||||
|
||||
throw new trpc.TRPCError({
|
||||
code: 'NOT_FOUND',
|
||||
message: 'Profile does not exist',
|
||||
});
|
||||
}
|
||||
|
||||
throw new trpc.TRPCError({
|
||||
code: 'UNAUTHORIZED',
|
||||
message: 'Invalid token.',
|
||||
});
|
||||
},
|
||||
});
|
||||
|
Reference in New Issue
Block a user