@profullstack/agenticjobs 0.12.0 → 0.14.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 (102) hide show
  1. package/README.md +70 -1
  2. package/dist/cli/args.js +1 -1
  3. package/dist/cli/args.js.map +1 -1
  4. package/dist/cli/index.js +78 -5
  5. package/dist/cli/index.js.map +1 -1
  6. package/dist/client/client.d.ts +44 -0
  7. package/dist/client/client.js +19 -0
  8. package/dist/client/client.js.map +1 -1
  9. package/dist/client/config.js +4 -3
  10. package/dist/client/config.js.map +1 -1
  11. package/dist/client/fanout.js +13 -4
  12. package/dist/client/fanout.js.map +1 -1
  13. package/dist/client/login.js +9 -2
  14. package/dist/client/login.js.map +1 -1
  15. package/dist/config.d.ts +1 -1
  16. package/dist/config.js +1 -1
  17. package/dist/core/agentwriter.js +22 -5
  18. package/dist/core/agentwriter.js.map +1 -1
  19. package/dist/core/applications.js +1 -1
  20. package/dist/core/applications.js.map +1 -1
  21. package/dist/core/capacity.js +7 -3
  22. package/dist/core/capacity.js.map +1 -1
  23. package/dist/core/import.js +10 -2
  24. package/dist/core/import.js.map +1 -1
  25. package/dist/core/jobs.d.ts +24 -6
  26. package/dist/core/jobs.js +116 -31
  27. package/dist/core/jobs.js.map +1 -1
  28. package/dist/core/recommendations.d.ts +134 -0
  29. package/dist/core/recommendations.js +356 -0
  30. package/dist/core/recommendations.js.map +1 -0
  31. package/dist/core/updates.d.ts +15 -3
  32. package/dist/core/updates.js +58 -24
  33. package/dist/core/updates.js.map +1 -1
  34. package/dist/core/zip.js +29 -4
  35. package/dist/core/zip.js.map +1 -1
  36. package/dist/directory/federate.js +3 -1
  37. package/dist/directory/federate.js.map +1 -1
  38. package/dist/directory/fetch.d.ts +1 -1
  39. package/dist/markup/markdown.js +2 -1
  40. package/dist/markup/markdown.js.map +1 -1
  41. package/dist/markup/resume.js +18 -5
  42. package/dist/markup/resume.js.map +1 -1
  43. package/dist/mcp/tools.js +99 -7
  44. package/dist/mcp/tools.js.map +1 -1
  45. package/dist/schema/index.d.ts +1 -0
  46. package/dist/schema/index.js +1 -0
  47. package/dist/schema/index.js.map +1 -1
  48. package/dist/schema/instance.js +29 -0
  49. package/dist/schema/instance.js.map +1 -1
  50. package/dist/schema/job.d.ts +12 -0
  51. package/dist/schema/job.js +17 -3
  52. package/dist/schema/job.js.map +1 -1
  53. package/dist/schema/jsonld.js +7 -6
  54. package/dist/schema/jsonld.js.map +1 -1
  55. package/dist/schema/pay.d.ts +173 -0
  56. package/dist/schema/pay.js +668 -0
  57. package/dist/schema/pay.js.map +1 -0
  58. package/dist/schema/query.js +1 -1
  59. package/dist/schema/query.js.map +1 -1
  60. package/dist/server/app.js +3 -1
  61. package/dist/server/app.js.map +1 -1
  62. package/dist/server/middleware.d.ts +11 -1
  63. package/dist/server/middleware.js +18 -3
  64. package/dist/server/middleware.js.map +1 -1
  65. package/dist/server/routes/api.js +153 -7
  66. package/dist/server/routes/api.js.map +1 -1
  67. package/dist/server/routes/discovery.js +10 -8
  68. package/dist/server/routes/discovery.js.map +1 -1
  69. package/dist/server/routes/openapi.js +136 -2
  70. package/dist/server/routes/openapi.js.map +1 -1
  71. package/dist/server/routes/pages.js +155 -14
  72. package/dist/server/routes/pages.js.map +1 -1
  73. package/dist/tui/views.js +9 -3
  74. package/dist/tui/views.js.map +1 -1
  75. package/dist/views/candidates.d.ts +6 -0
  76. package/dist/views/candidates.js +2 -1
  77. package/dist/views/candidates.js.map +1 -1
  78. package/dist/views/inbox.js +6 -6
  79. package/dist/views/inbox.js.map +1 -1
  80. package/dist/views/jobs.d.ts +16 -0
  81. package/dist/views/jobs.js +33 -11
  82. package/dist/views/jobs.js.map +1 -1
  83. package/dist/views/layout.d.ts +22 -0
  84. package/dist/views/layout.js +18 -0
  85. package/dist/views/layout.js.map +1 -1
  86. package/dist/views/me.d.ts +7 -0
  87. package/dist/views/me.js +3 -2
  88. package/dist/views/me.js.map +1 -1
  89. package/dist/views/post.d.ts +18 -0
  90. package/dist/views/post.js +39 -7
  91. package/dist/views/post.js.map +1 -1
  92. package/dist/views/recommendations.d.ts +43 -0
  93. package/dist/views/recommendations.js +26 -0
  94. package/dist/views/recommendations.js.map +1 -0
  95. package/dist/views/updates.js +5 -5
  96. package/dist/views/updates.js.map +1 -1
  97. package/docs/openjob.md +63 -0
  98. package/migrations/0015_pay_lines.sql +38 -0
  99. package/migrations/0016_recommendations.sql +65 -0
  100. package/package.json +1 -1
  101. package/web/public/app.css +60 -5
  102. package/web/public/sw.js +6 -2
