@ -43,449 +43,451 @@ const getYoeRange = (yoeCategory: number | null | undefined) => {
: null ; // Internship
} ;
export const offerAdminRouter = createProtectedRouter ( ) . query ( 'list' , {
input : z.object ( {
companyId : z.string ( ) . nullish ( ) ,
countryId : z.string ( ) . nullish ( ) ,
currency : z.string ( ) . nullish ( ) ,
dateEnd : z.date ( ) . nullish ( ) ,
dateStart : z.date ( ) . nullish ( ) ,
limit : z.number ( ) . positive ( ) ,
offset : z.number ( ) . nonnegative ( ) ,
salaryMax : z.number ( ) . nonnegative ( ) . nullish ( ) ,
salaryMin : z.number ( ) . nonnegative ( ) . nullish ( ) ,
sortBy : z
. string ( )
. regex ( createValidationRegex ( Object . keys ( sortingKeysMap ) , '[+-]{1}' ) )
. nullish ( ) ,
title : z.string ( ) . nullish ( ) ,
yoeCategory : z.number ( ) . min ( 0 ) . max ( 3 ) . nullish ( ) ,
yoeMax : z.number ( ) . max ( 100 ) . nullish ( ) ,
yoeMin : z.number ( ) . min ( 0 ) . nullish ( ) ,
} ) ,
async resolve ( { ctx , input } ) {
const userId = ctx . session . user . id ;
const adminAccount = await ctx . prisma . offersAdmin . findFirst ( {
where : {
userId
}
} )
if ( ! adminAccount ) {
throw new TRPCError ( {
code : 'UNAUTHORIZED' ,
message : 'Not an admin.' ,
export const offerAdminRouter = createProtectedRouter ( )
. query ( 'list' , {
input : z.object ( {
companyId : z.string ( ) . nullish ( ) ,
countryId : z.string ( ) . nullish ( ) ,
currency : z.string ( ) . nullish ( ) ,
dateEnd : z.date ( ) . nullish ( ) ,
dateStart : z.date ( ) . nullish ( ) ,
limit : z.number ( ) . positive ( ) ,
offset : z.number ( ) . nonnegative ( ) ,
salaryMax : z.number ( ) . nonnegative ( ) . nullish ( ) ,
salaryMin : z.number ( ) . nonnegative ( ) . nullish ( ) ,
sortBy : z
. string ( )
. regex ( createValidationRegex ( Object . keys ( sortingKeysMap ) , '[+-]{1}' ) )
. nullish ( ) ,
title : z.string ( ) . nullish ( ) ,
yoeCategory : z.number ( ) . min ( 0 ) . max ( 3 ) . nullish ( ) ,
yoeMax : z.number ( ) . max ( 100 ) . nullish ( ) ,
yoeMin : z.number ( ) . min ( 0 ) . nullish ( ) ,
} ) ,
async resolve ( { ctx , input } ) {
const userId = ctx . session . user . id ;
const adminAccount = await ctx . prisma . offersAdmin . findFirst ( {
where : {
userId ,
} ,
} ) ;
}
const yoeRange = getYoeRange ( input . yoeCategory ) ;
const yoeMin = input . yoeMin != null ? input.yoeMin : yoeRange?.minYoe ;
const yoeMax = input . yoeMax != null ? input.yoeMax : yoeRange?.maxYoe ;
if ( ! adminAccount ) {
throw new TRPCError ( {
code : 'UNAUTHORIZED' ,
message : 'Not an admin.' ,
} ) ;
}
if ( ! input . sortBy ) {
input . sortBy = '-' + sortingKeysMap . monthYearReceived ;
}
const yoeRange = getYoeRange ( input . yoeCategory ) ;
const yoeMin = input . yoeMin != null ? input.yoeMin : yoeRange?.minYoe ;
const yoeMax = input . yoeMax != null ? input.yoeMax : yoeRange?.maxYoe ;
const order = getOrder ( input . sortBy . charAt ( 0 ) ) ;
const sortingKey = input . sortBy . substring ( 1 ) ;
if ( ! input . sortBy ) {
input . sortBy = '-' + sortingKeysMap . monthYearReceived ;
}
const order = getOrder ( input . sortBy . charAt ( 0 ) ) ;
const sortingKey = input . sortBy . substring ( 1 ) ;
const data = ! yoeRange
? await ctx . prisma . offersOffer . findMany ( {
// Internship
include : {
company : true ,
location : {
include : {
state : {
include : {
country : true ,
const data = ! yoeRange
? await ctx . prisma . offersOffer . findMany ( {
// Internship
include : {
company : true ,
location : {
include : {
state : {
include : {
country : true ,
} ,
} ,
} ,
} ,
} ,
offersFullTim e: {
include : {
baseSalary : true ,
bonu s: true ,
stocks : true ,
totalCompensation : true ,
offersFullTime : {
includ e: {
baseSalary : true ,
bonus : true ,
stock s: true ,
totalCompensation : true ,
} ,
} ,
} ,
offersIntern : {
include : {
monthlySalary : true ,
offersIntern : {
include : {
monthlySalary : true ,
} ,
} ,
} ,
prof ile: {
include : {
background : true ,
offers : true ,
profile : {
inc lud e: {
background : true ,
offers : true ,
} ,
} ,
} ,
} ,
orderBy :
sortingKey === sortingKeysMap . monthYearReceived
? {
monthYearReceived : order ,
}
: sortingKey === sortingKeysMap . totalCompensation
? [
{
offersIntern : {
monthlySalary : {
baseValue : order ,
orderBy :
sortingKey === sortingKeysMap . monthYearReceived
? {
monthYearReceived : order ,
}
: sortingKey === sortingKeysMap . totalCompensation
? [
{
offersIntern : {
monthlySalary : {
baseValue : order ,
} ,
} ,
} ,
} ,
{
monthYearReceived : 'desc' ,
},
]
: sortingKey === sortingKeysMap . totalYoe
? [
{
profile : {
background : {
totalYoe : order ,
{
monthYearReceived : 'desc' ,
} ,
]
: sortingKey === sortingKeysMap . totalYoe
? [
{
profile : {
background : {
totalYoe : order ,
} ,
} ,
} ,
} ,
{
monthYearReceived : 'desc' ,
} ,
]
: sortingKey === sortingKeysMap . companyName
? [
{
company : {
name : order ,
{
monthYearReceived : 'desc' ,
} ,
} ,
{
monthYearReceived : 'desc' ,
} ,
]
: sortingKey === sortingKeysMap . jobTitle
? [
{
offersIntern : {
title : order ,
]
: sortingKey === sortingKeysMap . companyName
? [
{
company : {
name : order ,
} ,
} ,
{
monthYearReceived : 'desc' ,
} ,
]
: sortingKey === sortingKeysMap . jobTitle
? [
{
offersIntern : {
title : order ,
} ,
} ,
{
monthYearReceived : 'desc' ,
} ,
]
: { monthYearReceived : 'desc' } ,
where : {
AND : [
{
location : {
state : {
countryId :
input . countryId != null && input . countryId . length !== 0
? input . countryId
: undefined ,
} ,
} ,
{
monthYearReceived : 'desc' ,
} ,
{
offersIntern : {
isNot : null ,
} ,
]
: { monthYearReceived : 'desc' } ,
where : {
AND : [
{
location : {
state : {
countryId :
input . countryId != null && input . countryId . length !== 0
? input . countryId
} ,
{
offersIntern : {
title :
input . title != null && input . title . length !== 0
? input . title
: undefined ,
} ,
} ,
} ,
{
offersIntern : {
isNot : null ,
{
offersIntern : {
monthlySalary : {
baseValue : {
gte : input.salaryMin ? ? undefined ,
lte : input.salaryMax ? ? undefined ,
} ,
} ,
} ,
} ,
} ,
{
offersIntern : {
title :
input . title != null && input . title . length !== 0
? input . title
{
offersFullTime : {
is : null ,
} ,
} ,
{
companyId :
input . companyId && input . companyId . length !== 0
? input . companyId
: undefined ,
} ,
} ,
{
offersIntern : {
monthlySalary : {
baseValue : {
gte : input.salaryMin ? ? undefined ,
lte : input.salaryMax ? ? undefined ,
{
profile : {
background : {
totalYoe : {
gte : yoeMin ,
lte : yoeMax ,
} ,
} ,
} ,
} ,
} ,
{
offersFullTime : {
is : null ,
{
monthYearReceived : {
gte : input.dateStart ? ? undefined ,
lte : input.dateEnd ? ? undefined ,
} ,
} ,
} ,
{
companyId :
input . companyId && input . companyId . length !== 0
? input . companyId
: undefined ,
} ,
{
profile : {
background : {
totalYoe : {
gte : yoeMin ,
lte : yoeMax ,
] ,
} ,
} )
: await ctx . prisma . offersOffer . findMany ( {
// Junior, Mid, Senior
include : {
company : true ,
location : {
include : {
state : {
include : {
country : true ,
} ,
} ,
} ,
} ,
{
monthYearReceived : {
gte : input.dateStart ? ? undefined ,
lte : input.dateEnd ? ? undefined ,
offersFullTime : {
include : {
baseSalary : true ,
bonus : true ,
stocks : true ,
totalCompensation : true ,
} ,
} ,
] ,
} ,
} )
: await ctx . prisma . offersOffer . findMany ( {
// Junior, Mid, Senior
include : {
company : true ,
location : {
include : {
state : {
include : {
country : true ,
} ,
offersIntern : {
include : {
monthlySalary : true ,
} ,
} ,
} ,
offersFullTime : {
include : {
baseSalary : true ,
bonus : true ,
stocks : true ,
totalCompensation : true ,
} ,
} ,
offersIntern : {
include : {
monthlySalary : true ,
} ,
} ,
profile : {
include : {
background : true ,
offers : true ,
profile : {
include : {
background : true ,
offers : true ,
} ,
} ,
} ,
} ,
orderBy :
sortingKey === sortingKeysMap . monthYearReceived
? {
monthYearReceived : order ,
}
: sortingKey === sortingKeysMap . totalCompensation
? [
{
offersFullTime : {
totalCompensation : {
baseValue : order ,
orderBy :
sortingKey === sortingKeysMap . monthYearReceived
? {
monthYearReceived : order ,
}
: sortingKey === sortingKeysMap . totalCompensation
? [
{
offersFullTime : {
totalCompensation : {
baseValue : order ,
} ,
} ,
} ,
} ,
{
monthYearReceived : 'desc' ,
},
]
: sortingKey === sortingKeysMap . totalYoe
? [
{
profile : {
background : {
totalYoe : order ,
{
monthYearReceived : 'desc' ,
} ,
]
: sortingKey === sortingKeysMap . totalYoe
? [
{
profile : {
background : {
totalYoe : order ,
} ,
} ,
} ,
} ,
{
monthYearReceived : 'desc' ,
} ,
]
: sortingKey === sortingKeysMap . companyName
? [
{
company : {
name : order ,
{
monthYearReceived : 'desc' ,
} ,
} ,
{
monthYearReceived : 'desc' ,
} ,
]
: sortingKey === sortingKeysMap . jobTitle
? [
{
offersFullTime : {
title : order ,
]
: sortingKey === sortingKeysMap . companyName
? [
{
company : {
name : order ,
} ,
} ,
{
monthYearReceived : 'desc' ,
} ,
]
: sortingKey === sortingKeysMap . jobTitle
? [
{
offersFullTime : {
title : order ,
} ,
} ,
{
monthYearReceived : 'desc' ,
} ,
]
: { monthYearReceived : 'desc' } ,
where : {
AND : [
{
location : {
state : {
countryId :
input . countryId != null && input . countryId . length !== 0
? input . countryId
: undefined ,
} ,
} ,
{
monthYearReceived : 'desc' ,
} ,
{
offersIntern : {
is : null ,
} ,
]
: { monthYearReceived : 'desc' } ,
where : {
AND : [
{
location : {
state : {
countryId :
input . countryId != null && input . countryId . length !== 0
? input . countryId
: undefined ,
} ,
{
offersFullTime : {
isNot : null ,
} ,
} ,
} ,
{
offersIntern : {
is : null ,
{
offersFullTime : {
title :
input . title != null && input . title . length !== 0
? input . title
: undefined ,
} ,
} ,
} ,
{
offersFullTime : {
isNot : null ,
{
offersFullTime : {
totalCompensation : {
baseValue : {
gte : input.salaryMin ? ? undefined ,
lte : input.salaryMax ? ? undefined ,
} ,
} ,
} ,
} ,
} ,
{
offersFullTime : {
title :
input . title != null && input . title . length !== 0
? input . title
{
companyId :
input . companyId && input . companyId . length !== 0
? input . companyId
: undefined ,
} ,
} ,
{
offersFullTime : {
totalCompensation : {
baseValue : {
gte : input.salaryMin ? ? undefined ,
lte : input.salaryMax ? ? undefined ,
{
profile : {
background : {
totalYoe : {
gte : yoeMin ,
lte : yoeMax ,
} ,
} ,
} ,
} ,
} ,
{
companyId :
input . companyId && input . companyId . length !== 0
? input . companyId
: undefined ,
} ,
{
profile : {
background : {
totalYoe : {
gte : yoeMin ,
lte : yoeMax ,
} ,
{
monthYearReceived : {
gte : input.dateStart ? ? undefined ,
lte : input.dateEnd ? ? undefined ,
} ,
} ,
} ,
{
monthYearReceived : {
gte : input.dateStart ? ? undefined ,
lte : input.dateEnd ? ? undefined ,
} ,
} ,
] ,
} ,
} ) ;
] ,
} ,
} ) ;
const startRecordIndex : number = input . limit * input . offset ;
const endRecordIndex : number =
startRecordIndex + input . limit <= data . length
? startRecordIndex + input . limit
: data . length ;
let paginatedData = data . slice ( startRecordIndex , endRecordIndex ) ;
const startRecordIndex : number = input . limit * input . offset ;
const endRecordIndex : number =
startRecordIndex + input . limit <= data . length
? startRecordIndex + input . limit
: data . length ;
let paginatedData = data . slice ( startRecordIndex , endRecordIndex ) ;
// CONVERTING
const currency = input . currency ? . toUpperCase ( ) ;
if ( currency != null && currency in Currency ) {
paginatedData = await Promise . all (
paginatedData . map ( async ( offer ) = > {
if ( offer . offersFullTime ? . totalCompensation != null ) {
offer . offersFullTime . totalCompensation . value =
await convertWithDate (
offer . offersFullTime . totalCompensation . value ,
offer . offersFullTime . totalCompensation . currency ,
currency ,
offer . offersFullTime . totalCompensation . updatedAt ,
) ;
offer . offersFullTime . totalCompensation . currency = currency ;
// CONVERTING
const currency = input . currency ? . toUpperCase ( ) ;
if ( currency != null && currency in Currency ) {
paginatedData = await Promise . all (
paginatedData . map ( async ( offer ) = > {
if ( offer . offersFullTime ? . totalCompensation != null ) {
offer . offersFullTime . totalCompensation . value =
await convertWithDate (
offer . offersFullTime . totalCompensation . value ,
offer . offersFullTime . totalCompensation . currency ,
currency ,
offer . offersFullTime . totalCompensation . updatedAt ,
) ;
offer . offersFullTime . totalCompensation . currency = currency ;
if ( offer . offersFullTime ? . baseSalary != null ) {
offer . offersFullTime . baseSalary . value = await convertWithDate (
offer . offersFullTime . baseSalary . value ,
offer . offersFullTime . baseSalary . currency ,
currency ,
offer . offersFullTime . baseSalary . updatedAt ,
) ;
offer . offersFullTime . baseSalary . currency = currency ;
}
if ( offer . offersFullTime ? . baseSalary != null ) {
offer . offersFullTime . baseSalary . value = await convertWithDate (
offer . offersFullTime . baseSalary . value ,
offer . offersFullTime . baseSalary . currency ,
currency ,
offer . offersFullTime . baseSalary . updatedAt ,
) ;
offer . offersFullTime . baseSalary . currency = currency ;
}
if ( offer . offersFullTime ? . stocks != null ) {
offer . offersFullTime . stocks . value = await convertWithDate (
offer . offersFullTime . stocks . value ,
offer . offersFullTime . stocks . currency ,
currency ,
offer . offersFullTime . stocks . updatedAt ,
) ;
offer . offersFullTime . stocks . currency = currency ;
}
if ( offer . offersFullTime ? . stocks != null ) {
offer . offersFullTime . stocks . value = await convertWithDate (
offer . offersFullTime . stocks . value ,
offer . offersFullTime . stocks . currency ,
currency ,
offer . offersFullTime . stocks . updatedAt ,
) ;
offer . offersFullTime . stocks . currency = currency ;
}
if ( offer . offersFullTime ? . bonus != null ) {
offer . offersFullTime . bonus . value = await convertWithDate (
offer . offersFullTime . bonus . value ,
offer . offersFullTime . bonus . currency ,
if ( offer . offersFullTime ? . bonus != null ) {
offer . offersFullTime . bonus . value = await convertWithDate (
offer . offersFullTime . bonus . value ,
offer . offersFullTime . bonus . currency ,
currency ,
offer . offersFullTime . bonus . updatedAt ,
) ;
offer . offersFullTime . bonus . currency = currency ;
}
} else if ( offer . offersIntern ? . monthlySalary != null ) {
offer . offersIntern . monthlySalary . value = await convertWithDate (
offer . offersIntern . monthlySalary . value ,
offer . offersIntern . monthlySalary . currency ,
currency ,
offer . offersFullTime . bonus . updatedAt ,
offer . offers Intern. monthlySalary . updatedAt ,
) ;
offer . offersFullTime . bonus . currency = currency ;
offer . offersIntern . monthlySalary . currency = currency ;
} else {
throw new TRPCError ( {
code : 'NOT_FOUND' ,
message : 'Total Compensation or Salary not found' ,
} ) ;
}
} else if ( offer . offersIntern ? . monthlySalary != null ) {
offer . offersIntern . monthlySalary . value = await convertWithDate (
offer . offersIntern . monthlySalary . value ,
offer . offersIntern . monthlySalary . currency ,
currency ,
offer . offersIntern . monthlySalary . updatedAt ,
) ;
offer . offersIntern . monthlySalary . currency = currency ;
} else {
throw new TRPCError ( {
code : 'NOT_FOUND' ,
message : 'Total Compensation or Salary not found' ,
} ) ;
}
return offer ;
} ) ,
) ;
}
return getAdminOffersResponseMapper (
paginatedData . map ( ( offer ) = > adminDashboardOfferDtoMapper ( offer ) ) ,
{
currentPage : input.offset ,
numOfItems : paginatedData.length ,
numOfPages : Math.ceil ( data . length / input . limit ) ,
totalItems : data.length ,
} ,
! yoeRange ? JobType.INTERN : JobType.FULLTIME ,
) ;
} ,
} ) . query ( 'isAdmin' , {
async resolve ( { ctx } ) {
const userId = ctx . session . user . id ;
const result = await ctx . prisma . offersAdmin . findFirst ( {
where : {
userId
return offer ;
} ) ,
) ;
}
} )
return result ? true : false
}
} ) ;
return getAdminOffersResponseMapper (
paginatedData . map ( ( offer ) = > adminDashboardOfferDtoMapper ( offer ) ) ,
{
currentPage : input.offset ,
numOfItems : paginatedData.length ,
numOfPages : Math.ceil ( data . length / input . limit ) ,
totalItems : data.length ,
} ,
! yoeRange ? JobType.INTERN : JobType.FULLTIME ,
) ;
} ,
} )
. query ( 'isAdmin' , {
async resolve ( { ctx } ) {
const userId = ctx . session . user . id ;
const result = await ctx . prisma . offersAdmin . findFirst ( {
where : {
userId ,
} ,
} ) ;
return result ? true : false ;
} ,
} ) ;