@venturekit-pro/social 0.0.0-dev.20260701100017 → 0.0.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.
- package/README.md +4 -0
- package/dist/adapters/instagram.d.ts.map +1 -1
- package/dist/adapters/instagram.js +28 -0
- package/dist/adapters/instagram.js.map +1 -1
- package/dist/adapters/linkedin.d.ts.map +1 -1
- package/dist/adapters/linkedin.js +35 -0
- package/dist/adapters/linkedin.js.map +1 -1
- package/dist/adapters/x.d.ts.map +1 -1
- package/dist/adapters/x.js +29 -0
- package/dist/adapters/x.js.map +1 -1
- package/dist/catalog/crud.d.ts +50 -0
- package/dist/catalog/crud.d.ts.map +1 -0
- package/dist/catalog/crud.js +152 -0
- package/dist/catalog/crud.js.map +1 -0
- package/dist/catalog/index.d.ts +11 -0
- package/dist/catalog/index.d.ts.map +1 -0
- package/dist/catalog/index.js +10 -0
- package/dist/catalog/index.js.map +1 -0
- package/dist/catalog/types.d.ts +55 -0
- package/dist/catalog/types.d.ts.map +1 -0
- package/dist/catalog/types.js +11 -0
- package/dist/catalog/types.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/migrations/vk_social_0001_init.sql +5 -5
- package/package.json +4 -4
- package/src/migrations/vk_social_0001_init.sql +5 -5
package/README.md
CHANGED
|
@@ -23,6 +23,10 @@ calling-app concept. Apps compose those on top.
|
|
|
23
23
|
retry policies that match the failure mode.
|
|
24
24
|
- **Pre-publish validation** — `validatePost()` enforces per-platform
|
|
25
25
|
body / hashtag / media constraints and surfaces both errors and warnings.
|
|
26
|
+
- **First-comment threads** — set `SocialPost.firstComment` and any adapter
|
|
27
|
+
whose `constraints.supportsFirstComment` is `true` (LinkedIn, X, Instagram)
|
|
28
|
+
posts it as a companion comment / reply after the main post. Best-effort:
|
|
29
|
+
a failed comment never unwinds the already-live post.
|
|
26
30
|
|
|
27
31
|
## Wire-up
|
|
28
32
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"instagram.d.ts","sourceRoot":"","sources":["../../src/adapters/instagram.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,KAAK,EAIV,yBAAyB,EAE1B,MAAM,aAAa,CAAC;AAOrB,eAAO,MAAM,qBAAqB,EAAE,yBAiBnC,CAAC;AAEF,MAAM,WAAW,sBAAsB;IACrC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,OAAO,CAAC,yBAAyB,CAAC,CAAC;CAClD;AAED,wBAAgB,sBAAsB,CACpC,MAAM,GAAE,sBAA2B,GAClC,aAAa,
|
|
1
|
+
{"version":3,"file":"instagram.d.ts","sourceRoot":"","sources":["../../src/adapters/instagram.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,KAAK,EAIV,yBAAyB,EAE1B,MAAM,aAAa,CAAC;AAOrB,eAAO,MAAM,qBAAqB,EAAE,yBAiBnC,CAAC;AAEF,MAAM,WAAW,sBAAsB;IACrC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,OAAO,CAAC,yBAAyB,CAAC,CAAC;CAClD;AAED,wBAAgB,sBAAsB,CACpC,MAAM,GAAE,sBAA2B,GAClC,aAAa,CAkGf"}
|
|
@@ -94,6 +94,12 @@ export function createInstagramAdapter(config = {}) {
|
|
|
94
94
|
throw new Error('[social/instagram] media_publish returned no id; vendor body: ' +
|
|
95
95
|
publishRes.bodyText.slice(0, 200));
|
|
96
96
|
}
|
|
97
|
+
// First-comment (commonly used to park the hashtag block off the
|
|
98
|
+
// caption). Best-effort: the media is already live, so a failed
|
|
99
|
+
// comment must not unwind the publish.
|
|
100
|
+
if (post.firstComment && constraints.supportsFirstComment) {
|
|
101
|
+
await postFirstComment(baseUrl, version, credentials, externalRef, post.firstComment);
|
|
102
|
+
}
|
|
97
103
|
return {
|
|
98
104
|
externalRef,
|
|
99
105
|
// IG doesn't expose a deterministic media-permalink at
|
|
@@ -110,4 +116,26 @@ export function createInstagramAdapter(config = {}) {
|
|
|
110
116
|
function stripIgPrefix(authorRef) {
|
|
111
117
|
return authorRef.startsWith('ig_user_') ? authorRef.slice(8) : authorRef;
|
|
112
118
|
}
|
|
119
|
+
/**
|
|
120
|
+
* Post a first-comment on a just-published IG media item via the
|
|
121
|
+
* `/{ig-media-id}/comments` endpoint.
|
|
122
|
+
*
|
|
123
|
+
* Best-effort by contract: the media is already live, so a failed
|
|
124
|
+
* comment must never unwind the publish. Vendor errors are swallowed.
|
|
125
|
+
*/
|
|
126
|
+
async function postFirstComment(baseUrl, version, credentials, mediaId, text) {
|
|
127
|
+
try {
|
|
128
|
+
await vendorFetch('instagram', `${baseUrl}/${version}/${encodeURIComponent(mediaId)}/comments`, {
|
|
129
|
+
method: 'POST',
|
|
130
|
+
headers: {
|
|
131
|
+
Authorization: `Bearer ${credentials.accessToken}`,
|
|
132
|
+
'Content-Type': 'application/x-www-form-urlencoded',
|
|
133
|
+
},
|
|
134
|
+
body: new URLSearchParams({ message: text }),
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
catch {
|
|
138
|
+
// Swallowed — see doc comment.
|
|
139
|
+
}
|
|
140
|
+
}
|
|
113
141
|
//# sourceMappingURL=instagram.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"instagram.js","sourceRoot":"","sources":["../../src/adapters/instagram.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"instagram.js","sourceRoot":"","sources":["../../src/adapters/instagram.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"linkedin.d.ts","sourceRoot":"","sources":["../../src/adapters/linkedin.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,KAAK,EAIV,yBAAyB,EAE1B,MAAM,aAAa,CAAC;AAMrB,eAAO,MAAM,oBAAoB,EAAE,yBAUlC,CAAC;AAEF,MAAM,WAAW,qBAAqB;IACpC,kEAAkE;IAClE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,sEAAsE;IACtE,WAAW,CAAC,EAAE,OAAO,CAAC,yBAAyB,CAAC,CAAC;CAClD;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,GAAE,qBAA0B,GACjC,aAAa,
|
|
1
|
+
{"version":3,"file":"linkedin.d.ts","sourceRoot":"","sources":["../../src/adapters/linkedin.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,KAAK,EAIV,yBAAyB,EAE1B,MAAM,aAAa,CAAC;AAMrB,eAAO,MAAM,oBAAoB,EAAE,yBAUlC,CAAC;AAEF,MAAM,WAAW,qBAAqB;IACpC,kEAAkE;IAClE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,sEAAsE;IACtE,WAAW,CAAC,EAAE,OAAO,CAAC,yBAAyB,CAAC,CAAC;CAClD;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,GAAE,qBAA0B,GACjC,aAAa,CA+Df"}
|
|
@@ -67,6 +67,11 @@ export function createLinkedInAdapter(config = {}) {
|
|
|
67
67
|
// one, the post probably WASN'T accepted — fail loud.
|
|
68
68
|
throw new Error('[social/linkedin] Publish returned no id; vendor body: ' + res.bodyText.slice(0, 200));
|
|
69
69
|
}
|
|
70
|
+
// First-comment companion thread. Best-effort: the post is
|
|
71
|
+
// already live, so a failed comment must NOT unwind the publish.
|
|
72
|
+
if (post.firstComment && constraints.supportsFirstComment) {
|
|
73
|
+
await postFirstComment(baseUrl, credentials, externalRef, post.firstComment);
|
|
74
|
+
}
|
|
70
75
|
return {
|
|
71
76
|
externalRef,
|
|
72
77
|
// The public URL form is `https://www.linkedin.com/feed/update/<urn>`.
|
|
@@ -79,6 +84,36 @@ export function createLinkedInAdapter(config = {}) {
|
|
|
79
84
|
},
|
|
80
85
|
};
|
|
81
86
|
}
|
|
87
|
+
// ─── Internal: first-comment ──────────────────────────────────────────
|
|
88
|
+
/**
|
|
89
|
+
* Post a first-comment under a freshly-published UGC post via the
|
|
90
|
+
* `socialActions/{urn}/comments` endpoint. The comment is authored by
|
|
91
|
+
* the same actor as the post (`credentials.authorRef`).
|
|
92
|
+
*
|
|
93
|
+
* Best-effort by contract: the post is already live, so a failed
|
|
94
|
+
* comment must never unwind a successful publish. We swallow vendor
|
|
95
|
+
* errors here and let the caller's publish result stand.
|
|
96
|
+
*/
|
|
97
|
+
async function postFirstComment(baseUrl, credentials, postUrn, text) {
|
|
98
|
+
try {
|
|
99
|
+
await vendorFetch('linkedin', `${baseUrl}/v2/socialActions/${encodeURIComponent(postUrn)}/comments`, {
|
|
100
|
+
method: 'POST',
|
|
101
|
+
headers: {
|
|
102
|
+
Authorization: `Bearer ${credentials.accessToken}`,
|
|
103
|
+
'Content-Type': 'application/json',
|
|
104
|
+
'X-Restli-Protocol-Version': '2.0.0',
|
|
105
|
+
},
|
|
106
|
+
body: JSON.stringify({
|
|
107
|
+
actor: credentials.authorRef,
|
|
108
|
+
object: postUrn,
|
|
109
|
+
message: { text },
|
|
110
|
+
}),
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
catch {
|
|
114
|
+
// Swallowed — see doc comment.
|
|
115
|
+
}
|
|
116
|
+
}
|
|
82
117
|
function buildUgcPost(post, credentials) {
|
|
83
118
|
const media = post.media ?? [];
|
|
84
119
|
const hasMedia = media.length > 0;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"linkedin.js","sourceRoot":"","sources":["../../src/adapters/linkedin.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"linkedin.js","sourceRoot":"","sources":["../../src/adapters/linkedin.ts"],"names":[],"mappings":"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"}
|
package/dist/adapters/x.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"x.d.ts","sourceRoot":"","sources":["../../src/adapters/x.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,KAAK,EAIV,yBAAyB,EAE1B,MAAM,aAAa,CAAC;AAMrB,eAAO,MAAM,aAAa,EAAE,yBAU3B,CAAC;AAEF,MAAM,WAAW,cAAc;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,OAAO,CAAC,yBAAyB,CAAC,CAAC;CAClD;AAED,wBAAgB,cAAc,CAAC,MAAM,GAAE,cAAmB,GAAG,aAAa,
|
|
1
|
+
{"version":3,"file":"x.d.ts","sourceRoot":"","sources":["../../src/adapters/x.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,KAAK,EAIV,yBAAyB,EAE1B,MAAM,aAAa,CAAC;AAMrB,eAAO,MAAM,aAAa,EAAE,yBAU3B,CAAC;AAEF,MAAM,WAAW,cAAc;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,OAAO,CAAC,yBAAyB,CAAC,CAAC;CAClD;AAED,wBAAgB,cAAc,CAAC,MAAM,GAAE,cAAmB,GAAG,aAAa,CAwDzE"}
|
package/dist/adapters/x.js
CHANGED
|
@@ -52,6 +52,12 @@ export function createXAdapter(config = {}) {
|
|
|
52
52
|
if (!externalRef) {
|
|
53
53
|
throw new Error('[social/x] Publish returned no tweet id; vendor body: ' + res.bodyText.slice(0, 200));
|
|
54
54
|
}
|
|
55
|
+
// First-comment = a reply tweet threaded under the published one.
|
|
56
|
+
// Best-effort: the parent is already live, so a failed reply must
|
|
57
|
+
// not unwind the publish.
|
|
58
|
+
if (post.firstComment && constraints.supportsFirstComment) {
|
|
59
|
+
await postReply(baseUrl, credentials, externalRef, post.firstComment);
|
|
60
|
+
}
|
|
55
61
|
// X's public URL form requires the username, which we don't
|
|
56
62
|
// necessarily have at publish time. Use the canonical `i/web`
|
|
57
63
|
// form which works for any tweet and lets the browser redirect.
|
|
@@ -66,6 +72,29 @@ export function createXAdapter(config = {}) {
|
|
|
66
72
|
},
|
|
67
73
|
};
|
|
68
74
|
}
|
|
75
|
+
/**
|
|
76
|
+
* Post a reply tweet threaded under a just-published tweet (the X
|
|
77
|
+
* equivalent of a "first comment").
|
|
78
|
+
*
|
|
79
|
+
* Best-effort by contract: the parent tweet is already live, so a
|
|
80
|
+
* failed reply must never unwind the publish. Vendor errors are
|
|
81
|
+
* swallowed here.
|
|
82
|
+
*/
|
|
83
|
+
async function postReply(baseUrl, credentials, inReplyToTweetId, text) {
|
|
84
|
+
try {
|
|
85
|
+
await vendorFetch('x', `${baseUrl}/2/tweets`, {
|
|
86
|
+
method: 'POST',
|
|
87
|
+
headers: {
|
|
88
|
+
Authorization: `Bearer ${credentials.accessToken}`,
|
|
89
|
+
'Content-Type': 'application/json',
|
|
90
|
+
},
|
|
91
|
+
body: JSON.stringify({ text, reply: { in_reply_to_tweet_id: inReplyToTweetId } }),
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
catch {
|
|
95
|
+
// Swallowed — see doc comment.
|
|
96
|
+
}
|
|
97
|
+
}
|
|
69
98
|
function buildTweetBody(post) {
|
|
70
99
|
const body = { text: post.body };
|
|
71
100
|
const media = post.media ?? [];
|
package/dist/adapters/x.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"x.js","sourceRoot":"","sources":["../../src/adapters/x.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"x.js","sourceRoot":"","sources":["../../src/adapters/x.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CRUD over `vk_social_platforms` — the platform-admin-owned catalog.
|
|
3
|
+
*
|
|
4
|
+
* Pure SQL against a caller-supplied `Querier`; no `@venturekit/data`
|
|
5
|
+
* import so the package stays decoupled from the data layer (it's an
|
|
6
|
+
* optional peer). Consumers pass their `query` / transaction querier in.
|
|
7
|
+
*
|
|
8
|
+
* Lifecycle-timestamp convention (matches the LLM model catalog):
|
|
9
|
+
* flipping `status` into `deprecated` / `disabled` auto-stamps the
|
|
10
|
+
* matching timestamp; flipping back to `available` clears both.
|
|
11
|
+
*/
|
|
12
|
+
import type { CreateSocialPlatformInput, PatchSocialPlatformInput, Querier, SocialPlatformRow } from './types.js';
|
|
13
|
+
/**
|
|
14
|
+
* List every catalog row. Ordered by status (available → deprecated →
|
|
15
|
+
* disabled) so admin pickers show the useful rows up top, then
|
|
16
|
+
* alphabetically within each group.
|
|
17
|
+
*/
|
|
18
|
+
export declare function listSocialPlatforms(querier: Querier): Promise<SocialPlatformRow[]>;
|
|
19
|
+
/** Fetch one catalog row by its `key` PK, or `null` when absent. */
|
|
20
|
+
export declare function getSocialPlatformByKey(querier: Querier, key: string): Promise<SocialPlatformRow | null>;
|
|
21
|
+
/**
|
|
22
|
+
* Insert a new catalog row. The `key` PK is DB-enforced; callers map
|
|
23
|
+
* `23505` to a 409 via `isUniqueViolation`.
|
|
24
|
+
*
|
|
25
|
+
* When the row is created already in a `deprecated` / `disabled` state
|
|
26
|
+
* the matching lifecycle timestamp is auto-stamped to `NOW()` so the
|
|
27
|
+
* happy path stays one-shot.
|
|
28
|
+
*/
|
|
29
|
+
export declare function createSocialPlatform(querier: Querier, input: CreateSocialPlatformInput): Promise<SocialPlatformRow>;
|
|
30
|
+
/**
|
|
31
|
+
* Patch any subset of mutable fields. `key` is immutable (it's the PK
|
|
32
|
+
* and is referenced by `vk_tenant_social_platforms` ON DELETE RESTRICT;
|
|
33
|
+
* renaming would break those FKs). A status flip stamps / clears the
|
|
34
|
+
* matching lifecycle timestamp. A no-op patch returns the current row.
|
|
35
|
+
*/
|
|
36
|
+
export declare function patchSocialPlatform(querier: Querier, key: string, patch: PatchSocialPlatformInput): Promise<SocialPlatformRow | null>;
|
|
37
|
+
/**
|
|
38
|
+
* Delete a catalog row. RESTRICTed by the `vk_tenant_social_platforms`
|
|
39
|
+
* FK — a row in use by any tenant raises `23503`; callers translate
|
|
40
|
+
* that to a friendly 409. Returns `true` when a row was removed.
|
|
41
|
+
*/
|
|
42
|
+
export declare function deleteSocialPlatform(querier: Querier, key: string): Promise<boolean>;
|
|
43
|
+
/** True when `err` is a Postgres `unique_violation` (23505). */
|
|
44
|
+
export declare function isUniqueViolation(err: unknown): boolean;
|
|
45
|
+
/**
|
|
46
|
+
* True when `err` is a Postgres `foreign_key_violation` (23503) — used
|
|
47
|
+
* to map a delete blocked by `vk_tenant_social_platforms` into a 409.
|
|
48
|
+
*/
|
|
49
|
+
export declare function isForeignKeyViolation(err: unknown): boolean;
|
|
50
|
+
//# sourceMappingURL=crud.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"crud.d.ts","sourceRoot":"","sources":["../../src/catalog/crud.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EACV,yBAAyB,EACzB,wBAAwB,EACxB,OAAO,EACP,iBAAiB,EAClB,MAAM,YAAY,CAAC;AAmBpB;;;;GAIG;AACH,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,OAAO,GACf,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAW9B;AAED,oEAAoE;AACpE,wBAAsB,sBAAsB,CAC1C,OAAO,EAAE,OAAO,EAChB,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC,CAMnC;AAED;;;;;;;GAOG;AACH,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,yBAAyB,GAC/B,OAAO,CAAC,iBAAiB,CAAC,CAwB5B;AAED;;;;;GAKG;AACH,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,OAAO,EAChB,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,wBAAwB,GAC9B,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC,CAyCnC;AAED;;;;GAIG;AACH,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,OAAO,EAChB,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,OAAO,CAAC,CAMlB;AAID,gEAAgE;AAChE,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAKvD;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAK3D"}
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CRUD over `vk_social_platforms` — the platform-admin-owned catalog.
|
|
3
|
+
*
|
|
4
|
+
* Pure SQL against a caller-supplied `Querier`; no `@venturekit/data`
|
|
5
|
+
* import so the package stays decoupled from the data layer (it's an
|
|
6
|
+
* optional peer). Consumers pass their `query` / transaction querier in.
|
|
7
|
+
*
|
|
8
|
+
* Lifecycle-timestamp convention (matches the LLM model catalog):
|
|
9
|
+
* flipping `status` into `deprecated` / `disabled` auto-stamps the
|
|
10
|
+
* matching timestamp; flipping back to `available` clears both.
|
|
11
|
+
*/
|
|
12
|
+
// Shared projection so reads + read-backs return an identical shape
|
|
13
|
+
// regardless of the consumer's mapper config (explicit aliases don't
|
|
14
|
+
// depend on the snake→camel auto-mapper being enabled).
|
|
15
|
+
const PLATFORM_SELECT = `
|
|
16
|
+
SELECT
|
|
17
|
+
key,
|
|
18
|
+
display_name AS "displayName",
|
|
19
|
+
status,
|
|
20
|
+
description,
|
|
21
|
+
meta,
|
|
22
|
+
introduced_at AS "introducedAt",
|
|
23
|
+
deprecated_at AS "deprecatedAt",
|
|
24
|
+
disabled_at AS "disabledAt",
|
|
25
|
+
created_at AS "createdAt",
|
|
26
|
+
updated_at AS "updatedAt"
|
|
27
|
+
FROM vk_social_platforms`;
|
|
28
|
+
/**
|
|
29
|
+
* List every catalog row. Ordered by status (available → deprecated →
|
|
30
|
+
* disabled) so admin pickers show the useful rows up top, then
|
|
31
|
+
* alphabetically within each group.
|
|
32
|
+
*/
|
|
33
|
+
export async function listSocialPlatforms(querier) {
|
|
34
|
+
return querier(`${PLATFORM_SELECT}
|
|
35
|
+
ORDER BY
|
|
36
|
+
CASE status
|
|
37
|
+
WHEN 'available' THEN 0
|
|
38
|
+
WHEN 'deprecated' THEN 1
|
|
39
|
+
WHEN 'disabled' THEN 2
|
|
40
|
+
END,
|
|
41
|
+
display_name ASC`);
|
|
42
|
+
}
|
|
43
|
+
/** Fetch one catalog row by its `key` PK, or `null` when absent. */
|
|
44
|
+
export async function getSocialPlatformByKey(querier, key) {
|
|
45
|
+
const rows = await querier(`${PLATFORM_SELECT} WHERE key = $1 LIMIT 1`, [key]);
|
|
46
|
+
return rows[0] ?? null;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Insert a new catalog row. The `key` PK is DB-enforced; callers map
|
|
50
|
+
* `23505` to a 409 via `isUniqueViolation`.
|
|
51
|
+
*
|
|
52
|
+
* When the row is created already in a `deprecated` / `disabled` state
|
|
53
|
+
* the matching lifecycle timestamp is auto-stamped to `NOW()` so the
|
|
54
|
+
* happy path stays one-shot.
|
|
55
|
+
*/
|
|
56
|
+
export async function createSocialPlatform(querier, input) {
|
|
57
|
+
const status = input.status ?? 'available';
|
|
58
|
+
const deprecatedAt = status === 'deprecated' ? 'NOW()' : 'NULL';
|
|
59
|
+
const disabledAt = status === 'disabled' ? 'NOW()' : 'NULL';
|
|
60
|
+
await querier(`INSERT INTO vk_social_platforms
|
|
61
|
+
(key, display_name, description, status, meta, deprecated_at, disabled_at)
|
|
62
|
+
VALUES
|
|
63
|
+
($1, $2, $3, $4::vk_social_platform_status, $5::jsonb, ${deprecatedAt}, ${disabledAt})`, [
|
|
64
|
+
input.key,
|
|
65
|
+
input.displayName,
|
|
66
|
+
input.description ?? null,
|
|
67
|
+
status,
|
|
68
|
+
JSON.stringify(input.meta ?? {}),
|
|
69
|
+
]);
|
|
70
|
+
const row = await getSocialPlatformByKey(querier, input.key);
|
|
71
|
+
if (!row) {
|
|
72
|
+
throw new Error(`Insert into vk_social_platforms succeeded but read-back returned null for key=${input.key}`);
|
|
73
|
+
}
|
|
74
|
+
return row;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Patch any subset of mutable fields. `key` is immutable (it's the PK
|
|
78
|
+
* and is referenced by `vk_tenant_social_platforms` ON DELETE RESTRICT;
|
|
79
|
+
* renaming would break those FKs). A status flip stamps / clears the
|
|
80
|
+
* matching lifecycle timestamp. A no-op patch returns the current row.
|
|
81
|
+
*/
|
|
82
|
+
export async function patchSocialPlatform(querier, key, patch) {
|
|
83
|
+
const sets = [];
|
|
84
|
+
const params = [];
|
|
85
|
+
let idx = 1;
|
|
86
|
+
if (patch.displayName !== undefined) {
|
|
87
|
+
sets.push(`display_name = $${idx++}`);
|
|
88
|
+
params.push(patch.displayName);
|
|
89
|
+
}
|
|
90
|
+
if (patch.description !== undefined) {
|
|
91
|
+
sets.push(`description = $${idx++}`);
|
|
92
|
+
params.push(patch.description);
|
|
93
|
+
}
|
|
94
|
+
if (patch.meta !== undefined) {
|
|
95
|
+
sets.push(`meta = $${idx++}::jsonb`);
|
|
96
|
+
params.push(JSON.stringify(patch.meta));
|
|
97
|
+
}
|
|
98
|
+
if (patch.status !== undefined) {
|
|
99
|
+
sets.push(`status = $${idx++}::vk_social_platform_status`);
|
|
100
|
+
params.push(patch.status);
|
|
101
|
+
if (patch.status === 'deprecated') {
|
|
102
|
+
sets.push(`deprecated_at = COALESCE(deprecated_at, NOW())`);
|
|
103
|
+
sets.push(`disabled_at = NULL`);
|
|
104
|
+
}
|
|
105
|
+
else if (patch.status === 'disabled') {
|
|
106
|
+
sets.push(`disabled_at = COALESCE(disabled_at, NOW())`);
|
|
107
|
+
}
|
|
108
|
+
else if (patch.status === 'available') {
|
|
109
|
+
sets.push(`deprecated_at = NULL`);
|
|
110
|
+
sets.push(`disabled_at = NULL`);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
if (sets.length === 0) {
|
|
114
|
+
return getSocialPlatformByKey(querier, key);
|
|
115
|
+
}
|
|
116
|
+
sets.push(`updated_at = NOW()`);
|
|
117
|
+
params.push(key);
|
|
118
|
+
await querier(`UPDATE vk_social_platforms
|
|
119
|
+
SET ${sets.join(', ')}
|
|
120
|
+
WHERE key = $${idx}`, params);
|
|
121
|
+
return getSocialPlatformByKey(querier, key);
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Delete a catalog row. RESTRICTed by the `vk_tenant_social_platforms`
|
|
125
|
+
* FK — a row in use by any tenant raises `23503`; callers translate
|
|
126
|
+
* that to a friendly 409. Returns `true` when a row was removed.
|
|
127
|
+
*/
|
|
128
|
+
export async function deleteSocialPlatform(querier, key) {
|
|
129
|
+
const result = await querier(`DELETE FROM vk_social_platforms WHERE key = $1 RETURNING key`, [key]);
|
|
130
|
+
return result.length > 0;
|
|
131
|
+
}
|
|
132
|
+
// ─── PG error helpers ───────────────────────────────────────────────
|
|
133
|
+
/** True when `err` is a Postgres `unique_violation` (23505). */
|
|
134
|
+
export function isUniqueViolation(err) {
|
|
135
|
+
if (err && typeof err === 'object' && 'code' in err) {
|
|
136
|
+
if (err.code === '23505')
|
|
137
|
+
return true;
|
|
138
|
+
}
|
|
139
|
+
return false;
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* True when `err` is a Postgres `foreign_key_violation` (23503) — used
|
|
143
|
+
* to map a delete blocked by `vk_tenant_social_platforms` into a 409.
|
|
144
|
+
*/
|
|
145
|
+
export function isForeignKeyViolation(err) {
|
|
146
|
+
if (err && typeof err === 'object' && 'code' in err) {
|
|
147
|
+
if (err.code === '23503')
|
|
148
|
+
return true;
|
|
149
|
+
}
|
|
150
|
+
return false;
|
|
151
|
+
}
|
|
152
|
+
//# sourceMappingURL=crud.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"crud.js","sourceRoot":"","sources":["../../src/catalog/crud.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `vk_social_platforms` catalog — CRUD + types.
|
|
3
|
+
*
|
|
4
|
+
* The platform-admin-owned list of supported social networks. Consuming
|
|
5
|
+
* apps expose this read-write to their platform admins and read-only to
|
|
6
|
+
* tenants. Pair with `vk_tenant_social_platforms` (per-tenant enable +
|
|
7
|
+
* author-ref) which the package also ships.
|
|
8
|
+
*/
|
|
9
|
+
export type { SocialPlatformStatus, SocialPlatformRow, CreateSocialPlatformInput, PatchSocialPlatformInput, Querier, } from './types.js';
|
|
10
|
+
export { listSocialPlatforms, getSocialPlatformByKey, createSocialPlatform, patchSocialPlatform, deleteSocialPlatform, isUniqueViolation, isForeignKeyViolation, } from './crud.js';
|
|
11
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/catalog/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,YAAY,EACV,oBAAoB,EACpB,iBAAiB,EACjB,yBAAyB,EACzB,wBAAwB,EACxB,OAAO,GACR,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,mBAAmB,EACnB,sBAAsB,EACtB,oBAAoB,EACpB,mBAAmB,EACnB,oBAAoB,EACpB,iBAAiB,EACjB,qBAAqB,GACtB,MAAM,WAAW,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `vk_social_platforms` catalog — CRUD + types.
|
|
3
|
+
*
|
|
4
|
+
* The platform-admin-owned list of supported social networks. Consuming
|
|
5
|
+
* apps expose this read-write to their platform admins and read-only to
|
|
6
|
+
* tenants. Pair with `vk_tenant_social_platforms` (per-tenant enable +
|
|
7
|
+
* author-ref) which the package also ships.
|
|
8
|
+
*/
|
|
9
|
+
export { listSocialPlatforms, getSocialPlatformByKey, createSocialPlatform, patchSocialPlatform, deleteSocialPlatform, isUniqueViolation, isForeignKeyViolation, } from './crud.js';
|
|
10
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/catalog/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAUH,OAAO,EACL,mBAAmB,EACnB,sBAAsB,EACtB,oBAAoB,EACpB,mBAAmB,EACnB,oBAAoB,EACpB,iBAAiB,EACjB,qBAAqB,GACtB,MAAM,WAAW,CAAC"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Types for the `vk_social_platforms` catalog CRUD module.
|
|
3
|
+
*
|
|
4
|
+
* The catalog is the platform-admin-owned list of every social network
|
|
5
|
+
* the package supports (schema in `vk_social_0001_init.sql`). One row
|
|
6
|
+
* per `(provider, adapter version)`. Consuming apps (e.g. the CMS) expose
|
|
7
|
+
* CRUD over this same table to their platform-admin users; tenants only
|
|
8
|
+
* enumerate it.
|
|
9
|
+
*/
|
|
10
|
+
/**
|
|
11
|
+
* Lifecycle status — mirrors the DB enum `vk_social_platform_status`:
|
|
12
|
+
* - `available` — renders in pickers.
|
|
13
|
+
* - `deprecated` — still callable, UI nudges a swap.
|
|
14
|
+
* - `disabled` — refuses to publish at the adapter-resolution boundary.
|
|
15
|
+
*/
|
|
16
|
+
export type SocialPlatformStatus = 'available' | 'deprecated' | 'disabled';
|
|
17
|
+
/**
|
|
18
|
+
* One row of `vk_social_platforms`, post-mapping (snake_case →
|
|
19
|
+
* camelCase). `meta` is intentionally loose (`Record<string, unknown>`)
|
|
20
|
+
* — the package documents `{ iconKey, brandColor }` but apps may stamp
|
|
21
|
+
* extra rendering keys.
|
|
22
|
+
*/
|
|
23
|
+
export interface SocialPlatformRow {
|
|
24
|
+
key: string;
|
|
25
|
+
displayName: string;
|
|
26
|
+
status: SocialPlatformStatus;
|
|
27
|
+
description: string | null;
|
|
28
|
+
meta: Record<string, unknown>;
|
|
29
|
+
introducedAt: Date;
|
|
30
|
+
deprecatedAt: Date | null;
|
|
31
|
+
disabledAt: Date | null;
|
|
32
|
+
createdAt: Date;
|
|
33
|
+
updatedAt: Date;
|
|
34
|
+
}
|
|
35
|
+
export interface CreateSocialPlatformInput {
|
|
36
|
+
key: string;
|
|
37
|
+
displayName: string;
|
|
38
|
+
description?: string | null;
|
|
39
|
+
status?: SocialPlatformStatus;
|
|
40
|
+
meta?: Record<string, unknown>;
|
|
41
|
+
}
|
|
42
|
+
export interface PatchSocialPlatformInput {
|
|
43
|
+
displayName?: string;
|
|
44
|
+
description?: string | null;
|
|
45
|
+
status?: SocialPlatformStatus;
|
|
46
|
+
meta?: Record<string, unknown>;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Querier — same shape as the rest of the workspace (`@venturekit/data`'s
|
|
50
|
+
* `query` / a bound transaction `tx.query`). Declared locally so this
|
|
51
|
+
* module carries no hard dependency on `@venturekit/data` (it's an
|
|
52
|
+
* optional peer); the consumer passes their querier in.
|
|
53
|
+
*/
|
|
54
|
+
export type Querier = <T = Record<string, unknown>[]>(sql: string, params?: unknown[]) => Promise<T>;
|
|
55
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/catalog/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH;;;;;GAKG;AACH,MAAM,MAAM,oBAAoB,GAAG,WAAW,GAAG,YAAY,GAAG,UAAU,CAAC;AAE3E;;;;;GAKG;AACH,MAAM,WAAW,iBAAiB;IAChC,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,oBAAoB,CAAC;IAC7B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,YAAY,EAAE,IAAI,CAAC;IACnB,YAAY,EAAE,IAAI,GAAG,IAAI,CAAC;IAC1B,UAAU,EAAE,IAAI,GAAG,IAAI,CAAC;IACxB,SAAS,EAAE,IAAI,CAAC;IAChB,SAAS,EAAE,IAAI,CAAC;CACjB;AAED,MAAM,WAAW,yBAAyB;IACxC,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,MAAM,CAAC,EAAE,oBAAoB,CAAC;IAC9B,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAChC;AAED,MAAM,WAAW,wBAAwB;IACvC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,MAAM,CAAC,EAAE,oBAAoB,CAAC;IAC9B,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAChC;AAED;;;;;GAKG;AACH,MAAM,MAAM,OAAO,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,EAClD,GAAG,EAAE,MAAM,EACX,MAAM,CAAC,EAAE,OAAO,EAAE,KACf,OAAO,CAAC,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Types for the `vk_social_platforms` catalog CRUD module.
|
|
3
|
+
*
|
|
4
|
+
* The catalog is the platform-admin-owned list of every social network
|
|
5
|
+
* the package supports (schema in `vk_social_0001_init.sql`). One row
|
|
6
|
+
* per `(provider, adapter version)`. Consuming apps (e.g. the CMS) expose
|
|
7
|
+
* CRUD over this same table to their platform-admin users; tenants only
|
|
8
|
+
* enumerate it.
|
|
9
|
+
*/
|
|
10
|
+
export {};
|
|
11
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/catalog/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG"}
|
package/dist/index.d.ts
CHANGED
|
@@ -10,6 +10,8 @@
|
|
|
10
10
|
* `createXAdapter` /
|
|
11
11
|
* `createFacebookAdapter` /
|
|
12
12
|
* `createInstagramAdapter` — v1 adapters.
|
|
13
|
+
* - `listSocialPlatforms` / `createSocialPlatform` / …
|
|
14
|
+
* — CRUD over the `vk_social_platforms` catalog.
|
|
13
15
|
* - `getSocialMigrationsDir` — path to `vk_social_*.sql` for `vk migrate`.
|
|
14
16
|
*
|
|
15
17
|
* Documentation: https://venturekit.dev
|
|
@@ -24,5 +26,7 @@ export { vendorFetch } from './http.js';
|
|
|
24
26
|
export type { FetchOptions, FetchResult } from './http.js';
|
|
25
27
|
export { createLinkedInAdapter, LINKEDIN_CONSTRAINTS, createXAdapter, X_CONSTRAINTS, createFacebookAdapter, FACEBOOK_CONSTRAINTS, createInstagramAdapter, INSTAGRAM_CONSTRAINTS, } from './adapters/index.js';
|
|
26
28
|
export type { LinkedInAdapterConfig, XAdapterConfig, FacebookAdapterConfig, InstagramAdapterConfig, } from './adapters/index.js';
|
|
29
|
+
export { listSocialPlatforms, getSocialPlatformByKey, createSocialPlatform, patchSocialPlatform, deleteSocialPlatform, isUniqueViolation, isForeignKeyViolation, } from './catalog/index.js';
|
|
30
|
+
export type { SocialPlatformStatus, SocialPlatformRow, CreateSocialPlatformInput, PatchSocialPlatformInput, } from './catalog/index.js';
|
|
27
31
|
export { getSocialMigrationsDir } from './path.js';
|
|
28
32
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAGH,YAAY,EACV,iBAAiB,EACjB,UAAU,EACV,WAAW,EACX,yBAAyB,EACzB,oBAAoB,EACpB,qBAAqB,EACrB,sBAAsB,EACtB,gBAAgB,EAChB,aAAa,EACb,YAAY,EACZ,YAAY,GACb,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,kBAAkB,EAClB,eAAe,EACf,oBAAoB,EACpB,qBAAqB,GACtB,MAAM,YAAY,CAAC;AAGpB,YAAY,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAClD,YAAY,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAGtD,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAG9D,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAG3D,OAAO,EACL,qBAAqB,EACrB,oBAAoB,EACpB,cAAc,EACd,aAAa,EACb,qBAAqB,EACrB,oBAAoB,EACpB,sBAAsB,EACtB,qBAAqB,GACtB,MAAM,qBAAqB,CAAC;AAC7B,YAAY,EACV,qBAAqB,EACrB,cAAc,EACd,qBAAqB,EACrB,sBAAsB,GACvB,MAAM,qBAAqB,CAAC;AAG7B,OAAO,EACL,mBAAmB,EACnB,sBAAsB,EACtB,oBAAoB,EACpB,mBAAmB,EACnB,oBAAoB,EACpB,iBAAiB,EACjB,qBAAqB,GACtB,MAAM,oBAAoB,CAAC;AAC5B,YAAY,EACV,oBAAoB,EACpB,iBAAiB,EACjB,yBAAyB,EACzB,wBAAwB,GACzB,MAAM,oBAAoB,CAAC;AAG5B,OAAO,EAAE,sBAAsB,EAAE,MAAM,WAAW,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -10,6 +10,8 @@
|
|
|
10
10
|
* `createXAdapter` /
|
|
11
11
|
* `createFacebookAdapter` /
|
|
12
12
|
* `createInstagramAdapter` — v1 adapters.
|
|
13
|
+
* - `listSocialPlatforms` / `createSocialPlatform` / …
|
|
14
|
+
* — CRUD over the `vk_social_platforms` catalog.
|
|
13
15
|
* - `getSocialMigrationsDir` — path to `vk_social_*.sql` for `vk migrate`.
|
|
14
16
|
*
|
|
15
17
|
* Documentation: https://venturekit.dev
|
|
@@ -22,6 +24,8 @@ export { validatePost, simplifyRatio } from './validation.js';
|
|
|
22
24
|
export { vendorFetch } from './http.js';
|
|
23
25
|
// ─── V1 adapters ─────────────────────────────────────────────────────
|
|
24
26
|
export { createLinkedInAdapter, LINKEDIN_CONSTRAINTS, createXAdapter, X_CONSTRAINTS, createFacebookAdapter, FACEBOOK_CONSTRAINTS, createInstagramAdapter, INSTAGRAM_CONSTRAINTS, } from './adapters/index.js';
|
|
27
|
+
// ─── Platform catalog (vk_social_platforms CRUD) ─────────────────────
|
|
28
|
+
export { listSocialPlatforms, getSocialPlatformByKey, createSocialPlatform, patchSocialPlatform, deleteSocialPlatform, isUniqueViolation, isForeignKeyViolation, } from './catalog/index.js';
|
|
25
29
|
// ─── Migrations wiring ───────────────────────────────────────────────
|
|
26
30
|
export { getSocialMigrationsDir } from './path.js';
|
|
27
31
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAiBH,OAAO,EACL,kBAAkB,EAClB,eAAe,EACf,oBAAoB,EACpB,qBAAqB,GACtB,MAAM,YAAY,CAAC;AAKpB,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAEtD,wEAAwE;AACxE,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAE9D,uEAAuE;AACvE,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAGxC,wEAAwE;AACxE,OAAO,EACL,qBAAqB,EACrB,oBAAoB,EACpB,cAAc,EACd,aAAa,EACb,qBAAqB,EACrB,oBAAoB,EACpB,sBAAsB,EACtB,qBAAqB,GACtB,MAAM,qBAAqB,CAAC;AAQ7B,wEAAwE;AACxE,OAAO,EACL,mBAAmB,EACnB,sBAAsB,EACtB,oBAAoB,EACpB,mBAAmB,EACnB,oBAAoB,EACpB,iBAAiB,EACjB,qBAAqB,GACtB,MAAM,oBAAoB,CAAC;AAQ5B,wEAAwE;AACxE,OAAO,EAAE,sBAAsB,EAAE,MAAM,WAAW,CAAC"}
|
|
@@ -35,7 +35,7 @@ BEGIN
|
|
|
35
35
|
END
|
|
36
36
|
$$;
|
|
37
37
|
|
|
38
|
-
CREATE TABLE IF NOT EXISTS
|
|
38
|
+
CREATE TABLE IF NOT EXISTS vk_social_platforms (
|
|
39
39
|
key varchar(64) PRIMARY KEY,
|
|
40
40
|
display_name varchar(255) NOT NULL,
|
|
41
41
|
-- Lifecycle: `available` rows render in pickers; `deprecated` ones
|
|
@@ -65,9 +65,9 @@ CREATE TABLE IF NOT EXISTS social_platforms (
|
|
|
65
65
|
-- author ref (the platform-side id we publish into), and optional
|
|
66
66
|
-- vendor metadata.
|
|
67
67
|
|
|
68
|
-
CREATE TABLE IF NOT EXISTS
|
|
68
|
+
CREATE TABLE IF NOT EXISTS vk_tenant_social_platforms (
|
|
69
69
|
tenant_id uuid NOT NULL,
|
|
70
|
-
platform_key varchar(64) NOT NULL REFERENCES
|
|
70
|
+
platform_key varchar(64) NOT NULL REFERENCES vk_social_platforms(key) ON DELETE RESTRICT,
|
|
71
71
|
enabled boolean NOT NULL DEFAULT TRUE,
|
|
72
72
|
-- Platform-side identifier this tenant publishes to. URN / page id /
|
|
73
73
|
-- ig user id. Required when enabled = TRUE; the application enforces
|
|
@@ -84,7 +84,7 @@ CREATE TABLE IF NOT EXISTS tenant_social_platforms (
|
|
|
84
84
|
);
|
|
85
85
|
|
|
86
86
|
CREATE INDEX IF NOT EXISTS tenant_social_platforms_enabled_idx
|
|
87
|
-
ON
|
|
87
|
+
ON vk_tenant_social_platforms (tenant_id)
|
|
88
88
|
WHERE enabled;
|
|
89
89
|
|
|
90
90
|
-- ─── Catalog seed ───────────────────────────────────────────────────
|
|
@@ -93,7 +93,7 @@ CREATE INDEX IF NOT EXISTS tenant_social_platforms_enabled_idx
|
|
|
93
93
|
-- an already-seeded DB is a no-op. Tenants who want to add custom
|
|
94
94
|
-- adapters (e.g. Mastodon, Bluesky) insert their own row at app boot.
|
|
95
95
|
|
|
96
|
-
INSERT INTO
|
|
96
|
+
INSERT INTO vk_social_platforms (key, display_name, description, meta) VALUES
|
|
97
97
|
(
|
|
98
98
|
'linkedin',
|
|
99
99
|
'LinkedIn',
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@venturekit-pro/social",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.1",
|
|
4
4
|
"description": "Social-platform publishing adapters + catalog for VentureKit applications",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -55,10 +55,10 @@
|
|
|
55
55
|
"publishing"
|
|
56
56
|
],
|
|
57
57
|
"dependencies": {
|
|
58
|
-
"@venturekit/core": "0.0.
|
|
58
|
+
"@venturekit/core": "0.0.1"
|
|
59
59
|
},
|
|
60
60
|
"peerDependencies": {
|
|
61
|
-
"@venturekit/data": "0.0.
|
|
61
|
+
"@venturekit/data": "0.0.1"
|
|
62
62
|
},
|
|
63
63
|
"peerDependenciesMeta": {
|
|
64
64
|
"@venturekit/data": {
|
|
@@ -67,7 +67,7 @@
|
|
|
67
67
|
},
|
|
68
68
|
"devDependencies": {
|
|
69
69
|
"@types/node": "^25.6.0",
|
|
70
|
-
"@venturekit/data": "0.0.
|
|
70
|
+
"@venturekit/data": "0.0.1",
|
|
71
71
|
"typescript": "^5.3.0"
|
|
72
72
|
},
|
|
73
73
|
"scripts": {
|
|
@@ -35,7 +35,7 @@ BEGIN
|
|
|
35
35
|
END
|
|
36
36
|
$$;
|
|
37
37
|
|
|
38
|
-
CREATE TABLE IF NOT EXISTS
|
|
38
|
+
CREATE TABLE IF NOT EXISTS vk_social_platforms (
|
|
39
39
|
key varchar(64) PRIMARY KEY,
|
|
40
40
|
display_name varchar(255) NOT NULL,
|
|
41
41
|
-- Lifecycle: `available` rows render in pickers; `deprecated` ones
|
|
@@ -65,9 +65,9 @@ CREATE TABLE IF NOT EXISTS social_platforms (
|
|
|
65
65
|
-- author ref (the platform-side id we publish into), and optional
|
|
66
66
|
-- vendor metadata.
|
|
67
67
|
|
|
68
|
-
CREATE TABLE IF NOT EXISTS
|
|
68
|
+
CREATE TABLE IF NOT EXISTS vk_tenant_social_platforms (
|
|
69
69
|
tenant_id uuid NOT NULL,
|
|
70
|
-
platform_key varchar(64) NOT NULL REFERENCES
|
|
70
|
+
platform_key varchar(64) NOT NULL REFERENCES vk_social_platforms(key) ON DELETE RESTRICT,
|
|
71
71
|
enabled boolean NOT NULL DEFAULT TRUE,
|
|
72
72
|
-- Platform-side identifier this tenant publishes to. URN / page id /
|
|
73
73
|
-- ig user id. Required when enabled = TRUE; the application enforces
|
|
@@ -84,7 +84,7 @@ CREATE TABLE IF NOT EXISTS tenant_social_platforms (
|
|
|
84
84
|
);
|
|
85
85
|
|
|
86
86
|
CREATE INDEX IF NOT EXISTS tenant_social_platforms_enabled_idx
|
|
87
|
-
ON
|
|
87
|
+
ON vk_tenant_social_platforms (tenant_id)
|
|
88
88
|
WHERE enabled;
|
|
89
89
|
|
|
90
90
|
-- ─── Catalog seed ───────────────────────────────────────────────────
|
|
@@ -93,7 +93,7 @@ CREATE INDEX IF NOT EXISTS tenant_social_platforms_enabled_idx
|
|
|
93
93
|
-- an already-seeded DB is a no-op. Tenants who want to add custom
|
|
94
94
|
-- adapters (e.g. Mastodon, Bluesky) insert their own row at app boot.
|
|
95
95
|
|
|
96
|
-
INSERT INTO
|
|
96
|
+
INSERT INTO vk_social_platforms (key, display_name, description, meta) VALUES
|
|
97
97
|
(
|
|
98
98
|
'linkedin',
|
|
99
99
|
'LinkedIn',
|