@@ -0,0 +1,356 @@
1
+ /**
2
+ * Recommendations: what somebody who worked with you says about you, on
3
+ * your page once you have agreed to it.
4
+ *
5
+ * Not a rating. A star out of five from a stranger who paid you once is a
6
+ * number that says nothing and cannot be answered, and it is the thing that
7
+ * turns a profile into a scoreboard. A recommendation is a paragraph with a
8
+ * name on it, and it goes on your page only when you approve it. Reject it
9
+ * and nothing is shown, to anybody. That is the model LinkedIn settled on,
10
+ * and it is the right one for a board where every profile is a person's own
11
+ * document.
12
+ *
13
+ * Both directions, because the board is symmetric: an employer recommends a
14
+ * candidate it hired, and a candidate recommends an employer they worked
15
+ * for. Each side is a person or an employer, exactly as a message is, and
16
+ * for the same reason: a recommendation from "Acme" outlives the member who
17
+ * typed it, and one from a person has a page behind it that can be read.
18
+ *
19
+ * What keeps this honest:
20
+ *
21
+ * - The author has a page. A person recommends as themselves only with a
22
+ * published resume; an employer's member recommends as the employer. A
23
+ * recommendation from an account made this morning is not worth showing
24
+ * and is not accepted.
25
+ * - One per author per subject. Writing it again replaces the words and
26
+ * goes back to pending for the subject to read again.
27
+ * - Ten a day per person, whichever side they wrote for.
28
+ * - The subject decides, and can change their mind: an approved one can be
29
+ * taken down later, and a rejected one stays rejected until the author
30
+ * rewrites it.
31
+ */
32
+ import { clean } from "../schema/text.js";
33
+ import { candidateName } from "./updates.js";
34
+ import { escapeHtml } from "../markup/escape.js";
35
+ export const BODY_MIN = 20;
36
+ export const BODY_MAX = 2000;
37
+ export const RELATIONSHIP_MAX = 120;
38
+ /** Per person, per day. */
39
+ export const DAILY_LIMIT = 10;
40
+ /**
41
+ * Both sides resolved for display, the same way an update's author is: an
42
+ * employer by name and slug, a person by the resume they published. A
43
+ * person whose resume has since gone private keeps their name on what they
44
+ * wrote and loses the link, which is what "no page" should look like.
45
+ */
46
+ const SELECT = `
47
+ select r.id, r.body, r.relationship, r.status, r.created_at, r.decided_at,
48
+ r.author_user_id, r.author_org_id, r.user_id, r.org_id,
49
+ ao.slug as a_org_slug, ao.name as a_org_name,
50
+ so.slug as s_org_slug, so.name as s_org_name,
51
+ au.name as a_user_name, ar.parsed->>'name' as a_resume_name, ar.title as a_resume_title,
52
+ ar.public_slug as a_resume_slug,
53
+ su.name as s_user_name, sr.parsed->>'name' as s_resume_name, sr.title as s_resume_title,
54
+ sr.public_slug as s_resume_slug
55
+ from recommendations r
56
+ left join organisations ao on ao.id = r.author_org_id
57
+ left join organisations so on so.id = r.org_id
58
+ left join users au on au.id = r.author_user_id
59
+ left join users su on su.id = r.user_id
60
+ left join lateral (
61
+ select public_slug, parsed, title from resumes
62
+ where user_id = r.author_user_id and public_slug is not null and visibility = 'public'
63
+ order by updated_at desc limit 1
64
+ ) ar on true
65
+ left join lateral (
66
+ select public_slug, parsed, title from resumes
67
+ where user_id = r.user_id and public_slug is not null and visibility = 'public'
68
+ order by updated_at desc limit 1
69
+ ) sr on true`;
70
+ function partyOf(row, side) {
71
+ const orgId = side === 'a' ? row.author_org_id : row.org_id;
72
+ if (orgId !== null) {
73
+ return {
74
+ kind: 'employer',
75
+ name: row[`${side}_org_name`] ?? 'An employer',
76
+ slug: row[`${side}_org_slug`],
77
+ };
78
+ }
79
+ return {
80
+ kind: 'candidate',
81
+ name: candidateName(row[`${side}_resume_name`], row[`${side}_user_name`], row[`${side}_resume_title`]),
82
+ slug: row[`${side}_resume_slug`],
83
+ };
84
+ }
85
+ function toRecommendation(row) {
86
+ return {
87
+ id: row.id,
88
+ body: row.body,
89
+ relationship: row.relationship,
90
+ status: isStatus(row.status) ? row.status : 'pending',
91
+ author: partyOf(row, 'a'),
92
+ subject: partyOf(row, 's'),
93
+ createdAt: row.created_at,
94
+ decidedAt: row.decided_at,
95
+ };
96
+ }
97
+ export function isStatus(value) {
98
+ return value === 'pending' || value === 'approved' || value === 'rejected';
99
+ }
100
+ // --- reading ------------------------------------------------------------
101
+ /** What is on somebody's page: approved only, newest decision first. */
102
+ export async function listApproved(pool, subject) {
103
+ const column = subject.kind === 'employer' ? 'r.org_id' : 'r.user_id';
104
+ const id = subject.kind === 'employer' ? subject.orgId : subject.userId;
105
+ const result = await pool.query(`${SELECT} where ${column} = $1 and r.status = 'approved' order by r.decided_at desc nulls last, r.created_at desc`, [id]);
106
+ return result.rows.map(toRecommendation);
107
+ }
108
+ /** Subjects the viewer decides for: themselves, and every employer they belong to. */
109
+ const OWNS_SUBJECT = `(
110
+ r.user_id = $1
111
+ or exists (select 1 from memberships ms where ms.user_id = $1 and ms.org_id = r.org_id)
112
+ )`;
113
+ /** Authors the viewer speaks for: themselves, and every employer they belong to. */
114
+ const IS_AUTHOR = `(
115
+ r.author_user_id = $1
116
+ or exists (select 1 from memberships ms where ms.user_id = $1 and ms.org_id = r.author_org_id)
117
+ )`;
118
+ /**
119
+ * Everything written about the viewer or their employers, every status.
120
+ * Pending first, because that is what needs a decision.
121
+ */
122
+ export async function listReceived(pool, viewerId) {
123
+ const result = await pool.query(`${SELECT} where ${OWNS_SUBJECT}
124
+ order by case r.status when 'pending' then 0 when 'approved' then 1 else 2 end, r.created_at desc`, [viewerId]);
125
+ return result.rows.map(toRecommendation);
126
+ }
127
+ /** Everything the viewer wrote, as themselves or as an employer. */
128
+ export async function listGiven(pool, viewerId) {
129
+ const result = await pool.query(`${SELECT} where ${IS_AUTHOR} order by r.created_at desc`, [viewerId]);
130
+ return result.rows.map(toRecommendation);
131
+ }
132
+ export async function pendingCount(pool, viewerId) {
133
+ const result = await pool.query(`select count(*) as count from recommendations r where ${OWNS_SUBJECT} and r.status = 'pending'`, [viewerId]);
134
+ return Number(result.rows[0]?.count ?? 0);
135
+ }
136
+ function sameParty(a, b) {
137
+ if (a.kind === 'candidate' && b.kind === 'candidate')
138
+ return a.userId === b.userId;
139
+ if (a.kind === 'employer' && b.kind === 'employer')
140
+ return a.orgId === b.orgId;
141
+ return false;
142
+ }
143
+ /**
144
+ * Write one, or rewrite the one already written about this subject.
145
+ *
146
+ * Returns the recommendation, or a sentence saying why not. A rewrite goes
147
+ * back to pending: the subject approved the earlier words, not whatever
148
+ * comes next.
149
+ */
150
+ export async function writeRecommendation(pool, viewerId, input) {
151
+ const body = clean(input.body, BODY_MAX, { multiline: true });
152
+ if (body.length < BODY_MIN) {
153
+ return `Say more than that: a recommendation is at least ${BODY_MIN} characters, and it is shown with your name on it.`;
154
+ }
155
+ const relationship = clean(input.relationship, RELATIONSHIP_MAX) || null;
156
+ if (sameParty(input.as, input.subject))
157
+ return 'You cannot recommend yourself.';
158
+ const today = await pool.query(`select count(*) as count from recommendations
159
+ where written_by = $1 and created_at > now() - interval '1 day'`, [viewerId]);
160
+ if (Number(today.rows[0]?.count ?? 0) >= DAILY_LIMIT) {
161
+ return `That is ${DAILY_LIMIT} recommendations today, which is the limit.`;
162
+ }
163
+ const result = await pool.query(`insert into recommendations (author_user_id, author_org_id, written_by, user_id, org_id, body, relationship)
164
+ values ($1, $2, $3, $4, $5, $6, $7)
165
+ on conflict (author_user_id, user_id) where author_user_id is not null and user_id is not null
166
+ do update set body = excluded.body, relationship = excluded.relationship,
167
+ written_by = excluded.written_by, status = 'pending',
168
+ decided_at = null, updated_at = now()
169
+ returning id`, [
170
+ input.as.kind === 'candidate' ? input.as.userId : null,
171
+ input.as.kind === 'employer' ? input.as.orgId : null,
172
+ viewerId,
173
+ input.subject.kind === 'candidate' ? input.subject.userId : null,
174
+ input.subject.kind === 'employer' ? input.subject.orgId : null,
175
+ body,
176
+ relationship,
177
+ ]).catch(async (error) => {
178
+ // Postgres lets ON CONFLICT name only one arbiter index, and there are
179
+ // four partial ones. The person-to-person case is the common one and is
180
+ // named above; the other three are handled by finding the row and
181
+ // updating it, which is the same result one round trip later.
182
+ if (!(error instanceof Error) || !/duplicate key/.test(error.message))
183
+ throw error;
184
+ return pool.query(`update recommendations
185
+ set body = $6, relationship = $7, written_by = $3, status = 'pending',
186
+ decided_at = null, updated_at = now()
187
+ where author_user_id is not distinct from $1 and author_org_id is not distinct from $2
188
+ and user_id is not distinct from $4 and org_id is not distinct from $5
189
+ returning id`, [
190
+ input.as.kind === 'candidate' ? input.as.userId : null,
191
+ input.as.kind === 'employer' ? input.as.orgId : null,
192
+ viewerId,
193
+ input.subject.kind === 'candidate' ? input.subject.userId : null,
194
+ input.subject.kind === 'employer' ? input.subject.orgId : null,
195
+ body,
196
+ relationship,
197
+ ]);
198
+ });
199
+ const id = result.rows[0]?.id;
200
+ if (id === undefined)
201
+ throw new Error('recommendation insert returned no row');
202
+ const written = await getRecommendation(pool, id);
203
+ if (written === null)
204
+ throw new Error('recommendation could not be read back');
205
+ return written;
206
+ }
207
+ export async function getRecommendation(pool, id) {
208
+ if (!isUuid(id))
209
+ return null;
210
+ const result = await pool.query(`${SELECT} where r.id = $1`, [id]);
211
+ const row = result.rows[0];
212
+ return row === undefined ? null : toRecommendation(row);
213
+ }
214
+ /**
215
+ * The subject's decision. Approve, or reject; either can be changed later,
216
+ * because taking down a recommendation you approved last year is a thing
217
+ * people need to do. The ownership test is in the update's `where`, so a
218
+ * caller who does not own the subject changes nothing and learns nothing.
219
+ */
220
+ export async function decide(pool, viewerId, id, decision) {
221
+ if (!isUuid(id))
222
+ return null;
223
+ const result = await pool.query(`update recommendations r
224
+ set status = $3, decided_at = now(), updated_at = now()
225
+ where r.id = $2 and ${OWNS_SUBJECT}
226
+ returning r.id`, [viewerId, id, decision]);
227
+ if (result.rows.length === 0)
228
+ return null;
229
+ return getRecommendation(pool, id);
230
+ }
231
+ /** The author takes it back. Gone, not hidden: it was theirs to say. */
232
+ export async function withdraw(pool, viewerId, id) {
233
+ if (!isUuid(id))
234
+ return false;
235
+ const result = await pool.query(`delete from recommendations r where r.id = $2 and ${IS_AUTHOR}`, [viewerId, id]);
236
+ return (result.rowCount ?? 0) > 0;
237
+ }
238
+ /**
239
+ * Who is writing, and about whom, from a candidate slug or an employer
240
+ * slug plus an optional `as`. A person writes as themselves only with a
241
+ * published resume, so the recommendation has a page behind it; without
242
+ * one, and without an employer to write as, there is nobody to sign it.
243
+ */
244
+ export async function resolve(pool, viewerId, params) {
245
+ const candidate = (params.candidate ?? '').trim();
246
+ const org = (params.org ?? '').trim();
247
+ const asSlug = (params.as ?? '').trim();
248
+ const asOptions = (await pool.query(`select o.slug, o.name from organisations o
249
+ join memberships ms on ms.org_id = o.id
250
+ where ms.user_id = $1 order by o.name`, [viewerId])).rows;
251
+ const self = await pool.query(`select r.public_slug, u.name, r.parsed->>'name' as resume_name, r.title
252
+ from resumes r join users u on u.id = r.user_id
253
+ where r.user_id = $1 and r.public_slug is not null and r.visibility = 'public'
254
+ order by r.updated_at desc limit 1`, [viewerId]);
255
+ const selfPage = self.rows[0] ?? null;
256
+ let subject;
257
+ let subjectParty;
258
+ if (candidate !== '') {
259
+ const row = await pool.query(`select r.user_id, u.name, r.title, r.parsed->>'name' as resume_name
260
+ from resumes r join users u on u.id = r.user_id
261
+ where r.public_slug = $1 and r.visibility in ('link', 'public') limit 1`, [candidate]);
262
+ const found = row.rows[0];
263
+ if (found === undefined)
264
+ return `Nobody here is "${candidate}".`;
265
+ subject = { kind: 'candidate', userId: found.user_id };
266
+ subjectParty = { kind: 'candidate', name: candidateName(found.resume_name, found.name, found.title), slug: candidate };
267
+ }
268
+ else if (org !== '') {
269
+ const row = await pool.query(`select id, name from organisations where slug = $1`, [org]);
270
+ const found = row.rows[0];
271
+ if (found === undefined)
272
+ return `No employer here is "${org}".`;
273
+ subject = { kind: 'employer', orgId: found.id };
274
+ subjectParty = { kind: 'employer', name: found.name, slug: org };
275
+ }
276
+ else {
277
+ return 'Say who it is about: a candidate or an employer.';
278
+ }
279
+ let as;
280
+ let asParty;
281
+ if (asSlug !== '') {
282
+ const mine = asOptions.find((option) => option.slug === asSlug);
283
+ if (mine === undefined)
284
+ return `You do not post for "${asSlug}".`;
285
+ const orgRow = await pool.query(`select id from organisations where slug = $1`, [asSlug]);
286
+ as = { kind: 'employer', orgId: orgRow.rows[0]?.id ?? '' };
287
+ asParty = { kind: 'employer', name: mine.name, slug: mine.slug };
288
+ }
289
+ else {
290
+ if (selfPage === null) {
291
+ return asOptions.length > 0
292
+ ? 'Say which employer this is from, as "as": a recommendation is signed by a page, and you have not published a resume to sign it with.'
293
+ : 'Publish a resume first, so the recommendation has your page behind it.';
294
+ }
295
+ as = { kind: 'candidate', userId: viewerId };
296
+ asParty = {
297
+ kind: 'candidate',
298
+ name: candidateName(selfPage.resume_name, selfPage.name, selfPage.title),
299
+ slug: selfPage.public_slug,
300
+ };
301
+ }
302
+ if (sameParty(as, subject))
303
+ return 'You cannot recommend yourself.';
304
+ if (subject.kind === 'employer') {
305
+ const member = await pool.query(`select 1 from memberships where org_id = $1 and user_id = $2`, [subject.orgId, viewerId]);
306
+ if (member.rows.length > 0)
307
+ return 'That is your own employer.';
308
+ }
309
+ return { as, asParty, subject, subjectParty, asOptions, canWriteAsSelf: selfPage !== null };
310
+ }
311
+ // --- telling the subject ------------------------------------------------
312
+ /** Who decides on a recommendation about this subject. */
313
+ async function deciders(pool, subject) {
314
+ if (subject.kind === 'candidate') {
315
+ const row = await pool.query(`select email from users where id = $1`, [subject.userId]);
316
+ return row.rows;
317
+ }
318
+ const rows = await pool.query(`select u.email from memberships ms join users u on u.id = ms.user_id where ms.org_id = $1`, [subject.orgId]);
319
+ return rows.rows;
320
+ }
321
+ /**
322
+ * Tell the subject there is something to approve. The words travel in the
323
+ * mail, so the decision can be made from it, and the link goes to the place
324
+ * the buttons are.
325
+ */
326
+ export async function notifySubject(options) {
327
+ if (options.mailer === null)
328
+ return 0;
329
+ const { recommendation } = options;
330
+ const url = `${options.publicUrl}/me#recommendations`;
331
+ const subject = `${recommendation.author.name} recommended you on ${options.boardName}`;
332
+ const text = [
333
+ `${recommendation.author.name} wrote a recommendation for ${recommendation.subject.name}:`,
334
+ '',
335
+ recommendation.body,
336
+ '',
337
+ 'It is not on your page until you approve it. Approve or reject it here:',
338
+ url,
339
+ ].join('\n');
340
+ const html = [
341
+ `<p><strong>${escapeHtml(recommendation.author.name)}</strong> wrote a recommendation for ${escapeHtml(recommendation.subject.name)}:</p>`,
342
+ `<blockquote style="border-left:3px solid #ccc;margin:0;padding:0 0 0 12px;white-space:pre-wrap">${escapeHtml(recommendation.body)}</blockquote>`,
343
+ `<p>It is not on your page until you approve it. <a href="${escapeHtml(url)}">Approve or reject it</a>.</p>`,
344
+ ].join('');
345
+ let sent = 0;
346
+ for (const recipient of await deciders(options.pool, options.subject)) {
347
+ if (await options.mailer.send({ to: recipient.email, subject, html, text }))
348
+ sent += 1;
349
+ }
350
+ return sent;
351
+ }
352
+ const UUID = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
353
+ function isUuid(value) {
354
+ return UUID.test(value);
355
+ }
356
+ //# sourceMappingURL=recommendations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recommendations.js","sourceRoot":"","sources":["../../src/core/recommendations.ts"],"names":[],"mappings":"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"}
@@ -15,9 +15,9 @@
15
15
  * database, so it holds however the update arrived.
