@profullstack/agenticjobs 0.3.0 → 0.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (60) hide show
  1. package/dist/cli/index.d.ts +9 -1
  2. package/dist/cli/index.js +87 -9
  3. package/dist/cli/index.js.map +1 -1
  4. package/dist/client/client.d.ts +16 -0
  5. package/dist/client/client.js +8 -0
  6. package/dist/client/client.js.map +1 -1
  7. package/dist/config.d.ts +1 -1
  8. package/dist/config.js +1 -1
  9. package/dist/core/applications.js +4 -1
  10. package/dist/core/applications.js.map +1 -1
  11. package/dist/core/candidates.d.ts +42 -0
  12. package/dist/core/candidates.js +143 -0
  13. package/dist/core/candidates.js.map +1 -0
  14. package/dist/core/import-job.d.ts +36 -0
  15. package/dist/core/import-job.js +221 -0
  16. package/dist/core/import-job.js.map +1 -0
  17. package/dist/core/jobs.d.ts +29 -0
  18. package/dist/core/jobs.js +101 -31
  19. package/dist/core/jobs.js.map +1 -1
  20. package/dist/core/resumes.d.ts +23 -1
  21. package/dist/core/resumes.js +86 -9
  22. package/dist/core/resumes.js.map +1 -1
  23. package/dist/directory/fetch.d.ts +11 -1
  24. package/dist/directory/fetch.js +23 -8
  25. package/dist/directory/fetch.js.map +1 -1
  26. package/dist/markup/resume.js +7 -1
  27. package/dist/markup/resume.js.map +1 -1
  28. package/dist/schema/job.d.ts +13 -10
  29. package/dist/schema/job.js.map +1 -1
  30. package/dist/schema/query.js +8 -4
  31. package/dist/schema/query.js.map +1 -1
  32. package/dist/schema/text.d.ts +12 -1
  33. package/dist/schema/text.js +14 -3
  34. package/dist/schema/text.js.map +1 -1
  35. package/dist/server/routes/api.js +183 -18
  36. package/dist/server/routes/api.js.map +1 -1
  37. package/dist/server/routes/discovery.js +162 -1
  38. package/dist/server/routes/discovery.js.map +1 -1
  39. package/dist/server/routes/pages.js +30 -1
  40. package/dist/server/routes/pages.js.map +1 -1
  41. package/dist/views/candidates.d.ts +47 -0
  42. package/dist/views/candidates.js +21 -0
  43. package/dist/views/candidates.js.map +1 -0
  44. package/dist/views/jobs.d.ts +28 -0
  45. package/dist/views/jobs.js +54 -12
  46. package/dist/views/jobs.js.map +1 -1
  47. package/dist/views/layout.js +2 -2
  48. package/dist/views/layout.js.map +1 -1
  49. package/dist/views/me.js +12 -1
  50. package/dist/views/me.js.map +1 -1
  51. package/dist/views/post.js +1 -1
  52. package/dist/views/post.js.map +1 -1
  53. package/docs/openjob.md +16 -9
  54. package/migrations/0006_board_only_applications.sql +34 -0
  55. package/migrations/0007_public_resumes.sql +24 -0
  56. package/migrations/0008_backfill_public_slugs.sql +57 -0
  57. package/migrations/0009_shorten_runaway_slugs.sql +21 -0
  58. package/package.json +1 -1
  59. package/web/public/app.css +58 -2
  60. package/web/public/sw.js +29 -5
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Turning a job posting somewhere else into a listing here.
3
+ *
4
+ * This is what a URL is for now: applications are taken on the board, so a
5
+ * link to a job elsewhere is a source to import, never a destination to send
6
+ * an applicant to.
7
+ *
8
+ * Two paths, in this order:
9
+ *
10
+ * 1. **schema.org JobPosting in JSON-LD.** Most boards emit it, Google asks
11
+ * for it, and it is structured, so it is worth trying first and worth
12
+ * trusting when it is there.
13
+ * 2. **The page itself.** og:title and the readable text. Everything a page
14
+ * does not say stays unset rather than being guessed at.
15
+ *
16
+ * An import is always a DRAFT. Extraction from a page nobody designed for it
17
+ * is approximate, and this board's whole seam is that a machine prepares and a
18
+ * person releases. A silently published import would be a scraped listing on a
19
+ * board whose pitch is that nothing here is scraped.
20
+ */
21
+ import { type EmploymentType, type Workplace } from '../schema/job.ts';
22
+ export interface ImportedJob {
23
+ title: string;
24
+ description: string;
25
+ sourceUrl: string;
26
+ employmentType?: EmploymentType;
27
+ workplace?: Workplace;
28
+ location?: string;
29
+ /** Which path produced this, so the caller can say so rather than imply more. */
30
+ via: 'jsonld' | 'page';
31
+ /** What could not be read, in words a person can act on. */
32
+ warnings: string[];
33
+ }
34
+ export declare class JobImportProblem extends Error {
35
+ }
36
+ export declare function extractJob(html: string, sourceUrl: string): ImportedJob;
@@ -0,0 +1,221 @@
1
+ /**
2
+ * Turning a job posting somewhere else into a listing here.
3
+ *
4
+ * This is what a URL is for now: applications are taken on the board, so a
5
+ * link to a job elsewhere is a source to import, never a destination to send
6
+ * an applicant to.
7
+ *
8
+ * Two paths, in this order:
9
+ *
10
+ * 1. **schema.org JobPosting in JSON-LD.** Most boards emit it, Google asks
11
+ * for it, and it is structured, so it is worth trying first and worth
12
+ * trusting when it is there.
13
+ * 2. **The page itself.** og:title and the readable text. Everything a page
14
+ * does not say stays unset rather than being guessed at.
15
+ *
16
+ * An import is always a DRAFT. Extraction from a page nobody designed for it
17
+ * is approximate, and this board's whole seam is that a machine prepares and a
18
+ * person releases. A silently published import would be a scraped listing on a
19
+ * board whose pitch is that nothing here is scraped.
20
+ */
21
+ import { EMPLOYMENT_TYPES, WORKPLACES } from "../schema/job.js";
22
+ export class JobImportProblem extends Error {
23
+ }
24
+ /**
25
+ * Elements whose contents are never the job.
26
+ *
27
+ * The first group carries no readable text at all. The second is site
28
+ * furniture: a page without a <main> falls back to the whole <body>, and
29
+ * without this the listing ends up carrying "Back to gigs", the view counter,
30
+ * a testimonials block and an advertisement. That is what happened on the
31
+ * first real import, so this is not hypothetical tidying.
32
+ */
33
+ const DEAD = /<(script|style|template|noscript|svg|nav|header|footer|aside|form|button|select)[^>]*>[\s\S]*?<\/\1>/gi;
34
+ function stripTags(html) {
35
+ return html
36
+ .replace(DEAD, ' ')
37
+ .replace(/<br\s*\/?>/gi, '\n')
38
+ .replace(/<\/(p|div|li|h[1-6]|tr)>/gi, '\n')
39
+ .replace(/<li[^>]*>/gi, '- ')
40
+ .replace(/<[^>]+>/g, ' ');
41
+ }
42
+ /** The five named entities plus numeric ones; enough for text nobody will re-parse. */
43
+ function decode(text) {
44
+ return text
45
+ .replace(/&(#x?[0-9a-f]+|[a-z]+);/gi, (whole, body) => {
46
+ const named = {
47
+ amp: '&',
48
+ lt: '<',
49
+ gt: '>',
50
+ quot: '"',
51
+ apos: "'",
52
+ nbsp: ' ',
53
+ '#39': "'",
54
+ };
55
+ const key = body.toLowerCase();
56
+ if (named[key] !== undefined)
57
+ return named[key];
58
+ if (body.startsWith('#x') || body.startsWith('#X')) {
59
+ const code = Number.parseInt(body.slice(2), 16);
60
+ return Number.isFinite(code) ? String.fromCodePoint(code) : whole;
61
+ }
62
+ if (body.startsWith('#')) {
63
+ const code = Number.parseInt(body.slice(1), 10);
64
+ return Number.isFinite(code) ? String.fromCodePoint(code) : whole;
65
+ }
66
+ return whole;
67
+ })
68
+ .replace(/ /g, ' ');
69
+ }
70
+ function tidy(text) {
71
+ return decode(text)
72
+ .split('\n')
73
+ .map((line) => line.replace(/[ \t]+/g, ' ').trim())
74
+ .filter((line, index, lines) => line !== '' || lines[index - 1] !== '')
75
+ .join('\n')
76
+ .trim();
77
+ }
78
+ function metaContent(html, key) {
79
+ // Attribute order varies, so both orders are tried rather than assumed.
80
+ const patterns = [
81
+ new RegExp(`<meta[^>]+(?:property|name)=["']${key}["'][^>]+content=["']([^"']*)["']`, 'i'),
82
+ new RegExp(`<meta[^>]+content=["']([^"']*)["'][^>]+(?:property|name)=["']${key}["']`, 'i'),
83
+ ];
84
+ for (const pattern of patterns) {
85
+ const found = pattern.exec(html)?.[1];
86
+ if (found !== undefined && found.trim() !== '')
87
+ return decode(found.trim());
88
+ }
89
+ return null;
90
+ }
91
+ /** JSON-LD blocks, including the @graph wrapper a lot of CMSes emit. */
92
+ function jsonLdNodes(html) {
93
+ const nodes = [];
94
+ const blocks = html.matchAll(/<script[^>]+type=["']application\/ld\+json["'][^>]*>([\s\S]*?)<\/script>/gi);
95
+ for (const block of blocks) {
96
+ let parsed;
97
+ try {
98
+ parsed = JSON.parse(decode(block[1] ?? ''));
99
+ }
100
+ catch {
101
+ // A malformed block is not a reason to abandon the import; there is
102
+ // usually more than one and the page still has readable text.
103
+ continue;
104
+ }
105
+ const queue = Array.isArray(parsed) ? [...parsed] : [parsed];
106
+ while (queue.length > 0) {
107
+ const node = queue.shift();
108
+ if (typeof node !== 'object' || node === null)
109
+ continue;
110
+ const record = node;
111
+ const graph = record['@graph'];
112
+ if (Array.isArray(graph))
113
+ queue.push(...graph);
114
+ nodes.push(record);
115
+ }
116
+ }
117
+ return nodes;
118
+ }
119
+ function typeOf(node) {
120
+ const raw = node['@type'];
121
+ if (typeof raw === 'string')
122
+ return [raw];
123
+ if (Array.isArray(raw))
124
+ return raw.filter((t) => typeof t === 'string');
125
+ return [];
126
+ }
127
+ /** schema.org spells it MONTHLY, PART_TIME and so on. */
128
+ function employmentTypeOf(value) {
129
+ const raw = Array.isArray(value) ? value[0] : value;
130
+ if (typeof raw !== 'string')
131
+ return undefined;
132
+ const normalised = raw.toLowerCase().replace(/_/g, '-').trim();
133
+ return EMPLOYMENT_TYPES.includes(normalised)
134
+ ? normalised
135
+ : undefined;
136
+ }
137
+ function workplaceOf(node) {
138
+ const remote = node['jobLocationType'];
139
+ if (typeof remote === 'string' && remote.toUpperCase().includes('TELECOMMUTE'))
140
+ return 'remote';
141
+ const raw = node['workplace'];
142
+ if (typeof raw === 'string' && WORKPLACES.includes(raw.toLowerCase())) {
143
+ return raw.toLowerCase();
144
+ }
145
+ return undefined;
146
+ }
147
+ function locationOf(node) {
148
+ const place = Array.isArray(node['jobLocation']) ? node['jobLocation'][0] : node['jobLocation'];
149
+ if (typeof place !== 'object' || place === null)
150
+ return undefined;
151
+ const address = place['address'];
152
+ if (typeof address === 'string')
153
+ return address;
154
+ if (typeof address !== 'object' || address === null)
155
+ return undefined;
156
+ const parts = ['addressLocality', 'addressRegion', 'addressCountry']
157
+ .map((key) => address[key])
158
+ .filter((part) => typeof part === 'string' && part.trim() !== '');
159
+ return parts.length === 0 ? undefined : parts.join(', ');
160
+ }
161
+ /**
162
+ * The readable body of a page, without the furniture.
163
+ *
164
+ * Not a reader-mode implementation: it takes `<main>` or `<article>` when the
165
+ * page marks one, because a page that says where its content is should be
166
+ * believed, and otherwise the whole body. The result is a person's starting
167
+ * point, which is why the import is a draft.
168
+ */
169
+ function readableText(html) {
170
+ const main = /<main[^>]*>([\s\S]*?)<\/main>/i.exec(html)?.[1] ??
171
+ /<article[^>]*>([\s\S]*?)<\/article>/i.exec(html)?.[1] ??
172
+ /<body[^>]*>([\s\S]*?)<\/body>/i.exec(html)?.[1] ??
173
+ html;
174
+ return tidy(stripTags(main));
175
+ }
176
+ /** A page title usually carries the site name; the listing should not. */
177
+ function trimSiteName(title) {
178
+ return title.split(/\s+[|·—–]\s+/)[0]?.trim() || title.trim();
179
+ }
180
+ export function extractJob(html, sourceUrl) {
181
+ const warnings = [];
182
+ const posting = jsonLdNodes(html).find((node) => typeOf(node).includes('JobPosting'));
183
+ if (posting !== undefined) {
184
+ const title = typeof posting['title'] === 'string' ? posting['title'].trim() : '';
185
+ const rawDescription = typeof posting['description'] === 'string' ? posting['description'] : '';
186
+ const description = tidy(stripTags(rawDescription));
187
+ if (title !== '' && description !== '') {
188
+ const employmentType = employmentTypeOf(posting['employmentType']);
189
+ const workplace = workplaceOf(posting);
190
+ const location = locationOf(posting);
191
+ if (employmentType === undefined)
192
+ warnings.push('No employment type in the posting.');
193
+ if (workplace === undefined)
194
+ warnings.push('No workplace, so it was left unset.');
195
+ return {
196
+ title,
197
+ description,
198
+ sourceUrl,
199
+ via: 'jsonld',
200
+ warnings,
201
+ ...(employmentType === undefined ? {} : { employmentType }),
202
+ ...(workplace === undefined ? {} : { workplace }),
203
+ ...(location === undefined ? {} : { location }),
204
+ };
205
+ }
206
+ warnings.push('The page had a JobPosting but it was missing a title or a description.');
207
+ }
208
+ const title = trimSiteName(metaContent(html, 'og:title') ??
209
+ decode(/<h1[^>]*>([\s\S]*?)<\/h1>/i.exec(html)?.[1]?.replace(/<[^>]+>/g, '') ?? '') ??
210
+ decode(/<title[^>]*>([\s\S]*?)<\/title>/i.exec(html)?.[1] ?? ''));
211
+ if (title === '')
212
+ throw new JobImportProblem('That page has no title, so there is nothing to import.');
213
+ const body = readableText(html);
214
+ const description = body === '' ? (metaContent(html, 'og:description') ?? '') : body;
215
+ if (description === '') {
216
+ throw new JobImportProblem('That page has no readable text, so there is nothing to import.');
217
+ }
218
+ warnings.push('That page publishes no JobPosting data, so this was read off the page itself. Check every field before publishing.');
219
+ return { title, description, sourceUrl, via: 'page', warnings };
220
+ }
221
+ //# sourceMappingURL=import-job.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"import-job.js","sourceRoot":"","sources":["../../src/core/import-job.ts"],"names":[],"mappings":"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"}
@@ -29,6 +29,7 @@ interface JobRow {
29
29
  agent_policy: string;
30
30
  apply_via: string;
31
31
  apply_url: string | null;
32
+ apply_source_url: string | null;
32
33
  apply_email: string | null;
33
34
  apply_schema: ApplySchema | null;
34
35
  status: string;
@@ -73,6 +74,8 @@ export interface JobInput {
73
74
  agentPolicy: AgentPolicy;
74
75
  apply: ApplyMethod;
75
76
  expiresAt: string | null;
77
+ /** Where this listing was imported from, if it was. Provenance, not a destination. */
78
+ sourceUrl: string | null;
76
79
  }
77
80
  /**
78
81
  * Turn whatever a form, an API client or a model sent into a job we are
@@ -84,6 +87,32 @@ export declare function normaliseInput(input: Record<string, unknown>, orgId: st
84
87
  export declare function normaliseApplySchema(input: unknown): ApplySchema | null;
85
88
  export declare function createJob(pool: pg.Pool, input: JobInput): Promise<Job>;
86
89
  export declare function setStatus(pool: pg.Pool, id: string, status: JobStatus): Promise<Job | null>;
90
+ /**
91
+ * Refresh a listing from a re-import.
92
+ *
93
+ * Only the fields an import can actually supply are touched, and only when the
94
+ * new value is present: a re-import that could not read a location must not
95
+ * erase one a person typed in. Status is untouched, so refreshing a published
96
+ * listing does not unpublish it and refreshing a draft does not publish it.
97
+ */
98
+ export declare function updateJobFromImport(pool: pg.Pool, id: string, fields: {
99
+ title?: string;
100
+ description?: string;
101
+ employmentType?: EmploymentType;
102
+ workplace?: Workplace;
103
+ location?: string;
104
+ sourceUrl?: string;
105
+ }): Promise<Job | null>;
106
+ /**
107
+ * Rewrite a listing's content.
108
+ *
109
+ * Takes the same shape `createJob` takes, so an edit cannot put a listing into
110
+ * a state a post could not have created. Slug, status and org are untouched:
111
+ * the slug is the listing's public URL and editing must not break links to it.
112
+ */
113
+ export declare function editJob(pool: pg.Pool, id: string, input: JobInput): Promise<Job | null>;
114
+ /** The listing imported from this URL, if there is one. */
115
+ export declare function getJobBySourceUrl(pool: pg.Pool, url: string): Promise<Job | null>;
87
116
  export declare function countJobs(pool: pg.Pool): Promise<{
88
117
  open: number;
89
118
  total: number;
package/dist/core/jobs.js CHANGED
@@ -11,7 +11,8 @@ const SELECT = `
11
11
  select j.id, j.slug, j.title, j.description, j.employment_type, j.workplace, j.seniority,
12
12
  j.location, j.remote_regions, j.salary_min, j.salary_max, j.salary_currency,
13
13
  j.salary_period, j.salary_equity, j.tags, j.stack, j.requirements, j.responsibilities,
14
- j.agent_policy, j.apply_via, j.apply_url, j.apply_email, j.apply_schema, j.status,
14
+ j.agent_policy, j.apply_via, j.apply_url, j.apply_email, j.apply_schema,
15
+ j.apply_source_url, j.status,
15
16
  j.published_at, j.expires_at, j.created_at, j.updated_at,
16
17
  o.id as org_id, o.slug as org_slug, o.name as org_name, o.website as org_website,
17
18
  o.logo_url as org_logo_url, o.description as org_description,
@@ -30,13 +31,16 @@ function toOrganisation(row) {
30
31
  createdAt: row.org_created_at,
31
32
  };
32
33
  }
34
+ /**
35
+ * Every job is applied to here.
36
+ *
37
+ * Rows written before offsite applications were removed still carry
38
+ * `apply_via = 'url'` or `'email'`, and they read back as board applications:
39
+ * the migration rewrites the column, and this is what makes a row the
40
+ * migration has not reached yet safe to serve. The board's own form is the one
41
+ * target that cannot go missing.
42
+ */
33
43
  function toApplyMethod(row) {
34
- if (row.apply_via === 'url' && row.apply_url)
35
- return { via: 'url', url: row.apply_url };
36
- if (row.apply_via === 'email' && row.apply_email)
37
- return { via: 'email', email: row.apply_email };
38
- // A job whose declared method lost its target still has to be applicable,
39
- // and the board's own form is the one target that cannot go missing.
40
44
  return { via: 'board', schema: row.apply_schema ?? DEFAULT_APPLY_SCHEMA };
41
45
  }
42
46
  export function toJob(row) {
@@ -170,7 +174,8 @@ export function normaliseInput(input, orgId) {
170
174
  const title = clean(input['title'], 140);
171
175
  if (title.length < 3)
172
176
  return 'A title of at least 3 characters is required.';
173
- const description = clean(input['description'], 20_000);
177
+ // Markdown, so the line breaks are the structure and must survive.
178
+ const description = clean(input['description'], 20_000, { multiline: true });
174
179
  if (description.length < 20)
175
180
  return 'A description of at least 20 characters is required.';
176
181
  const employmentType = isEmploymentType(input['employmentType'])
@@ -209,28 +214,20 @@ export function normaliseInput(input, orgId) {
209
214
  agentPolicy,
210
215
  apply,
211
216
  expiresAt: date(input['expiresAt']),
217
+ // Set by the importer, never by a poster: it records where a listing was
218
+ // read from, and a hand-typed one was read from nowhere.
219
+ sourceUrl: null,
212
220
  };
213
221
  }
214
222
  function normaliseApply(input) {
223
+ // Applications happen here. A listing that points somewhere else is a link
224
+ // to a job rather than a job, and an agent cannot complete a form it cannot
225
+ // reach. Refused with the reason rather than silently rewritten to `board`,
226
+ // because an employer who asked for an offsite link and got a board form
227
+ // without being told would find out from the applications.
215
228
  const via = clean(input['applyVia'], 10) || 'board';
216
- if (via === 'url') {
217
- const url = clean(input['applyUrl'], 500);
218
- try {
219
- const parsed = new URL(url);
220
- if (parsed.protocol !== 'https:' && parsed.protocol !== 'http:') {
221
- return 'An application link must be http or https.';
222
- }
223
- return { via: 'url', url: parsed.toString() };
224
- }
225
- catch {
226
- return 'That application link is not a URL.';
227
- }
228
- }
229
- if (via === 'email') {
230
- const email = clean(input['applyEmail'], 200).toLowerCase();
231
- if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email))
232
- return 'That application address is not valid.';
233
- return { via: 'email', email };
229
+ if (via !== 'board') {
230
+ return 'Applications are taken on this board. Import a job from a URL instead of linking out to one.';
234
231
  }
235
232
  const schema = input['applySchema'];
236
233
  if (schema !== undefined && schema !== null) {
@@ -320,9 +317,9 @@ export async function createJob(pool, input) {
320
317
  slug, org_id, title, description, employment_type, workplace, seniority, location,
321
318
  remote_regions, salary_min, salary_max, salary_currency, salary_period, salary_equity,
322
319
  tags, stack, requirements, responsibilities, agent_policy, apply_via, apply_url,
323
- apply_email, apply_schema, expires_at, status
320
+ apply_email, apply_schema, apply_source_url, expires_at, status
324
321
  ) values (
325
- $1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14,$15,$16,$17,$18,$19,$20,$21,$22,$23,$24,'draft'
322
+ $1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14,$15,$16,$17,$18,$19,$20,$21,$22,$23,$24,$25,'draft'
326
323
  ) returning id`, [
327
324
  slug,
328
325
  input.orgId,
@@ -344,9 +341,10 @@ export async function createJob(pool, input) {
344
341
  input.responsibilities,
345
342
  input.agentPolicy,
346
343
  input.apply.via,
347
- input.apply.via === 'url' ? input.apply.url : null,
348
- input.apply.via === 'email' ? input.apply.email : null,
349
- input.apply.via === 'board' ? JSON.stringify(input.apply.schema) : null,
344
+ null,
345
+ null,
346
+ JSON.stringify(input.apply.schema),
347
+ input.sourceUrl,
350
348
  input.expiresAt,
351
349
  ]);
352
350
  const id = result.rows[0]?.id;
@@ -367,6 +365,78 @@ export async function setStatus(pool, id, status) {
367
365
  where id = $1`, [id, status]);
368
366
  return getJobById(pool, id);
369
367
  }
368
+ /**
369
+ * Refresh a listing from a re-import.
370
+ *
371
+ * Only the fields an import can actually supply are touched, and only when the
372
+ * new value is present: a re-import that could not read a location must not
373
+ * erase one a person typed in. Status is untouched, so refreshing a published
374
+ * listing does not unpublish it and refreshing a draft does not publish it.
375
+ */
376
+ export async function updateJobFromImport(pool, id, fields) {
377
+ await pool.query(`update jobs
378
+ set title = coalesce($2, title),
379
+ description = coalesce($3, description),
380
+ employment_type = coalesce($4, employment_type),
381
+ workplace = coalesce($5, workplace),
382
+ location = coalesce($6, location),
383
+ apply_source_url = coalesce($7, apply_source_url),
384
+ updated_at = now()
385
+ where id = $1`, [
386
+ id,
387
+ fields.title ?? null,
388
+ fields.description ?? null,
389
+ fields.employmentType ?? null,
390
+ fields.workplace ?? null,
391
+ fields.location ?? null,
392
+ fields.sourceUrl ?? null,
393
+ ]);
394
+ return getJobById(pool, id);
395
+ }
396
+ /**
397
+ * Rewrite a listing's content.
398
+ *
399
+ * Takes the same shape `createJob` takes, so an edit cannot put a listing into
400
+ * a state a post could not have created. Slug, status and org are untouched:
401
+ * the slug is the listing's public URL and editing must not break links to it.
402
+ */
403
+ export async function editJob(pool, id, input) {
404
+ await pool.query(`update jobs
405
+ set title = $2, description = $3, employment_type = $4, workplace = $5,
406
+ seniority = $6, location = $7, remote_regions = $8,
407
+ salary_min = $9, salary_max = $10, salary_currency = $11,
408
+ salary_period = $12, salary_equity = $13,
409
+ tags = $14, stack = $15, requirements = $16, responsibilities = $17,
410
+ agent_policy = $18, expires_at = $19, updated_at = now()
411
+ where id = $1`, [
412
+ id,
413
+ input.title,
414
+ input.description,
415
+ input.employmentType,
416
+ input.workplace,
417
+ input.seniority,
418
+ input.location,
419
+ input.remoteRegions,
420
+ input.salaryMin,
421
+ input.salaryMax,
422
+ input.salaryCurrency,
423
+ input.salaryPeriod,
424
+ input.salaryEquity,
425
+ input.tags,
426
+ input.stack,
427
+ input.requirements,
428
+ input.responsibilities,
429
+ input.agentPolicy,
430
+ input.expiresAt,
431
+ ]);
432
+ return getJobById(pool, id);
433
+ }
434
+ /** The listing imported from this URL, if there is one. */
435
+ export async function getJobBySourceUrl(pool, url) {
436
+ const result = await pool.query(`select id from jobs where apply_source_url = $1 order by created_at desc limit 1`, [url]);
437
+ const id = result.rows[0]?.id;
438
+ return id === undefined ? null : getJobById(pool, id);
439
+ }
370
440
  export async function countJobs(pool) {
371
441
  const result = await pool.query(`select
372
442
  count(*) filter (
@@ -1 +1 @@
1
- {"version":3,"file":"jobs.js","sourceRoot":"","sources":["../../src/core/jobs.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"jobs.js","sourceRoot":"","sources":["../../src/core/jobs.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EACL,oBAAoB,EACpB,aAAa,EACb,gBAAgB,EAChB,WAAW,EACX,cAAc,EACd,WAAW,GAYZ,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAyCtE,MAAM,MAAM,GAAG;;;;;;;;;;;;CAYd,CAAC;AAEF,SAAS,cAAc,CAAC,GAAW;IACjC,OAAO;QACL,EAAE,EAAE,GAAG,CAAC,MAAM;QACd,IAAI,EAAE,GAAG,CAAC,QAAQ;QAClB,IAAI,EAAE,GAAG,CAAC,QAAQ;QAClB,OAAO,EAAE,GAAG,CAAC,WAAW;QACxB,OAAO,EAAE,GAAG,CAAC,YAAY;QACzB,WAAW,EAAE,GAAG,CAAC,eAAe;QAChC,SAAS,EAAE,GAAG,CAAC,cAAc;KAC9B,CAAC;AACJ,CAAC;AAED;;;;;;;;GAQG;AACH,SAAS,aAAa,CAAC,GAAW;IAChC,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,YAAY,IAAI,oBAAoB,EAAE,CAAC;AAC5E,CAAC;AAED,MAAM,UAAU,KAAK,CAAC,GAAW;IAC/B,OAAO;QACL,EAAE,EAAE,GAAG,CAAC,EAAE;QACV,IAAI,EAAE,GAAG,CAAC,IAAI;QACd,GAAG,EAAE,cAAc,CAAC,GAAG,CAAC;QACxB,KAAK,EAAE,GAAG,CAAC,KAAK;QAChB,WAAW,EAAE,GAAG,CAAC,WAAW;QAC5B,cAAc,EAAE,gBAAgB,CAAC,GAAG,CAAC,eAAe,CAAC;YACnD,CAAC,CAAC,GAAG,CAAC,eAAe;YACrB,CAAC,CAAE,WAA8B;QACnC,SAAS,EAAE,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAE,QAAsB;QAC/E,SAAS,EAAE,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAE,GAAG,CAAC,SAAuB,CAAC,CAAC,CAAC,IAAI;QAC3E,QAAQ,EAAE,GAAG,CAAC,QAAQ;QACtB,aAAa,EAAE,GAAG,CAAC,cAAc,IAAI,EAAE;QACvC,MAAM,EAAE;YACN,GAAG,EAAE,GAAG,CAAC,UAAU;YACnB,GAAG,EAAE,GAAG,CAAC,UAAU;YACnB,QAAQ,EAAE,GAAG,CAAC,eAAe;YAC7B,MAAM,EAAE,cAAc,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,MAAM;YACtE,MAAM,EAAE,GAAG,CAAC,aAAa;SAC1B;QACD,IAAI,EAAE,GAAG,CAAC,IAAI,IAAI,EAAE;QACpB,KAAK,EAAE,GAAG,CAAC,KAAK,IAAI,EAAE;QACtB,YAAY,EAAE,GAAG,CAAC,YAAY,IAAI,EAAE;QACpC,gBAAgB,EAAE,GAAG,CAAC,gBAAgB,IAAI,EAAE;QAC5C,WAAW,EAAE,aAAa,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAE,UAA0B;QAC7F,KAAK,EAAE,aAAa,CAAC,GAAG,CAAC;QACzB,MAAM,EAAG,CAAC,OAAO,EAAE,WAAW,EAAE,QAAQ,CAAc,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC;YACzE,CAAC,CAAE,GAAG,CAAC,MAAoB;YAC3B,CAAC,CAAC,OAAO;QACX,WAAW,EAAE,GAAG,CAAC,YAAY;QAC7B,SAAS,EAAE,GAAG,CAAC,UAAU;QACzB,SAAS,EAAE,GAAG,CAAC,UAAU;QACzB,SAAS,EAAE,GAAG,CAAC,UAAU;KAC1B,CAAC;AACJ,CAAC;AAED,gFAAgF;AAChF,SAAS,UAAU,CAAC,KAAe,EAAE,kBAA2B;IAI9D,MAAM,MAAM,GAAc,EAAE,CAAC;IAC7B,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,IAAI,CAAC,kBAAkB,EAAE,CAAC;QACxB,KAAK,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;QACrC,KAAK,CAAC,IAAI,CAAC,wDAAwD,CAAC,CAAC;QACrE,2EAA2E;QAC3E,KAAK,CAAC,IAAI,CAAC,gDAAgD,CAAC,CAAC;IAC/D,CAAC;IAED,IAAI,KAAK,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QACrB,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACrB,KAAK,CAAC,IAAI,CAAC,gDAAgD,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;IAC/E,CAAC;IACD,IAAI,KAAK,CAAC,cAAc,KAAK,IAAI,EAAE,CAAC;QAClC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;QAClC,KAAK,CAAC,IAAI,CAAC,wBAAwB,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;IACtD,CAAC;IACD,IAAI,KAAK,CAAC,SAAS,KAAK,IAAI,EAAE,CAAC;QAC7B,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAC7B,KAAK,CAAC,IAAI,CAAC,kBAAkB,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;IAChD,CAAC;IACD,IAAI,KAAK,CAAC,SAAS,KAAK,IAAI,EAAE,CAAC;QAC7B,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAC7B,KAAK,CAAC,IAAI,CAAC,kBAAkB,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;IAChD,CAAC;IACD,IAAI,KAAK,CAAC,WAAW,KAAK,IAAI,EAAE,CAAC;QAC/B,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QAC/B,KAAK,CAAC,IAAI,CAAC,qBAAqB,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;IACnD,CAAC;IACD,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1B,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACxB,2EAA2E;QAC3E,wCAAwC;QACxC,KAAK,CAAC,IAAI,CAAC,eAAe,MAAM,CAAC,MAAM,2BAA2B,MAAM,CAAC,MAAM,WAAW,CAAC,CAAC;IAC9F,CAAC;IACD,IAAI,KAAK,CAAC,SAAS,KAAK,IAAI,EAAE,CAAC;QAC7B,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAC7B,2EAA2E;QAC3E,uEAAuE;QACvE,KAAK,CAAC,IAAI,CAAC,4CAA4C,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;IAC1E,CAAC;IACD,IAAI,KAAK,CAAC,GAAG,KAAK,IAAI,EAAE,CAAC;QACvB,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACvB,KAAK,CAAC,IAAI,CAAC,aAAa,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;IAC3C,CAAC;IAED,OAAO,EAAE,GAAG,EAAE,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,CAAC;AACnF,CAAC;AAED,SAAS,OAAO,CAAC,KAAe;IAC9B,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC5B,OAAO,uFAAuF,CAAC;IACjG,CAAC;IACD,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU,IAAI,KAAK,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QAClD,0EAA0E;QAC1E,kEAAkE;QAClE,OAAO,sGAAsG,CAAC;IAChH,CAAC;IACD,OAAO,4DAA4D,CAAC;AACtE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,IAAa,EACb,KAAe,EACf,UAA4C,EAAE;IAE9C,MAAM,kBAAkB,GAAG,OAAO,CAAC,kBAAkB,KAAK,IAAI,CAAC;IAC/D,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,UAAU,CAAC,KAAK,EAAE,kBAAkB,CAAC,CAAC;IAExE,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,KAAK,CAC9B,wFAAwF,QAAQ,EAAE,EAClG,MAAM,CACP,CAAC;IAEF,MAAM,UAAU,GAAG,CAAC,GAAG,MAAM,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IAC1D,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,KAAK,CAC3B,GAAG,MAAM,IAAI,QAAQ,IAAI,OAAO,CAAC,KAAK,CAAC,WAAW,UAAU,CAAC,MAAM,GAAG,CAAC,YAAY,UAAU,CAAC,MAAM,EAAE,EACtG,UAAU,CACX,CAAC;IAEF,OAAO;QACL,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC;QAC3B,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC;QAClC,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,MAAM,EAAE,KAAK,CAAC,MAAM;KACrB,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,IAAa,EACb,IAAY,EACZ,UAA4C,EAAE;IAE9C,MAAM,OAAO,GACX,OAAO,CAAC,kBAAkB,KAAK,IAAI;QACjC,CAAC,CAAC,EAAE;QACJ,CAAC,CAAC,uFAAuF,CAAC;IAC9F,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,KAAK,CAAS,GAAG,MAAM,sBAAsB,OAAO,UAAU,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;IAClG,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC3B,OAAO,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;AAC/C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,IAAa,EAAE,EAAU;IACxD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,KAAK,CAAS,GAAG,MAAM,0BAA0B,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IACnF,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC3B,OAAO,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;AAC/C,CAAC;AA2BD;;;;;GAKG;AACH,MAAM,UAAU,cAAc,CAAC,KAA8B,EAAE,KAAa;IAC1E,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,GAAG,CAAC,CAAC;IACzC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,+CAA+C,CAAC;IAE7E,mEAAmE;IACnE,MAAM,WAAW,GAAG,KAAK,CAAC,KAAK,CAAC,aAAa,CAAC,EAAE,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7E,IAAI,WAAW,CAAC,MAAM,GAAG,EAAE;QAAE,OAAO,sDAAsD,CAAC;IAE3F,MAAM,cAAc,GAAG,gBAAgB,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;QAC9D,CAAC,CAAC,KAAK,CAAC,gBAAgB,CAAC;QACzB,CAAC,CAAC,WAAW,CAAC;IAChB,MAAM,SAAS,GAAG,WAAW,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;IAClF,MAAM,SAAS,GAAG,WAAW,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC9E,MAAM,WAAW,GAAG,aAAa,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC;IAE5F,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC;IAC5C,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC;IAC5C,IAAI,SAAS,KAAK,IAAI,IAAI,SAAS,KAAK,IAAI,IAAI,SAAS,GAAG,SAAS,EAAE,CAAC;QACtE,OAAO,wDAAwD,CAAC;IAClE,CAAC;IAED,MAAM,KAAK,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;IACpC,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAE5C,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,GAAG,CAAC,CAAC;IAE/C,OAAO;QACL,KAAK;QACL,KAAK;QACL,WAAW;QACX,cAAc;QACd,SAAS;QACT,SAAS;QACT,QAAQ,EAAE,QAAQ,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ;QAC3C,aAAa,EAAE,SAAS,CAAC,KAAK,CAAC,eAAe,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;QACzF,SAAS;QACT,SAAS;QACT,cAAc,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,WAAW,EAAE;QAC1E,YAAY,EAAE,cAAc,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,MAAM;QACpF,YAAY,EAAE,KAAK,CAAC,KAAK,CAAC,cAAc,CAAC,EAAE,EAAE,CAAC,IAAI,IAAI;QACtD,IAAI,EAAE,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;QAClC,KAAK,EAAE,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC;QACpC,YAAY,EAAE,KAAK,CAAC,KAAK,CAAC,cAAc,CAAC,EAAE,EAAE,CAAC;QAC9C,gBAAgB,EAAE,KAAK,CAAC,KAAK,CAAC,kBAAkB,CAAC,EAAE,EAAE,CAAC;QACtD,WAAW;QACX,KAAK;QACL,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QACnC,yEAAyE;QACzE,yDAAyD;QACzD,SAAS,EAAE,IAAI;KAChB,CAAC;AACJ,CAAC;AAED,SAAS,cAAc,CAAC,KAA8B;IACpD,2EAA2E;IAC3E,4EAA4E;IAC5E,4EAA4E;IAC5E,yEAAyE;IACzE,2DAA2D;IAC3D,MAAM,GAAG,GAAG,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,EAAE,CAAC,IAAI,OAAO,CAAC;IACpD,IAAI,GAAG,KAAK,OAAO,EAAE,CAAC;QACpB,OAAO,8FAA8F,CAAC;IACxG,CAAC;IACD,MAAM,MAAM,GAAG,KAAK,CAAC,aAAa,CAAC,CAAC;IACpC,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;QAC5C,MAAM,MAAM,GAAG,oBAAoB,CAAC,MAAM,CAAC,CAAC;QAC5C,IAAI,MAAM,KAAK,IAAI;YAAE,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;IAC/D,CAAC;IACD,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,oBAAoB,EAAE,CAAC;AACxD,CAAC;AAED,MAAM,WAAW,GAAG,CAAC,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,CAAU,CAAC;AAEpF,MAAM,UAAU,oBAAoB,CAAC,KAAc;IACjD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAC7D,MAAM,MAAM,GAAI,KAAiC,CAAC,QAAQ,CAAC,CAAC;IAC5D,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;QAAE,OAAO,IAAI,CAAC;IAExC,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,MAAM,GAAG,GAAG,EAAE,CAAC;IACf,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;QACtC,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI;YAAE,SAAS;QACtD,MAAM,KAAK,GAAG,GAA8B,CAAC;QAC7C,wEAAwE;QACxE,2CAA2C;QAC3C,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,gBAAgB,EAAE,EAAE,CAAC,CAAC;QACpE,IAAI,IAAI,KAAK,EAAE,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,SAAS;QAC5C,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACf,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;QACtC,GAAG,CAAC,IAAI,CAAC;YACP,IAAI;YACJ,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,GAAG,CAAC,IAAI,IAAI;YACzC,IAAI,EAAG,WAAiC,CAAC,QAAQ,CAAC,IAAI,CAAC;gBACrD,CAAC,CAAE,IAAqC;gBACxC,CAAC,CAAC,MAAM;YACV,QAAQ,EAAE,KAAK,CAAC,UAAU,CAAC,KAAK,IAAI;YACpC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;gBACjC,CAAC,CAAC,EAAE,OAAO,EAAE,SAAS,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE;gBAClD,CAAC,CAAC,EAAE,CAAC;YACP,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACzE,SAAS,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC;SAC7E,CAAC,CAAC;IACL,CAAC;IACD,OAAO,GAAG,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;AACnD,CAAC;AAED,SAAS,KAAK,CAAC,KAAc;IAC3B,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,EAAE;QAAE,OAAO,IAAI,CAAC;IACvE,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;IACzE,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,MAAM,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACzD,OAAO,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;AACvC,CAAC;AAED,SAAS,IAAI,CAAC,KAAc;IAC1B,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE;QAAE,OAAO,IAAI,CAAC;IAClE,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACjC,OAAO,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AACzE,CAAC;AAED,SAAS,KAAK,CAAC,KAAc,EAAE,GAAW;IACxC,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAC9B,CAAC,CAAC,KAAK;QACP,CAAC,CAAC,OAAO,KAAK,KAAK,QAAQ;YACzB,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC;YACtB,CAAC,CAAC,EAAE,CAAC;IACT,OAAO,GAAG;SACP,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;SACvD,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,EAAE,CAAC;SAC7B,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;AACnB,CAAC;AAED,wEAAwE;AACxE,KAAK,UAAU,UAAU,CAAC,IAAa,EAAE,KAAa;IACpD,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;IAC5B,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,KAAK,CAC5B,uDAAuD,EACvD,CAAC,IAAI,EAAE,GAAG,IAAI,IAAI,CAAC,CACpB,CAAC;IACF,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,KAAK,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IAC9D,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,CAAC,EAAE,CAAC;QAChD,MAAM,SAAS,GAAG,GAAG,IAAI,IAAI,MAAM,EAAE,EAAE,CAAC;QACxC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC;YAAE,OAAO,SAAS,CAAC;IAC1E,CAAC;IACD,OAAO,GAAG,IAAI,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC;AAC9C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,IAAa,EAAE,KAAe;IAC5D,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;IACjD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,KAAK,CAC7B;;;;;;;oBAOgB,EAChB;QACE,IAAI;QACJ,KAAK,CAAC,KAAK;QACX,KAAK,CAAC,KAAK;QACX,KAAK,CAAC,WAAW;QACjB,KAAK,CAAC,cAAc;QACpB,KAAK,CAAC,SAAS;QACf,KAAK,CAAC,SAAS;QACf,KAAK,CAAC,QAAQ;QACd,KAAK,CAAC,aAAa;QACnB,KAAK,CAAC,SAAS;QACf,KAAK,CAAC,SAAS;QACf,KAAK,CAAC,cAAc;QACpB,KAAK,CAAC,YAAY;QAClB,KAAK,CAAC,YAAY;QAClB,KAAK,CAAC,IAAI;QACV,KAAK,CAAC,KAAK;QACX,KAAK,CAAC,YAAY;QAClB,KAAK,CAAC,gBAAgB;QACtB,KAAK,CAAC,WAAW;QACjB,KAAK,CAAC,KAAK,CAAC,GAAG;QACf,IAAI;QACJ,IAAI;QACJ,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC;QAClC,KAAK,CAAC,SAAS;QACf,KAAK,CAAC,SAAS;KAChB,CACF,CAAC;IACF,MAAM,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;IAC9B,IAAI,EAAE,KAAK,SAAS;QAAE,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;IAChE,MAAM,GAAG,GAAG,MAAM,UAAU,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IACvC,IAAI,GAAG,KAAK,IAAI;QAAE,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;IACzE,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,IAAa,EACb,EAAU,EACV,MAAiB;IAEjB,MAAM,IAAI,CAAC,KAAK,CACd;;;;;;oBAMgB,EAChB,CAAC,EAAE,EAAE,MAAM,CAAC,CACb,CAAC;IACF,OAAO,UAAU,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;AAC9B,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,IAAa,EACb,EAAU,EACV,MAOC;IAED,MAAM,IAAI,CAAC,KAAK,CACd;;;;;;;;oBAQgB,EAChB;QACE,EAAE;QACF,MAAM,CAAC,KAAK,IAAI,IAAI;QACpB,MAAM,CAAC,WAAW,IAAI,IAAI;QAC1B,MAAM,CAAC,cAAc,IAAI,IAAI;QAC7B,MAAM,CAAC,SAAS,IAAI,IAAI;QACxB,MAAM,CAAC,QAAQ,IAAI,IAAI;QACvB,MAAM,CAAC,SAAS,IAAI,IAAI;KACzB,CACF,CAAC;IACF,OAAO,UAAU,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;AAC9B,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,IAAa,EAAE,EAAU,EAAE,KAAe;IACtE,MAAM,IAAI,CAAC,KAAK,CACd;;;;;;;oBAOgB,EAChB;QACE,EAAE;QACF,KAAK,CAAC,KAAK;QACX,KAAK,CAAC,WAAW;QACjB,KAAK,CAAC,cAAc;QACpB,KAAK,CAAC,SAAS;QACf,KAAK,CAAC,SAAS;QACf,KAAK,CAAC,QAAQ;QACd,KAAK,CAAC,aAAa;QACnB,KAAK,CAAC,SAAS;QACf,KAAK,CAAC,SAAS;QACf,KAAK,CAAC,cAAc;QACpB,KAAK,CAAC,YAAY;QAClB,KAAK,CAAC,YAAY;QAClB,KAAK,CAAC,IAAI;QACV,KAAK,CAAC,KAAK;QACX,KAAK,CAAC,YAAY;QAClB,KAAK,CAAC,gBAAgB;QACtB,KAAK,CAAC,WAAW;QACjB,KAAK,CAAC,SAAS;KAChB,CACF,CAAC;IACF,OAAO,UAAU,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;AAC9B,CAAC;AAED,2DAA2D;AAC3D,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,IAAa,EAAE,GAAW;IAChE,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,KAAK,CAC7B,kFAAkF,EAClF,CAAC,GAAG,CAAC,CACN,CAAC;IACF,MAAM,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;IAC9B,OAAO,EAAE,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;AACxD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,IAAa;IAC3C,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,KAAK,CAC7B;;;;;;;eAOW,CACZ,CAAC;IACF,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;AAChF,CAAC"}
@@ -19,6 +19,8 @@ export interface Resume {
19
19
  markdown: string;
20
20
  parsed: OpenResume | null;
21
21
  visibility: Visibility;
22
+ /** The board-wide address, minted when a resume is first shared. */
23
+ publicSlug: string | null;
22
24
  sourceName: string | null;
23
25
  createdAt: string;
24
26
  updatedAt: string;
@@ -26,7 +28,27 @@ export interface Resume {
26
28
  export declare function listResumes(pool: pg.Pool, userId: string): Promise<Resume[]>;
27
29
  export declare function getResume(pool: pg.Pool, userId: string, slug: string): Promise<Resume | null>;
28
30
  export declare function getResumeById(pool: pg.Pool, id: string): Promise<Resume | null>;
29
- /** For a shared link: only resumes the owner has opened up. */
31
+ /**
32
+ * Give a shared resume a board-wide address, once.
33
+ *
34
+ * Named after the person, because the point of a candidate page is that it
35
+ * carries their name. Falls back to the resume's own title, and then to a
36
+ * random suffix, so a resume with no name in it is still addressable.
37
+ *
38
+ * The slug is minted on first share and then kept even if the resume is made
39
+ * private again and shared later: a URL that someone has already sent to an
40
+ * employer must not come back pointing at a different person.
41
+ */
42
+ export declare function ensurePublicSlug(pool: pg.Pool, resume: Resume): Promise<string | null>;
43
+ /** The directory: resumes their owner chose to list. */
44
+ export declare function listPublicResumes(pool: pg.Pool, limit?: number): Promise<Resume[]>;
45
+ /**
46
+ * One candidate page.
47
+ *
48
+ * Serves `link` as well as `public`, which is the difference between the two:
49
+ * a link resume is reachable by anyone holding the URL and is not listed.
50
+ */
51
+ export declare function getPublicResume(pool: pg.Pool, publicSlug: string): Promise<Resume | null>;
30
52
  export declare function getSharedResume(pool: pg.Pool, id: string): Promise<Resume | null>;
31
53
  export interface SaveResume {
32
54
  title?: string;