import cleanup
This commit is contained in:
+292
-325
@@ -18,9 +18,10 @@ export async function createUser(user: User): Promise<number> {
|
||||
const password_hash: string = await bcrypt.hash(user.password!, 12);
|
||||
|
||||
const response = await sql`
|
||||
INSERT INTO users (username, password_hash, perms, created_at, last_signin, active, email, phone, full_name, company_code)
|
||||
VALUES (${user.username}, ${password_hash}, ${user.perms}, NOW(), NOW(), ${user.active}, ${user.email}, ${user.phone}, ${user.fullName}, ${user.companyCode})
|
||||
RETURNING id;
|
||||
INSERT INTO users (username, password_hash, perms, created_at, last_signin, active, email, phone, full_name,
|
||||
company_code)
|
||||
VALUES (${user.username}, ${password_hash}, ${user.perms}, NOW(), NOW(), ${user.active}, ${user.email},
|
||||
${user.phone}, ${user.fullName}, ${user.companyCode}) RETURNING id;
|
||||
`;
|
||||
|
||||
// TODO: handle custom image uploads
|
||||
@@ -40,17 +41,30 @@ export async function updateUser(user: User): Promise<number> {
|
||||
|
||||
// Construct the SQL query
|
||||
const response = await sql`UPDATE users
|
||||
SET
|
||||
username = ${user.username},
|
||||
${user.perms !== undefined ? sql`perms = ${user.perms},` : sql``}
|
||||
${user.active !== undefined ? sql`active = ${user.active},` : sql``}
|
||||
${password_hash !== null ? sql`password_hash = ${password_hash},` : sql``}
|
||||
email = ${user.email},
|
||||
phone = ${user.phone},
|
||||
full_name = ${user.fullName},
|
||||
company_code = ${user.companyCode}
|
||||
WHERE id = ${user.id}
|
||||
RETURNING id;`;
|
||||
SET username = ${user.username},
|
||||
${
|
||||
user.perms !== undefined
|
||||
? sql`perms
|
||||
=
|
||||
${user.perms},`
|
||||
: sql``
|
||||
}
|
||||
${
|
||||
user.active !== undefined
|
||||
? sql`active
|
||||
=
|
||||
${user.active},`
|
||||
: sql``
|
||||
} ${
|
||||
password_hash !== null
|
||||
? sql`password_hash
|
||||
=
|
||||
${password_hash},`
|
||||
: sql``
|
||||
}
|
||||
email = ${user.email}, phone = ${user.phone}, full_name = ${user.fullName}, company_code = ${user.companyCode}
|
||||
WHERE id = ${user.id}
|
||||
RETURNING id;`;
|
||||
|
||||
await saveAvatar(user);
|
||||
|
||||
@@ -59,9 +73,9 @@ export async function updateUser(user: User): Promise<number> {
|
||||
|
||||
export async function checkUserCreds(username: string, password: string): Promise<User | null> {
|
||||
const [user] = await sql`
|
||||
SELECT id, username, password_hash, perms, active, company_id AS "companyId"
|
||||
FROM users
|
||||
WHERE username = ${username}
|
||||
SELECT id, username, password_hash, perms, active, company_id AS "companyId"
|
||||
FROM users
|
||||
WHERE username = ${username}
|
||||
`;
|
||||
|
||||
if (!user) {
|
||||
@@ -85,7 +99,7 @@ export async function getUsers(searchQuery: string | null = null): Promise<User[
|
||||
active,
|
||||
email,
|
||||
phone,
|
||||
full_name AS "fullName",
|
||||
full_name AS "fullName",
|
||||
company_id
|
||||
FROM users
|
||||
WHERE username ILIKE ${searchQuery ? `%${searchQuery}%` : '%'};
|
||||
@@ -115,11 +129,18 @@ export async function getCompanies(searchQuery: string | null = null): Promise<C
|
||||
// should require MANAGE_USERS permission
|
||||
export async function getUser(id: number): Promise<User> {
|
||||
const [user] = await sql`
|
||||
SELECT id, username, perms,
|
||||
created_at AT TIME ZONE 'UTC' AS "createdAt",
|
||||
SELECT id,
|
||||
username,
|
||||
perms,
|
||||
created_at AT TIME ZONE 'UTC' AS "createdAt",
|
||||
last_signin AT TIME ZONE 'UTC' AS "lastSignIn",
|
||||
active, email, phone, full_name AS "fullName", company_id, company_code
|
||||
FROM users
|
||||
active,
|
||||
email,
|
||||
phone,
|
||||
full_name AS "fullName",
|
||||
company_id,
|
||||
company_code
|
||||
FROM users
|
||||
WHERE id = ${id};
|
||||
`;
|
||||
if (!user) {
|
||||
@@ -134,27 +155,24 @@ export async function getUser(id: number): Promise<User> {
|
||||
|
||||
export async function getUserWithCompany(id: number): Promise<User> {
|
||||
const [user] = await sql`
|
||||
SELECT
|
||||
u.id,
|
||||
u.username,
|
||||
u.perms,
|
||||
u.email,
|
||||
u.phone,
|
||||
u.full_name AS "fullName",
|
||||
u.created_at AT TIME ZONE 'UTC' AS "createdAt",
|
||||
u.last_signin AT TIME ZONE 'UTC' AS "lastSignIn",
|
||||
u.active,
|
||||
c.id AS company_id,
|
||||
c.name AS company_name,
|
||||
c.description AS company_description,
|
||||
c.website AS company_website,
|
||||
c.created_at AS company_created_at
|
||||
FROM
|
||||
users u
|
||||
LEFT JOIN
|
||||
companies c ON u.company_id = c.id
|
||||
WHERE
|
||||
u.id = ${id};
|
||||
SELECT u.id,
|
||||
u.username,
|
||||
u.perms,
|
||||
u.email,
|
||||
u.phone,
|
||||
u.full_name AS "fullName",
|
||||
u.created_at AT TIME ZONE 'UTC' AS "createdAt",
|
||||
u.last_signin AT TIME ZONE 'UTC' AS "lastSignIn",
|
||||
u.active,
|
||||
c.id AS company_id,
|
||||
c.name AS company_name,
|
||||
c.description AS company_description,
|
||||
c.website AS company_website,
|
||||
c.created_at AS company_created_at
|
||||
FROM users u
|
||||
LEFT JOIN
|
||||
companies c ON u.company_id = c.id
|
||||
WHERE u.id = ${id};
|
||||
`;
|
||||
if (!user) {
|
||||
error(404, 'User not found');
|
||||
@@ -181,48 +199,34 @@ export async function getUserWithCompanyAndApplications(
|
||||
id: number
|
||||
): Promise<{ user: User; applications: Application[] }> {
|
||||
const data = await sql`
|
||||
WITH company_data AS (
|
||||
SELECT
|
||||
id,
|
||||
name,
|
||||
description,
|
||||
website,
|
||||
created_at AT TIME ZONE 'UTC' AS "createdAt"
|
||||
FROM companies
|
||||
WHERE id = (SELECT company_id FROM users WHERE id = ${id})
|
||||
),
|
||||
user_data AS (
|
||||
SELECT
|
||||
id,
|
||||
username,
|
||||
perms,
|
||||
email,
|
||||
phone,
|
||||
full_name AS "fullName",
|
||||
created_at AT TIME ZONE 'UTC' AS "createdAt",
|
||||
last_signin AT TIME ZONE 'UTC' AS "lastSignIn",
|
||||
active
|
||||
FROM users
|
||||
WHERE "id" = ${id}
|
||||
),
|
||||
application_data AS (
|
||||
SELECT
|
||||
id,
|
||||
posting_id AS "postingId",
|
||||
(SELECT title FROM postings WHERE id = posting_id) AS "postingTitle",
|
||||
created_at AT TIME ZONE 'UTC' AS "createdAt"
|
||||
FROM applications
|
||||
WHERE "user_id" = ${id}
|
||||
)
|
||||
SELECT
|
||||
(
|
||||
SELECT row_to_json(company_data)
|
||||
FROM company_data
|
||||
) AS company,
|
||||
(
|
||||
SELECT row_to_json(user_data)
|
||||
FROM user_data
|
||||
) AS user,
|
||||
WITH company_data AS (SELECT id,
|
||||
name,
|
||||
description,
|
||||
website,
|
||||
created_at AT TIME ZONE 'UTC' AS "createdAt"
|
||||
FROM companies
|
||||
WHERE id = (SELECT company_id FROM users WHERE id = ${id})),
|
||||
user_data AS (SELECT id,
|
||||
username,
|
||||
perms,
|
||||
email,
|
||||
phone,
|
||||
full_name AS "fullName",
|
||||
created_at AT TIME ZONE 'UTC' AS "createdAt",
|
||||
last_signin AT TIME ZONE 'UTC' AS "lastSignIn",
|
||||
active
|
||||
FROM users
|
||||
WHERE "id" = ${id}),
|
||||
application_data AS (SELECT id,
|
||||
posting_id AS "postingId",
|
||||
(SELECT title FROM postings WHERE id = posting_id) AS "postingTitle",
|
||||
created_at AT TIME ZONE 'UTC' AS "createdAt"
|
||||
FROM applications
|
||||
WHERE "user_id" = ${id})
|
||||
SELECT (SELECT row_to_json(company_data)
|
||||
FROM company_data) AS company,
|
||||
(SELECT row_to_json(user_data)
|
||||
FROM user_data) AS user,
|
||||
(
|
||||
SELECT json_agg(row_to_json(application_data))
|
||||
FROM application_data
|
||||
@@ -258,8 +262,9 @@ export async function getUserWithCompanyAndApplications(
|
||||
// should require MANAGE_USERS permission
|
||||
export async function deleteUser(id: number): Promise<void> {
|
||||
await sql`
|
||||
DELETE FROM users
|
||||
WHERE id = ${id};
|
||||
DELETE
|
||||
FROM users
|
||||
WHERE id = ${id};
|
||||
`;
|
||||
}
|
||||
|
||||
@@ -274,17 +279,17 @@ export async function getTags(searchQuery: string | null): Promise<Tag[]> {
|
||||
|
||||
export async function updateLastSignin(username: string): Promise<void> {
|
||||
await sql`
|
||||
UPDATE users
|
||||
SET last_signin = NOW()
|
||||
WHERE username = ${username};
|
||||
UPDATE users
|
||||
SET last_signin = NOW()
|
||||
WHERE username = ${username};
|
||||
`;
|
||||
}
|
||||
|
||||
export async function createCompany(company: Company): Promise<number> {
|
||||
const response = await sql`
|
||||
INSERT INTO companies (name, description, website, created_at, company_code)
|
||||
VALUES (${company.name}, ${company.description}, ${company.website}, NOW(), generate_company_code(CAST(CURRVAL('companies_id_seq') AS INT)))
|
||||
RETURNING id;
|
||||
INSERT INTO companies (name, description, website, created_at, company_code)
|
||||
VALUES (${company.name}, ${company.description}, ${company.website}, NOW(),
|
||||
generate_company_code(CAST(CURRVAL('companies_id_seq') AS INT))) RETURNING id;
|
||||
`;
|
||||
|
||||
await saveLogo(company);
|
||||
@@ -294,10 +299,11 @@ export async function createCompany(company: Company): Promise<number> {
|
||||
|
||||
export async function editCompany(company: Company): Promise<number> {
|
||||
const response = await sql`
|
||||
UPDATE companies
|
||||
SET name = ${company.name}, description = ${company.description}, website = ${company.website}
|
||||
WHERE id = ${company.id}
|
||||
RETURNING id;
|
||||
UPDATE companies
|
||||
SET name = ${company.name},
|
||||
description = ${company.description},
|
||||
website = ${company.website}
|
||||
WHERE id = ${company.id} RETURNING id;
|
||||
`;
|
||||
|
||||
await saveLogo(company);
|
||||
@@ -307,8 +313,9 @@ export async function editCompany(company: Company): Promise<number> {
|
||||
|
||||
export async function deleteCompany(id: number): Promise<void> {
|
||||
await sql`
|
||||
DELETE FROM companies
|
||||
WHERE id = ${id};
|
||||
DELETE
|
||||
FROM companies
|
||||
WHERE id = ${id};
|
||||
`;
|
||||
|
||||
await deleteLogo(<Company>{ id: id });
|
||||
@@ -316,9 +323,9 @@ export async function deleteCompany(id: number): Promise<void> {
|
||||
|
||||
export async function getCompany(id: number): Promise<Company> {
|
||||
const [company] = await sql`
|
||||
SELECT id, name, description, website, created_at AS "createdAt", company_code AS "companyCode"
|
||||
FROM companies
|
||||
WHERE id = ${id};
|
||||
SELECT id, name, description, website, created_at AS "createdAt", company_code AS "companyCode"
|
||||
FROM companies
|
||||
WHERE id = ${id};
|
||||
`;
|
||||
|
||||
if (!company) {
|
||||
@@ -332,56 +339,40 @@ export async function getCompanyFullData(
|
||||
id: number
|
||||
): Promise<{ company: Company; users: User[]; postings: Posting[] }> {
|
||||
const data = await sql`
|
||||
WITH company_data AS (
|
||||
SELECT
|
||||
id,
|
||||
name,
|
||||
description,
|
||||
website,
|
||||
created_at AT TIME ZONE 'UTC' AS "createdAt"
|
||||
FROM companies
|
||||
WHERE id = ${id}
|
||||
),
|
||||
user_data AS (
|
||||
SELECT
|
||||
id,
|
||||
username,
|
||||
email,
|
||||
phone,
|
||||
full_name AS "fullName"
|
||||
FROM users
|
||||
WHERE "company_id" = ${id}
|
||||
),
|
||||
posting_data AS (
|
||||
SELECT
|
||||
id,
|
||||
title,
|
||||
description,
|
||||
employer_id AS "employerId",
|
||||
address,
|
||||
employment_type AS "employmentType",
|
||||
wage,
|
||||
link,
|
||||
tag_ids AS "tagIds",
|
||||
created_at AT TIME ZONE 'UTC' AS "createdAt",
|
||||
updated_at AT TIME ZONE 'UTC' AS "updatedAt",
|
||||
flyer_link AS "flyerLink"
|
||||
FROM postings
|
||||
WHERE "company_id" = ${id}
|
||||
)
|
||||
SELECT
|
||||
(
|
||||
SELECT row_to_json(company_data)
|
||||
FROM company_data
|
||||
) AS company,
|
||||
(
|
||||
SELECT json_agg(row_to_json(user_data))
|
||||
FROM user_data
|
||||
) AS users,
|
||||
(
|
||||
SELECT json_agg(row_to_json(posting_data))
|
||||
FROM posting_data
|
||||
) AS postings;
|
||||
WITH company_data AS (SELECT id,
|
||||
name,
|
||||
description,
|
||||
website,
|
||||
created_at AT TIME ZONE 'UTC' AS "createdAt"
|
||||
FROM companies
|
||||
WHERE id = ${id}),
|
||||
user_data AS (SELECT id,
|
||||
username,
|
||||
email,
|
||||
phone,
|
||||
full_name AS "fullName"
|
||||
FROM users
|
||||
WHERE "company_id" = ${id}),
|
||||
posting_data AS (SELECT id,
|
||||
title,
|
||||
description,
|
||||
employer_id AS "employerId",
|
||||
address,
|
||||
employment_type AS "employmentType",
|
||||
wage,
|
||||
link,
|
||||
tag_ids AS "tagIds",
|
||||
created_at AT TIME ZONE 'UTC' AS "createdAt",
|
||||
updated_at AT TIME ZONE 'UTC' AS "updatedAt",
|
||||
flyer_link AS "flyerLink"
|
||||
FROM postings
|
||||
WHERE "company_id" = ${id})
|
||||
SELECT (SELECT row_to_json(company_data)
|
||||
FROM company_data) AS company,
|
||||
(SELECT json_agg(row_to_json(user_data))
|
||||
FROM user_data) AS users,
|
||||
(SELECT json_agg(row_to_json(posting_data))
|
||||
FROM posting_data) AS postings;
|
||||
`;
|
||||
|
||||
if (!data) {
|
||||
@@ -432,9 +423,11 @@ export async function createPosting(posting: Posting): Promise<number> {
|
||||
}
|
||||
}
|
||||
const response = await sql`
|
||||
INSERT INTO postings (title, description, employer_id, address, employment_type, wage, link, tag_ids, created_at, updated_at, flyer_link, company_id)
|
||||
VALUES (${posting.title}, ${posting.description}, ${posting.employerId}, ${posting.address}, ${posting.employmentType}, ${posting.wage}, ${posting.link}, ${posting.tagIds}, NOW(), NOW(), ${posting.flyerLink}, ${posting.companyId})
|
||||
RETURNING id;
|
||||
INSERT INTO postings (title, description, employer_id, address, employment_type, wage, link, tag_ids, created_at,
|
||||
updated_at, flyer_link, company_id)
|
||||
VALUES (${posting.title}, ${posting.description}, ${posting.employerId}, ${posting.address},
|
||||
${posting.employmentType}, ${posting.wage}, ${posting.link}, ${posting.tagIds}, NOW(), NOW(),
|
||||
${posting.flyerLink}, ${posting.companyId}) RETURNING id;
|
||||
`;
|
||||
|
||||
return response[0].id;
|
||||
@@ -456,10 +449,19 @@ export async function editPosting(posting: Posting): Promise<number> {
|
||||
}
|
||||
|
||||
const response = await sql`
|
||||
UPDATE postings
|
||||
SET title = ${posting.title}, description = ${posting.description}, employer_id = ${posting.employerId}, address = ${posting.address}, employment_type = ${posting.employmentType}, wage = ${posting.wage}, link = ${posting.link}, tag_ids = ${posting.tagIds}, updated_at = NOW(), flyer_link = ${posting.flyerLink}, company_id = ${posting.companyId}
|
||||
WHERE id = ${posting.id}
|
||||
RETURNING id;
|
||||
UPDATE postings
|
||||
SET title = ${posting.title},
|
||||
description = ${posting.description},
|
||||
employer_id = ${posting.employerId},
|
||||
address = ${posting.address},
|
||||
employment_type = ${posting.employmentType},
|
||||
wage = ${posting.wage},
|
||||
link = ${posting.link},
|
||||
tag_ids = ${posting.tagIds},
|
||||
updated_at = NOW(),
|
||||
flyer_link = ${posting.flyerLink},
|
||||
company_id = ${posting.companyId}
|
||||
WHERE id = ${posting.id} RETURNING id;
|
||||
`;
|
||||
|
||||
return response[0].id;
|
||||
@@ -467,8 +469,9 @@ export async function editPosting(posting: Posting): Promise<number> {
|
||||
|
||||
export async function deletePosting(id: number): Promise<void> {
|
||||
await sql`
|
||||
DELETE FROM postings
|
||||
WHERE id = ${id};
|
||||
DELETE
|
||||
FROM postings
|
||||
WHERE id = ${id};
|
||||
`;
|
||||
}
|
||||
|
||||
@@ -476,36 +479,28 @@ export async function getCompanyEmployers(
|
||||
id: number
|
||||
): Promise<{ company: Company; users: User[] }> {
|
||||
const data = await sql`
|
||||
WITH company_data AS (
|
||||
SELECT
|
||||
id,
|
||||
name,
|
||||
description,
|
||||
website,
|
||||
created_at AT TIME ZONE 'UTC' AS "createdAt",
|
||||
company_code AS "companyCode"
|
||||
FROM companies
|
||||
WHERE id = ${id}
|
||||
),
|
||||
WITH company_data AS (SELECT id,
|
||||
name,
|
||||
description,
|
||||
website,
|
||||
created_at AT TIME ZONE 'UTC' AS "createdAt",
|
||||
company_code AS "companyCode"
|
||||
FROM companies
|
||||
WHERE id = ${id}),
|
||||
user_data AS (SELECT id,
|
||||
username,
|
||||
email,
|
||||
phone,
|
||||
full_name AS "fullName",
|
||||
created_at AT TIME ZONE 'UTC' AS "createdAt",
|
||||
full_name AS "fullName",
|
||||
created_at AT TIME ZONE 'UTC' AS "createdAt",
|
||||
last_signin AT TIME ZONE 'UTC' AS "lastSignIn",
|
||||
company_id as "companyId"
|
||||
company_id as "companyId"
|
||||
FROM users
|
||||
WHERE "company_id" = ${id})
|
||||
SELECT
|
||||
(
|
||||
SELECT row_to_json(company_data)
|
||||
FROM company_data
|
||||
) AS company,
|
||||
(
|
||||
SELECT json_agg(row_to_json(user_data))
|
||||
FROM user_data
|
||||
) AS users;
|
||||
SELECT (SELECT row_to_json(company_data)
|
||||
FROM company_data) AS company,
|
||||
(SELECT json_agg(row_to_json(user_data))
|
||||
FROM user_data) AS users;
|
||||
`;
|
||||
|
||||
if (!data) {
|
||||
@@ -539,50 +534,40 @@ export async function getCompanyEmployersAndRequests(
|
||||
id: number
|
||||
): Promise<{ company: Company; employers: User[]; requests: User[] }> {
|
||||
const data = await sql`
|
||||
WITH company_data AS (
|
||||
SELECT
|
||||
id,
|
||||
name,
|
||||
description,
|
||||
website,
|
||||
created_at AT TIME ZONE 'UTC' AS "createdAt",
|
||||
company_code AS "companyCode"
|
||||
FROM companies
|
||||
WHERE id = ${id}
|
||||
),
|
||||
employer_data AS (SELECT id,
|
||||
username,
|
||||
email,
|
||||
phone,
|
||||
full_name AS "fullName",
|
||||
created_at AT TIME ZONE 'UTC' AS "createdAt",
|
||||
last_signin AT TIME ZONE 'UTC' AS "lastSignIn",
|
||||
company_id as "companyId"
|
||||
FROM users
|
||||
WHERE "company_id" = ${id}),
|
||||
request_data AS (SELECT id,
|
||||
username,
|
||||
email,
|
||||
phone,
|
||||
full_name AS "fullName",
|
||||
created_at AT TIME ZONE 'UTC' AS "createdAt",
|
||||
last_signin AT TIME ZONE 'UTC' AS "lastSignIn",
|
||||
company_id as "companyId"
|
||||
FROM users
|
||||
WHERE "company_code" = (SELECT company_code FROM companies WHERE id = ${id}))
|
||||
SELECT
|
||||
(
|
||||
SELECT row_to_json(company_data)
|
||||
FROM company_data
|
||||
) AS company,
|
||||
(
|
||||
SELECT json_agg(row_to_json(employer_data))
|
||||
FROM employer_data
|
||||
) AS employers,
|
||||
(
|
||||
SELECT json_agg(row_to_json(request_data))
|
||||
FROM request_data
|
||||
) AS requests;
|
||||
WITH company_data AS (SELECT id,
|
||||
name,
|
||||
description,
|
||||
website,
|
||||
created_at AT TIME ZONE 'UTC' AS "createdAt",
|
||||
company_code AS "companyCode"
|
||||
FROM companies
|
||||
WHERE id = ${id}),
|
||||
employer_data AS (SELECT id,
|
||||
username,
|
||||
email,
|
||||
phone,
|
||||
full_name AS "fullName",
|
||||
created_at AT TIME ZONE 'UTC' AS "createdAt",
|
||||
last_signin AT TIME ZONE 'UTC' AS "lastSignIn",
|
||||
company_id as "companyId"
|
||||
FROM users
|
||||
WHERE "company_id" = ${id}),
|
||||
request_data AS (SELECT id,
|
||||
username,
|
||||
email,
|
||||
phone,
|
||||
full_name AS "fullName",
|
||||
created_at AT TIME ZONE 'UTC' AS "createdAt",
|
||||
last_signin AT TIME ZONE 'UTC' AS "lastSignIn",
|
||||
company_id as "companyId"
|
||||
FROM users
|
||||
WHERE "company_code" = (SELECT company_code FROM companies WHERE id = ${id}))
|
||||
SELECT (SELECT row_to_json(company_data)
|
||||
FROM company_data) AS company,
|
||||
(SELECT json_agg(row_to_json(employer_data))
|
||||
FROM employer_data) AS employers,
|
||||
(SELECT json_agg(row_to_json(request_data))
|
||||
FROM request_data) AS requests;
|
||||
`;
|
||||
|
||||
if (!data) {
|
||||
@@ -632,18 +617,18 @@ export async function getCompanyEmployersAndRequests(
|
||||
|
||||
export async function removeEmployerFromCompany(companyId: number, userId: number): Promise<void> {
|
||||
await sql`
|
||||
UPDATE users
|
||||
SET company_id = NULL,
|
||||
company_code = NULL
|
||||
WHERE id = ${userId};
|
||||
UPDATE users
|
||||
SET company_id = NULL,
|
||||
company_code = NULL
|
||||
WHERE id = ${userId};
|
||||
`;
|
||||
}
|
||||
|
||||
export async function addEmployerToCompany(companyId: number, userId: number): Promise<void> {
|
||||
await sql`
|
||||
UPDATE users
|
||||
SET company_id = ${companyId}
|
||||
WHERE id = ${userId};
|
||||
UPDATE users
|
||||
SET company_id = ${companyId}
|
||||
WHERE id = ${userId};
|
||||
`;
|
||||
}
|
||||
|
||||
@@ -652,19 +637,19 @@ export async function getPostings(searchQuery: string | null = null): Promise<Po
|
||||
SELECT p.id,
|
||||
p.title,
|
||||
p.description,
|
||||
p.employer_id AS "employerId",
|
||||
p.employer_id AS "employerId",
|
||||
p.address,
|
||||
p.employment_type AS "employmentType",
|
||||
p.employment_type AS "employmentType",
|
||||
p.wage,
|
||||
p.link,
|
||||
p.tag_ids AS "tagIds",
|
||||
p.created_at AT TIME ZONE 'UTC' AS "createdAt",
|
||||
p.tag_ids AS "tagIds",
|
||||
p.created_at AT TIME ZONE 'UTC' AS "createdAt",
|
||||
p.updated_at AT TIME ZONE 'UTC' AS "updatedAt",
|
||||
p.flyer_link AS "flyerLink",
|
||||
p.company_id AS "companyId",
|
||||
c.name AS "companyName"
|
||||
p.flyer_link AS "flyerLink",
|
||||
p.company_id AS "companyId",
|
||||
c.name AS "companyName"
|
||||
FROM postings p
|
||||
LEFT JOIN companies c ON p.company_id = c.id
|
||||
LEFT JOIN companies c ON p.company_id = c.id
|
||||
WHERE title ILIKE ${searchQuery ? `%${searchQuery}%` : '%'};
|
||||
`;
|
||||
postings.forEach((posting) => {
|
||||
@@ -691,16 +676,16 @@ export async function getPosting(id: number): Promise<Posting> {
|
||||
SELECT id,
|
||||
title,
|
||||
description,
|
||||
employer_id AS "employerId",
|
||||
employer_id AS "employerId",
|
||||
address,
|
||||
employment_type AS "employmentType",
|
||||
employment_type AS "employmentType",
|
||||
wage,
|
||||
link,
|
||||
tag_ids AS "tagIds",
|
||||
created_at AT TIME ZONE 'UTC' AS "createdAt",
|
||||
tag_ids AS "tagIds",
|
||||
created_at AT TIME ZONE 'UTC' AS "createdAt",
|
||||
updated_at AT TIME ZONE 'UTC' AS "updatedAt",
|
||||
flyer_link AS "flyerLink",
|
||||
company_id AS "companyId"
|
||||
flyer_link AS "flyerLink",
|
||||
company_id AS "companyId"
|
||||
FROM postings
|
||||
WHERE id = ${id};
|
||||
`;
|
||||
@@ -726,51 +711,37 @@ export async function getPosting(id: number): Promise<Posting> {
|
||||
|
||||
export async function getPostingWithCompanyUser(id: number): Promise<Posting> {
|
||||
const data = await sql`
|
||||
WITH company_data AS (
|
||||
SELECT
|
||||
id,
|
||||
name,
|
||||
description,
|
||||
website,
|
||||
created_at AS "createdAt"
|
||||
FROM companies
|
||||
WHERE id = (SELECT company_id FROM postings WHERE id = ${id})
|
||||
),
|
||||
user_data AS (
|
||||
SELECT
|
||||
username,
|
||||
email,
|
||||
phone,
|
||||
full_name AS "fullName"
|
||||
FROM users
|
||||
WHERE "company_id" = (SELECT company_id FROM postings WHERE id = ${id})
|
||||
),
|
||||
posting_data AS (
|
||||
SELECT
|
||||
id,
|
||||
title,
|
||||
description,
|
||||
employer_id AS "employerId",
|
||||
address,
|
||||
employment_type AS "employmentType",
|
||||
wage,
|
||||
link,
|
||||
tag_ids AS "tagIds",
|
||||
created_at AT TIME ZONE 'UTC' AS "createdAt",
|
||||
updated_at AT TIME ZONE 'UTC' AS "updatedAt",
|
||||
flyer_link AS "flyerLink"
|
||||
FROM postings
|
||||
WHERE id = ${id}
|
||||
)
|
||||
SELECT
|
||||
(
|
||||
SELECT row_to_json(company_data)
|
||||
FROM company_data
|
||||
) AS company,
|
||||
(
|
||||
SELECT row_to_json(user_data)
|
||||
FROM user_data
|
||||
) AS user,
|
||||
WITH company_data AS (SELECT id,
|
||||
name,
|
||||
description,
|
||||
website,
|
||||
created_at AS "createdAt"
|
||||
FROM companies
|
||||
WHERE id = (SELECT company_id FROM postings WHERE id = ${id})),
|
||||
user_data AS (SELECT username,
|
||||
email,
|
||||
phone,
|
||||
full_name AS "fullName"
|
||||
FROM users
|
||||
WHERE "company_id" = (SELECT company_id FROM postings WHERE id = ${id})),
|
||||
posting_data AS (SELECT id,
|
||||
title,
|
||||
description,
|
||||
employer_id AS "employerId",
|
||||
address,
|
||||
employment_type AS "employmentType",
|
||||
wage,
|
||||
link,
|
||||
tag_ids AS "tagIds",
|
||||
created_at AT TIME ZONE 'UTC' AS "createdAt",
|
||||
updated_at AT TIME ZONE 'UTC' AS "updatedAt",
|
||||
flyer_link AS "flyerLink"
|
||||
FROM postings
|
||||
WHERE id = ${id})
|
||||
SELECT (SELECT row_to_json(company_data)
|
||||
FROM company_data) AS company,
|
||||
(SELECT row_to_json(user_data)
|
||||
FROM user_data) AS user,
|
||||
(
|
||||
SELECT row_to_json(posting_data)
|
||||
FROM posting_data
|
||||
@@ -796,9 +767,8 @@ export async function getPostingWithCompanyUser(id: number): Promise<Posting> {
|
||||
|
||||
export async function createApplication(application: Application): Promise<number> {
|
||||
const response = await sql`
|
||||
INSERT INTO applications (posting_id, user_id, candidate_statement, created_at)
|
||||
VALUES (${application.postingId}, ${application.userId}, ${application.candidateStatement}, NOW())
|
||||
RETURNING id;
|
||||
INSERT INTO applications (posting_id, user_id, candidate_statement, created_at)
|
||||
VALUES (${application.postingId}, ${application.userId}, ${application.candidateStatement}, NOW()) RETURNING id;
|
||||
`;
|
||||
|
||||
sendEmployerNotificationEmail(application.postingId).catch((err) => {
|
||||
@@ -808,9 +778,10 @@ export async function createApplication(application: Application): Promise<numbe
|
||||
}
|
||||
|
||||
export async function deleteApplication(id: number): Promise<void> {
|
||||
const response = await sql`
|
||||
DELETE FROM applications
|
||||
WHERE id = ${id};
|
||||
await sql`
|
||||
DELETE
|
||||
FROM applications
|
||||
WHERE id = ${id};
|
||||
`;
|
||||
}
|
||||
|
||||
@@ -819,23 +790,24 @@ export async function deleteApplicationWithUser(
|
||||
userId: number
|
||||
): Promise<void> {
|
||||
console.log(applicationId, userId);
|
||||
const response = await sql`
|
||||
DELETE FROM applications
|
||||
WHERE id = ${applicationId} AND user_id = ${userId};
|
||||
await sql`
|
||||
DELETE
|
||||
FROM applications
|
||||
WHERE id = ${applicationId}
|
||||
AND user_id = ${userId};
|
||||
`;
|
||||
}
|
||||
|
||||
export async function getApplications(postingId: number): Promise<Application[]> {
|
||||
const data = await sql`
|
||||
SELECT
|
||||
a.id,
|
||||
a.candidate_statement AS "candidateStatement",
|
||||
a.created_at AS "createdAt",
|
||||
u.id AS "userId",
|
||||
u.username,
|
||||
u.email,
|
||||
u.phone,
|
||||
u.full_name AS "fullName"
|
||||
SELECT a.id,
|
||||
a.candidate_statement AS "candidateStatement",
|
||||
a.created_at AS "createdAt",
|
||||
u.id AS "userId",
|
||||
u.username,
|
||||
u.email,
|
||||
u.phone,
|
||||
u.full_name AS "fullName"
|
||||
FROM applications a
|
||||
JOIN users u ON a.user_id = u.id
|
||||
WHERE a.posting_id = ${postingId};
|
||||
@@ -876,19 +848,14 @@ export async function getNotificationInfo(
|
||||
postingId: number
|
||||
): Promise<{ title: string; emails: string[] }> {
|
||||
const data = await sql`
|
||||
WITH posting_data AS (
|
||||
SELECT title, company_id
|
||||
FROM postings
|
||||
WHERE id = ${postingId}
|
||||
),
|
||||
user_emails AS (
|
||||
SELECT email
|
||||
FROM users
|
||||
WHERE company_id = (SELECT company_id FROM posting_data)
|
||||
)
|
||||
SELECT
|
||||
(SELECT title FROM posting_data) AS title,
|
||||
(SELECT json_agg(email) FROM user_emails) AS emails;
|
||||
WITH posting_data AS (SELECT title, company_id
|
||||
FROM postings
|
||||
WHERE id = ${postingId}),
|
||||
user_emails AS (SELECT email
|
||||
FROM users
|
||||
WHERE company_id = (SELECT company_id FROM posting_data))
|
||||
SELECT (SELECT title FROM posting_data) AS title,
|
||||
(SELECT json_agg(email) FROM user_emails) AS emails;
|
||||
`;
|
||||
|
||||
if (!data || !data[0]) {
|
||||
|
||||
Reference in New Issue
Block a user