16
16
  * - 600 characters, one link. Long enough for news, short enough that nobody
17
17
  * tries to publish an article here.
18
- * - The body is text. Not Markdown, not HTML: the link is a column, so the
19
- * one thing worth linking is already structured and nothing has to be
20
- * sanitised out of prose.
18
+ * - The body is plain text or Markdown, like every other body on the board,
19
+ * and is stored as typed. The link is still its own column, so the one
20
+ * thing a reader needs is structured whether or not the prose repeats it.
21
21
  */
22
22
  import type pg from 'pg';
23
23
  /** The most an update can say. */
@@ -51,6 +51,18 @@ export type Target = {
51
51
  kind: 'candidate';
52
52
  userId: string;
53
53
  };
54
+ /**
55
+ * A candidate's display name, from the same place their directory card gets it.
56
+ *
57
+ * Nothing on this board ever asks a person for their name: sign-in is a
58
+ * magic link to an address, and `users.name` is null for almost everyone. So
59
+ * the name is read off the resume they published - its heading, then its
60
+ * title - and only then off the account. It never falls back to the email,
61
+ * because these names are printed on public pages. "A candidate" is what is
62
+ * left when a person has nothing published, which is the one case where the
63
+ * board genuinely has no name for them.
64
+ */
65
+ export declare function candidateName(resumeName: string | null | undefined, accountName: string | null | undefined, resumeTitle: string | null | undefined): string;
54
66
  /**
55
67
  * A link an update is allowed to carry.
56
68
  *
@@ -15,9 +15,9 @@
15
15
  * database, so it holds however the update arrived.
16
16
  * - 600 characters, one link. Long enough for news, short enough that nobody
17
17
  * tries to publish an article here.
18
- * - The body is text. Not Markdown, not HTML: the link is a column, so the
19
- * one thing worth linking is already structured and nothing has to be
20
- * sanitised out of prose.
18
+ * - The body is plain text or Markdown, like every other body on the board,
19
+ * and is stored as typed. The link is still its own column, so the one
20
+ * thing a reader needs is structured whether or not the prose repeats it.
21
21
  */
22
22
  import { clean } from "../schema/text.js";
23
23
  import { publishable } from "../schema/instance.js";
@@ -41,8 +41,36 @@ function authorOf(row) {
41
41
  if (row.org_id !== null) {
42
42
  return { kind: 'employer', slug: row.org_slug, name: row.org_name ?? 'An employer' };
43
43
  }
44
- const name = (row.user_name ?? '').trim();
45
- return { kind: 'candidate', slug: row.public_slug, name: name === '' ? 'A candidate' : name };
44
+ return {
45
+ kind: 'candidate',
46
+ slug: row.public_slug,
47
+ name: candidateName(row.resume_name, row.user_name, row.resume_title),
48
+ };
49
+ }
50
+ /**
51
+ * The longest a name can be before it is not one. The same limit the
52
+ * candidate directory applies, for the same reason: a resume whose Markdown
53
+ * lost its line breaks parses as one h1 holding the entire document.
54
+ */
55
+ const NAME_MAX = 80;
56
+ /**
57
+ * A candidate's display name, from the same place their directory card gets it.
58
+ *
59
+ * Nothing on this board ever asks a person for their name: sign-in is a
60
+ * magic link to an address, and `users.name` is null for almost everyone. So
61
+ * the name is read off the resume they published - its heading, then its
62
+ * title - and only then off the account. It never falls back to the email,
63
+ * because these names are printed on public pages. "A candidate" is what is
64
+ * left when a person has nothing published, which is the one case where the
65
+ * board genuinely has no name for them.
66
+ */
67
+ export function candidateName(resumeName, accountName, resumeTitle) {
68
+ for (const candidate of [resumeName, accountName, resumeTitle]) {
69
+ const trimmed = (candidate ?? '').trim();
70
+ if (trimmed !== '' && trimmed.length <= NAME_MAX)
71
+ return trimmed;
72
+ }
73
+ return 'A candidate';
46
74
  }
47
75
  function toUpdate(row) {
48
76
  return {
@@ -71,13 +99,15 @@ function selectFrom(source) {
71
99
  select u.id, u.body, u.link, u.created_at,
72
100
  u.org_id, o.slug as org_slug, o.name as org_name,
73
101
  u.user_id, p.name as user_name,
74
- (select r.public_slug from resumes r
75
- where r.user_id = u.user_id and r.public_slug is not null
76
- and r.visibility = 'public'
77
- order by r.updated_at desc limit 1) as public_slug
102
+ r.public_slug, r.parsed->>'name' as resume_name, r.title as resume_title
78
103
  from ${source} u
79
104
  left join organisations o on o.id = u.org_id
80
- left join users p on p.id = u.user_id`;
105
+ left join users p on p.id = u.user_id
106
+ left join lateral (
107
+ select public_slug, parsed, title from resumes
108
+ where user_id = u.user_id and public_slug is not null and visibility = 'public'
109
+ order by updated_at desc limit 1
110
+ ) r on true`;
81
111
  }
82
112
  const SELECT = selectFrom('updates');
83
113
  /**
@@ -121,10 +151,7 @@ export async function postUpdate(pool, authorId, target, input) {
121
151
  // The author has to be allowed to post as this target. An org post needs
122
152
  // membership; a candidate post can only ever be your own.
123
153
  if (target.kind === 'employer') {
124
- const member = await pool.query(`select 1 from memberships where user_id = $1 and org_id = $2`, [
125
- authorId,
126
- target.orgId,
127
- ]);
154
+ const member = await pool.query(`select 1 from memberships where user_id = $1 and org_id = $2`, [authorId, target.orgId]);
128
155
  if (member.rows.length === 0)
129
156
  return 'You do not post for that employer.';
130
157
  }
@@ -162,7 +189,9 @@ function cap(limit) {
162
189
  }
163
190
  /** Everything anybody posted, newest first. The board's news page. */
164
191
  export async function listUpdates(pool, limit = 50) {
165
- const result = await pool.query(`${SELECT} order by u.created_at desc limit $1`, [cap(limit)]);
192
+ const result = await pool.query(`${SELECT} order by u.created_at desc limit $1`, [
193
+ cap(limit),
194
+ ]);
166
195
  return result.rows.map(toUpdate);
167
196
  }
168
197
  export async function listUpdatesFor(pool, target, limit = 20) {
@@ -241,23 +270,28 @@ export async function followerCount(pool, target) {
241
270
  }
242
271
  /** Who one person follows, for their own dashboard. */
243
272
  export async function listFollowing(pool, followerId) {
244
- const result = await pool.query(`select 'employer'::text as kind, o.slug, o.name, f.created_at as since
273
+ const result = await pool.query(`select 'employer'::text as kind, o.slug, o.name,
274
+ null::text as resume_name, null::text as resume_title, f.created_at as since
245
275
  from follows f join organisations o on o.id = f.org_id
246
276
  where f.follower_id = $1
247
277
  union all
248
- select 'candidate'::text as kind,
249
- (select r.public_slug from resumes r
250
- where r.user_id = f.user_id and r.public_slug is not null
251
- and r.visibility = 'public'
252
- order by r.updated_at desc limit 1) as slug,
253
- p.name, f.created_at as since
254
- from follows f join users p on p.id = f.user_id
278
+ select 'candidate'::text as kind, r.public_slug as slug, p.name,
279
+ r.parsed->>'name' as resume_name, r.title as resume_title, f.created_at as since
280
+ from follows f
281
+ join users p on p.id = f.user_id
282
+ left join lateral (
283
+ select public_slug, parsed, title from resumes
284
+ where user_id = f.user_id and public_slug is not null and visibility = 'public'
285
+ order by updated_at desc limit 1
286
+ ) r on true
255
287
  where f.follower_id = $1
256
288
  order by since desc`, [followerId]);
257
289
  return result.rows.map((row) => ({
258
290
  kind: row.kind,
259
291
  slug: row.slug,
260
- name: (row.name ?? '').trim() === '' ? 'Someone' : row.name.trim(),
292
+ name: row.kind === 'employer'
293
+ ? (row.name ?? '').trim() || 'An employer'
294
+ : candidateName(row.resume_name, row.name, row.resume_title),
261
295
  since: row.since,
262
296
  }));
263
297
  }
@@ -1 +1 @@
1
- {"version":3,"file":"updates.js","sourceRoot":"","sources":["../../src/core/updates.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"updates.js","sourceRoot":"","sources":["../../src/core/updates.ts"],"names":[],"mappings":"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"}