@vibes.diy/api-svc 2.3.5 → 2.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.
- package/create-handler.js +8 -2
- package/create-handler.js.map +1 -1
- package/intern/write-apps.js +5 -3
- package/intern/write-apps.js.map +1 -1
- package/package.json +11 -11
- package/public/app-documents.js.map +1 -1
- package/public/asset-upload-grant.js.map +1 -1
- package/public/ensure-app-slug-item.js +5 -3
- package/public/ensure-app-slug-item.js.map +1 -1
- package/public/invite-flow.js +2 -3
- package/public/invite-flow.js.map +1 -1
- package/public/list-members.js.map +1 -1
- package/public/list-recent-vibes.js +2 -3
- package/public/list-recent-vibes.js.map +1 -1
- package/public/pin-recent-vibe.js +5 -3
- package/public/pin-recent-vibe.js.map +1 -1
- package/public/report-active-members.d.ts +3 -0
- package/public/report-active-members.js +94 -0
- package/public/report-active-members.js.map +1 -0
- package/public/report-attribution-referrers.js +38 -7
- package/public/report-attribution-referrers.js.map +1 -1
- package/public/report-campaign-health.d.ts +3 -0
- package/public/report-campaign-health.js +133 -0
- package/public/report-campaign-health.js.map +1 -0
- package/public/report-growth-memberships.js +2 -3
- package/public/report-growth-memberships.js.map +1 -1
- package/public/report-growth-vibes-with-data.js +2 -3
- package/public/report-growth-vibes-with-data.js.map +1 -1
- package/public/report-top-vibes-by-members.d.ts +3 -0
- package/public/report-top-vibes-by-members.js +76 -0
- package/public/report-top-vibes-by-members.js.map +1 -0
- package/public/request-flow.js +18 -18
- package/public/request-flow.js.map +1 -1
- package/public/user-slug-bindings.js +4 -4
- package/public/user-slug-bindings.js.map +1 -1
- package/public/who-am-i.js.map +1 -1
- package/types.d.ts +3 -0
- package/types.js.map +1 -1
- package/vibes-msg-evento.js +8 -5
- package/vibes-msg-evento.js.map +1 -1
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { Result, Option, EventoResult } from "@adviser/cement";
|
|
2
|
+
import { reqReportActiveMembers, resReportActiveMembers, } from "@vibes.diy/api-types";
|
|
3
|
+
import { type } from "arktype";
|
|
4
|
+
import { eq, gte } from "drizzle-orm";
|
|
5
|
+
import { unwrapMsgBase } from "../unwrap-msg-base.js";
|
|
6
|
+
import { checkAuth } from "../check-auth.js";
|
|
7
|
+
import { cachedReport, hasReport } from "./report-cache.js";
|
|
8
|
+
function last30DaysUTC() {
|
|
9
|
+
const days = [];
|
|
10
|
+
const now = new Date();
|
|
11
|
+
for (let i = 29; i >= 0; i--) {
|
|
12
|
+
const d = new Date(Date.UTC(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate() - i));
|
|
13
|
+
days.push(d.toISOString().slice(0, 10));
|
|
14
|
+
}
|
|
15
|
+
return days;
|
|
16
|
+
}
|
|
17
|
+
async function computeActiveMembers(vctx) {
|
|
18
|
+
const t = vctx.sql.tables;
|
|
19
|
+
const reqRows = await vctx.sql.db
|
|
20
|
+
.select({
|
|
21
|
+
memberId: t.requestGrants.foreignUserId,
|
|
22
|
+
userSlug: t.requestGrants.userSlug,
|
|
23
|
+
appSlug: t.requestGrants.appSlug,
|
|
24
|
+
})
|
|
25
|
+
.from(t.requestGrants)
|
|
26
|
+
.where(eq(t.requestGrants.state, "approved"));
|
|
27
|
+
const invRows = await vctx.sql.db
|
|
28
|
+
.select({
|
|
29
|
+
memberId: t.inviteGrants.tokenOrGrantUserId,
|
|
30
|
+
userSlug: t.inviteGrants.userSlug,
|
|
31
|
+
appSlug: t.inviteGrants.appSlug,
|
|
32
|
+
})
|
|
33
|
+
.from(t.inviteGrants)
|
|
34
|
+
.where(eq(t.inviteGrants.state, "accepted"));
|
|
35
|
+
const memberKeys = new Set();
|
|
36
|
+
for (const r of [...reqRows, ...invRows]) {
|
|
37
|
+
memberKeys.add(`${r.memberId}:${r.userSlug}:${r.appSlug}`);
|
|
38
|
+
}
|
|
39
|
+
const days = last30DaysUTC();
|
|
40
|
+
const since = `${days[0]}T00:00:00.000Z`;
|
|
41
|
+
const writes = await vctx.sql.db
|
|
42
|
+
.select({
|
|
43
|
+
userId: t.appDocuments.userId,
|
|
44
|
+
userSlug: t.appDocuments.userSlug,
|
|
45
|
+
appSlug: t.appDocuments.appSlug,
|
|
46
|
+
created: t.appDocuments.created,
|
|
47
|
+
})
|
|
48
|
+
.from(t.appDocuments)
|
|
49
|
+
.where(gte(t.appDocuments.created, since));
|
|
50
|
+
const dayBuckets = new Map();
|
|
51
|
+
for (const w of writes) {
|
|
52
|
+
if (w.userId === "unknown")
|
|
53
|
+
continue;
|
|
54
|
+
const key = `${w.userId}:${w.userSlug}:${w.appSlug}`;
|
|
55
|
+
if (!memberKeys.has(key))
|
|
56
|
+
continue;
|
|
57
|
+
const day = w.created.slice(0, 10);
|
|
58
|
+
let bucket = dayBuckets.get(day);
|
|
59
|
+
if (bucket === undefined) {
|
|
60
|
+
bucket = new Set();
|
|
61
|
+
dayBuckets.set(day, bucket);
|
|
62
|
+
}
|
|
63
|
+
bucket.add(w.userId);
|
|
64
|
+
}
|
|
65
|
+
return {
|
|
66
|
+
type: "vibes.diy.res-report-active-members",
|
|
67
|
+
generatedAt: new Date().toISOString(),
|
|
68
|
+
days: days.map((day) => ({ day, count: dayBuckets.get(day)?.size ?? 0 })),
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
export const reportActiveMembersEvento = {
|
|
72
|
+
hash: "vibes.diy.req-report-active-members",
|
|
73
|
+
validate: unwrapMsgBase(async (msg) => {
|
|
74
|
+
const ret = reqReportActiveMembers(msg.payload);
|
|
75
|
+
if (ret instanceof type.errors)
|
|
76
|
+
return Result.Ok(Option.None());
|
|
77
|
+
return Result.Ok(Option.Some({ ...msg, payload: ret }));
|
|
78
|
+
}),
|
|
79
|
+
handle: checkAuth(async (ctx) => {
|
|
80
|
+
const req = ctx.validated.payload;
|
|
81
|
+
const vctx = ctx.ctx.getOrThrow("vibesApiCtx");
|
|
82
|
+
if (hasReport(req._auth.verifiedAuth.claims, "growth") === false) {
|
|
83
|
+
await ctx.send.send(ctx, {
|
|
84
|
+
type: "vibes.diy.res-error",
|
|
85
|
+
error: { message: "not authorized for growth report", code: "report-not-authorized" },
|
|
86
|
+
});
|
|
87
|
+
return Result.Ok(EventoResult.Continue);
|
|
88
|
+
}
|
|
89
|
+
const res = await cachedReport(vctx, "active-members", resReportActiveMembers, () => computeActiveMembers(vctx));
|
|
90
|
+
await ctx.send.send(ctx, res);
|
|
91
|
+
return Result.Ok(EventoResult.Continue);
|
|
92
|
+
}),
|
|
93
|
+
};
|
|
94
|
+
//# sourceMappingURL=report-active-members.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"report-active-members.js","sourceRoot":"","sources":["../../jsr/public/report-active-members.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,31 +1,63 @@
|
|
|
1
1
|
import { Result, Option, EventoResult } from "@adviser/cement";
|
|
2
2
|
import { reqReportAttributionReferrers, resReportAttributionReferrers, } from "@vibes.diy/api-types";
|
|
3
3
|
import { type } from "arktype";
|
|
4
|
-
import { sql, desc, eq } from "drizzle-orm";
|
|
4
|
+
import { sql, desc, eq, notInArray, and } from "drizzle-orm";
|
|
5
5
|
import { unwrapMsgBase } from "../unwrap-msg-base.js";
|
|
6
6
|
import { checkAuth } from "../check-auth.js";
|
|
7
7
|
import { cachedReport, hasReport } from "./report-cache.js";
|
|
8
|
+
const OWNED_HOSTS = [
|
|
9
|
+
"vibesdiy.app",
|
|
10
|
+
"www.vibesdiy.app",
|
|
11
|
+
"vibesdiy.work",
|
|
12
|
+
"www.vibesdiy.work",
|
|
13
|
+
"vibing.cool",
|
|
14
|
+
"www.vibing.cool",
|
|
15
|
+
"vibecode.garden",
|
|
16
|
+
"www.vibecode.garden",
|
|
17
|
+
"www.justvibes.dev",
|
|
18
|
+
"www.vibrate.dev",
|
|
19
|
+
"www.realize.run",
|
|
20
|
+
"www.dreamcode.live",
|
|
21
|
+
"www.vibes.software",
|
|
22
|
+
];
|
|
23
|
+
const LEGACY_VIBE_PATH_RE = sql `'^/vibe/[^/]+$'`;
|
|
8
24
|
async function computeAttributionReferrers(vctx, reqPathFilter) {
|
|
9
25
|
const t = vctx.sql.tables;
|
|
26
|
+
const ownedFilter = notInArray(t.refererEvents.refHost, OWNED_HOSTS);
|
|
27
|
+
const notLegacyVibeFilter = sql `${t.refererEvents.reqPath} !~ ${LEGACY_VIBE_PATH_RE}`;
|
|
10
28
|
const baseQuery = vctx.sql.db
|
|
11
29
|
.select({
|
|
12
30
|
refHost: t.refererEvents.refHost,
|
|
13
31
|
refPath: t.refererEvents.refPath,
|
|
14
32
|
reqPath: t.refererEvents.reqPath,
|
|
15
33
|
total: sql `cast(count(*) as int)`,
|
|
16
|
-
conversions: sql `cast(count(*) filter (where ${t.refererEvents.reqPath} like '/api/%' or ${t.refererEvents.reqPath} like '/new%' or ${t.refererEvents.reqPath} like '/vibe/%') as int)`,
|
|
17
34
|
})
|
|
18
35
|
.from(t.refererEvents)
|
|
19
36
|
.$dynamic();
|
|
20
|
-
const filtered = reqPathFilter !== undefined
|
|
37
|
+
const filtered = reqPathFilter !== undefined
|
|
38
|
+
? baseQuery.where(and(ownedFilter, notLegacyVibeFilter, eq(t.refererEvents.reqPath, reqPathFilter)))
|
|
39
|
+
: baseQuery.where(and(ownedFilter, notLegacyVibeFilter));
|
|
21
40
|
const rows = await filtered
|
|
22
41
|
.groupBy(t.refererEvents.refHost, t.refererEvents.refPath, t.refererEvents.reqPath)
|
|
23
42
|
.orderBy(desc(sql `count(*)`))
|
|
24
43
|
.limit(100);
|
|
44
|
+
const legacyVibeRows = reqPathFilter === undefined
|
|
45
|
+
? await vctx.sql.db
|
|
46
|
+
.select({
|
|
47
|
+
reqPath: t.refererEvents.reqPath,
|
|
48
|
+
total: sql `cast(count(*) as int)`,
|
|
49
|
+
})
|
|
50
|
+
.from(t.refererEvents)
|
|
51
|
+
.where(sql `${t.refererEvents.reqPath} ~ ${LEGACY_VIBE_PATH_RE}`)
|
|
52
|
+
.groupBy(t.refererEvents.reqPath)
|
|
53
|
+
.orderBy(desc(sql `count(*)`))
|
|
54
|
+
.limit(200)
|
|
55
|
+
: [];
|
|
25
56
|
return {
|
|
26
57
|
type: "vibes.diy.res-report-attribution-referrers",
|
|
27
58
|
generatedAt: new Date().toISOString(),
|
|
28
|
-
rows
|
|
59
|
+
rows,
|
|
60
|
+
legacyVibeRows,
|
|
29
61
|
};
|
|
30
62
|
}
|
|
31
63
|
export const reportAttributionReferrersEvento = {
|
|
@@ -41,9 +73,8 @@ export const reportAttributionReferrersEvento = {
|
|
|
41
73
|
const vctx = ctx.ctx.getOrThrow("vibesApiCtx");
|
|
42
74
|
if (hasReport(req._auth.verifiedAuth.claims, "attribution") === false) {
|
|
43
75
|
await ctx.send.send(ctx, {
|
|
44
|
-
type: "vibes.diy.error",
|
|
45
|
-
message: "not authorized for attribution report",
|
|
46
|
-
code: "report-not-authorized",
|
|
76
|
+
type: "vibes.diy.res-error",
|
|
77
|
+
error: { message: "not authorized for attribution report", code: "report-not-authorized" },
|
|
47
78
|
});
|
|
48
79
|
return Result.Ok(EventoResult.Continue);
|
|
49
80
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"report-attribution-referrers.js","sourceRoot":"","sources":["../../jsr/public/report-attribution-referrers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,MAAM,EAAE,MAAM,EAAsC,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAClH,OAAO,EAQL,6BAA6B,EAC7B,6BAA6B,GAC9B,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAC/B,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"report-attribution-referrers.js","sourceRoot":"","sources":["../../jsr/public/report-attribution-referrers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import { EventoHandler } from "@adviser/cement";
|
|
2
|
+
import { MsgBase, ReqReportCampaignHealth, ResReportCampaignHealth, VibesDiyError, W3CWebSocketEvent } from "@vibes.diy/api-types";
|
|
3
|
+
export declare const reportCampaignHealthEvento: EventoHandler<W3CWebSocketEvent, MsgBase<ReqReportCampaignHealth>, ResReportCampaignHealth | VibesDiyError>;
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
import { Result, Option, EventoResult } from "@adviser/cement";
|
|
2
|
+
import { reqReportCampaignHealth, resReportCampaignHealth, } from "@vibes.diy/api-types";
|
|
3
|
+
import { type } from "arktype";
|
|
4
|
+
import { unwrapMsgBase } from "../unwrap-msg-base.js";
|
|
5
|
+
import { checkAuth } from "../check-auth.js";
|
|
6
|
+
import { cachedReport, hasReport } from "./report-cache.js";
|
|
7
|
+
const META_BASE = "https://graph.facebook.com/v19.0";
|
|
8
|
+
async function metaGet(path, token) {
|
|
9
|
+
const sep = path.includes("?") ? "&" : "?";
|
|
10
|
+
const res = await fetch(`${META_BASE}${path}${sep}access_token=${token}`);
|
|
11
|
+
const json = (await res.json());
|
|
12
|
+
if (json.error) {
|
|
13
|
+
throw new Error(`Meta API: ${json.error.message}`);
|
|
14
|
+
}
|
|
15
|
+
return json;
|
|
16
|
+
}
|
|
17
|
+
function lpv(row) {
|
|
18
|
+
return Number(row.actions?.find((a) => a.action_type === "landing_page_view")?.value ?? 0);
|
|
19
|
+
}
|
|
20
|
+
function costPerLpv(row) {
|
|
21
|
+
const l = lpv(row);
|
|
22
|
+
return l > 0 ? Number(row.spend) / l : Infinity;
|
|
23
|
+
}
|
|
24
|
+
async function fetchCampaignHealth(token, account, pixelId, days, since) {
|
|
25
|
+
const dateParam = since
|
|
26
|
+
? `&time_range=${encodeURIComponent(JSON.stringify({ since, until: new Date().toISOString().slice(0, 10) }))}`
|
|
27
|
+
: `&date_preset=last_${days}d`;
|
|
28
|
+
const dateLabel = since ? `since ${since}` : `last ${days} days`;
|
|
29
|
+
const fields = "campaign_name,campaign_id,impressions,clicks,spend,ctr,cpc,reach,actions";
|
|
30
|
+
const rows = [];
|
|
31
|
+
let after = undefined;
|
|
32
|
+
for (;;) {
|
|
33
|
+
const cursor = after !== undefined ? `&after=${encodeURIComponent(after)}` : "";
|
|
34
|
+
const page = await metaGet(`/${account}/insights?fields=${fields}&level=campaign&limit=100${dateParam}${cursor}`, token);
|
|
35
|
+
rows.push(...(page.data ?? []));
|
|
36
|
+
if (page.paging?.next === undefined)
|
|
37
|
+
break;
|
|
38
|
+
after = page.paging.cursors?.after;
|
|
39
|
+
if (after === undefined)
|
|
40
|
+
break;
|
|
41
|
+
}
|
|
42
|
+
const pixel = await (async () => {
|
|
43
|
+
try {
|
|
44
|
+
const px = await metaGet(`/${pixelId}?fields=name,last_fired_time,stats`, token);
|
|
45
|
+
const events = px.stats?.data?.flatMap((h) => h.data ?? []) ?? [];
|
|
46
|
+
const sum = {};
|
|
47
|
+
for (const e of events) {
|
|
48
|
+
sum[e.value] = (sum[e.value] ?? 0) + Number(e.count);
|
|
49
|
+
}
|
|
50
|
+
return { lastFired: px.last_fired_time, counts: sum };
|
|
51
|
+
}
|
|
52
|
+
catch (e) {
|
|
53
|
+
return { error: e.message };
|
|
54
|
+
}
|
|
55
|
+
})();
|
|
56
|
+
const nameCounts = {};
|
|
57
|
+
for (const r of rows)
|
|
58
|
+
nameCounts[r.campaign_name] = (nameCounts[r.campaign_name] ?? 0) + 1;
|
|
59
|
+
const duplicateNames = Object.entries(nameCounts)
|
|
60
|
+
.filter(([, n]) => n > 1)
|
|
61
|
+
.map(([name]) => name);
|
|
62
|
+
const spends = rows.map((r) => Number(r.spend)).sort((a, b) => a - b);
|
|
63
|
+
const medianSpend = spends[Math.floor(spends.length / 2)] ?? 0;
|
|
64
|
+
const zeroSpend = rows.filter((r) => Number(r.spend) === 0).map((r) => r.campaign_name);
|
|
65
|
+
const budgetOutliers = rows
|
|
66
|
+
.filter((r) => Number(r.spend) > 0 && Number(r.spend) < medianSpend * 0.4)
|
|
67
|
+
.map((r) => ({ name: r.campaign_name, spend: Number(r.spend).toFixed(2), medianSpend: medianSpend.toFixed(2) }));
|
|
68
|
+
const lowLpvRatio = rows
|
|
69
|
+
.filter((r) => Number(r.clicks) >= 5)
|
|
70
|
+
.map((r) => ({ name: r.campaign_name, clicks: Number(r.clicks), lpvs: lpv(r), ratio: lpv(r) / Number(r.clicks) }))
|
|
71
|
+
.filter((r) => r.ratio < 0.6 && r.clicks > 0);
|
|
72
|
+
const ranked = [...rows]
|
|
73
|
+
.sort((a, b) => costPerLpv(a) - costPerLpv(b))
|
|
74
|
+
.map((r) => ({ ...r, actions: r.actions?.map((a) => ({ ...a })) }));
|
|
75
|
+
const anomalies = { duplicateNames, budgetOutliers, zeroSpend, lowLpvRatio, pixel };
|
|
76
|
+
return {
|
|
77
|
+
type: "vibes.diy.res-report-campaign-health",
|
|
78
|
+
generatedAt: new Date().toISOString(),
|
|
79
|
+
dateLabel,
|
|
80
|
+
ranked,
|
|
81
|
+
anomalies,
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
export const reportCampaignHealthEvento = {
|
|
85
|
+
hash: "vibes.diy.req-report-campaign-health",
|
|
86
|
+
validate: unwrapMsgBase(async (msg) => {
|
|
87
|
+
const ret = reqReportCampaignHealth(msg.payload);
|
|
88
|
+
if (ret instanceof type.errors)
|
|
89
|
+
return Result.Ok(Option.None());
|
|
90
|
+
return Result.Ok(Option.Some({ ...msg, payload: ret }));
|
|
91
|
+
}),
|
|
92
|
+
handle: checkAuth(async (ctx) => {
|
|
93
|
+
const req = ctx.validated.payload;
|
|
94
|
+
const vctx = ctx.ctx.getOrThrow("vibesApiCtx");
|
|
95
|
+
if (hasReport(req._auth.verifiedAuth.claims, "campaign-health") === false) {
|
|
96
|
+
await ctx.send.send(ctx, {
|
|
97
|
+
type: "vibes.diy.res-error",
|
|
98
|
+
error: { message: "not authorized for campaign-health report", code: "report-not-authorized" },
|
|
99
|
+
});
|
|
100
|
+
return Result.Ok(EventoResult.Continue);
|
|
101
|
+
}
|
|
102
|
+
const token = vctx.metaAccessToken;
|
|
103
|
+
const account = vctx.metaAdAccountId;
|
|
104
|
+
const pixelId = vctx.metaPixelId;
|
|
105
|
+
if (!token || !account || !pixelId) {
|
|
106
|
+
await ctx.send.send(ctx, {
|
|
107
|
+
type: "vibes.diy.res-error",
|
|
108
|
+
error: {
|
|
109
|
+
message: "Meta API credentials not configured (META_ACCESS_TOKEN, META_AD_ACCOUNT_ID, META_PIXEL_ID)",
|
|
110
|
+
code: "meta-creds-missing",
|
|
111
|
+
},
|
|
112
|
+
});
|
|
113
|
+
return Result.Ok(EventoResult.Continue);
|
|
114
|
+
}
|
|
115
|
+
const days = req.days ?? "7";
|
|
116
|
+
const since = req.since;
|
|
117
|
+
const cacheKey = since ? `campaign-health:since:${since}` : `campaign-health:days:${days}`;
|
|
118
|
+
let res;
|
|
119
|
+
try {
|
|
120
|
+
res = await cachedReport(vctx, cacheKey, resReportCampaignHealth, () => fetchCampaignHealth(token, account, pixelId, days, since));
|
|
121
|
+
}
|
|
122
|
+
catch (e) {
|
|
123
|
+
await ctx.send.send(ctx, {
|
|
124
|
+
type: "vibes.diy.res-error",
|
|
125
|
+
error: { message: `Meta API error: ${e.message}`, code: "meta-api-error" },
|
|
126
|
+
});
|
|
127
|
+
return Result.Ok(EventoResult.Continue);
|
|
128
|
+
}
|
|
129
|
+
await ctx.send.send(ctx, res);
|
|
130
|
+
return Result.Ok(EventoResult.Continue);
|
|
131
|
+
}),
|
|
132
|
+
};
|
|
133
|
+
//# sourceMappingURL=report-campaign-health.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"report-campaign-health.js","sourceRoot":"","sources":["../../jsr/public/report-campaign-health.ts"],"names":[],"mappings":"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"}
|
|
@@ -104,9 +104,8 @@ export const reportGrowthMembershipsEvento = {
|
|
|
104
104
|
const vctx = ctx.ctx.getOrThrow("vibesApiCtx");
|
|
105
105
|
if (hasReport(req._auth.verifiedAuth.claims, "growth") === false) {
|
|
106
106
|
await ctx.send.send(ctx, {
|
|
107
|
-
type: "vibes.diy.error",
|
|
108
|
-
message: "not authorized for growth report",
|
|
109
|
-
code: "report-not-authorized",
|
|
107
|
+
type: "vibes.diy.res-error",
|
|
108
|
+
error: { message: "not authorized for growth report", code: "report-not-authorized" },
|
|
110
109
|
});
|
|
111
110
|
return Result.Ok(EventoResult.Continue);
|
|
112
111
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"report-growth-memberships.js","sourceRoot":"","sources":["../../jsr/public/report-growth-memberships.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"report-growth-memberships.js","sourceRoot":"","sources":["../../jsr/public/report-growth-memberships.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,MAAM,EAAE,MAAM,EAAsC,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAClH,OAAO,EAQL,0BAA0B,EAC1B,0BAA0B,GAC3B,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAC/B,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAE7C,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAE5D,SAAS,aAAa;IACpB,MAAM,IAAI,GAAa,EAAE,CAAC;IAC1B,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;IACvB,KAAK,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC7B,MAAM,CAAC,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,cAAc,EAAE,EAAE,GAAG,CAAC,WAAW,EAAE,EAAE,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;QAC5F,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;IAC1C,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,KAAK,UAAU,kBAAkB,CAAC,IAAoB;IACpD,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC;IAG1B,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE;SAC9B,MAAM,CAAC;QACN,OAAO,EAAE,CAAC,CAAC,aAAa,CAAC,OAAO;QAChC,QAAQ,EAAE,CAAC,CAAC,aAAa,CAAC,aAAa;QACvC,QAAQ,EAAE,CAAC,CAAC,aAAa,CAAC,QAAQ;QAClC,OAAO,EAAE,CAAC,CAAC,aAAa,CAAC,OAAO;KACjC,CAAC;SACD,IAAI,CAAC,CAAC,CAAC,aAAa,CAAC;SACrB,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC;IAGhD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE;SAC9B,MAAM,CAAC;QACN,OAAO,EAAE,CAAC,CAAC,YAAY,CAAC,OAAO;QAC/B,QAAQ,EAAE,CAAC,CAAC,YAAY,CAAC,kBAAkB;QAC3C,QAAQ,EAAE,CAAC,CAAC,YAAY,CAAC,QAAQ;QACjC,OAAO,EAAE,CAAC,CAAC,YAAY,CAAC,OAAO;KAChC,CAAC;SACD,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC;SACpB,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC;IAK/C,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC3C,KAAK,MAAM,CAAC,IAAI,CAAC,GAAG,OAAO,EAAE,GAAG,OAAO,CAAC,EAAE,CAAC;QACzC,MAAM,GAAG,GAAG,GAAG,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;QACvD,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC/B,IAAI,IAAI,KAAK,SAAS,IAAI,CAAC,CAAC,OAAO,GAAG,IAAI;YAAE,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC;IAC3E,CAAC;IAED,MAAM,IAAI,GAAG,aAAa,EAAE,CAAC;IAC7B,MAAM,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACzB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACtC,MAAM,MAAM,GAAG,GAAG,OAAO,gBAAgB,CAAC;IAE1C,IAAI,mBAAmB,GAAG,CAAC,CAAC;IAC5B,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAuB,CAAC;IAChD,MAAM,oBAAoB,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/C,KAAK,MAAM,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,QAAQ,EAAE,CAAC;QACtC,IAAI,OAAO,GAAG,MAAM;YAAE,SAAS;QAC/B,mBAAmB,IAAI,CAAC,CAAC;QACzB,MAAM,GAAG,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACjC,IAAI,GAAG,GAAG,QAAQ;YAAE,SAAS;QAC7B,MAAM,QAAQ,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;QAChD,IAAI,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC/B,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACzB,MAAM,GAAG,IAAI,GAAG,EAAE,CAAC;YACnB,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QAC5B,CAAC;QACD,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACrB,oBAAoB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACrC,CAAC;IAID,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC3C,IAAI,oBAAoB,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;QAClC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE;aAC/B,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,eAAe,CAAC,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC,eAAe,CAAC,QAAQ,EAAE,CAAC;aAClF,IAAI,CAAC,CAAC,CAAC,eAAe,CAAC;aACvB,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,MAAM,EAAE,CAAC,GAAG,oBAAoB,CAAC,CAAC,CAAC,CAAC;QACvE,KAAK,MAAM,CAAC,IAAI,QAAQ;YAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC;IAC/D,CAAC;IAED,MAAM,YAAY,GAAG,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACnD,MAAM,MAAM,GAAiE,EAAE,CAAC;IAChF,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,GAAG,GAAG,GAAG,GAAG,gBAAgB,CAAC;QACnC,OAAO,GAAG,GAAG,YAAY,CAAC,MAAM,IAAI,YAAY,CAAC,GAAG,CAAC,IAAI,GAAG;YAAE,GAAG,IAAI,CAAC,CAAC;QACvE,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACjC,MAAM,UAAU,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACxF,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,WAAW,EAAE,GAAG,EAAE,UAAU,EAAE,CAAC,CAAC;IACrD,CAAC;IAED,OAAO;QACL,IAAI,EAAE,yCAAyC;QAC/C,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACrC,KAAK,EAAE,mBAAmB;QAC1B,IAAI,EAAE,MAAM;KACb,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,6BAA6B,GAItC;IACF,IAAI,EAAE,yCAAyC;IAC/C,QAAQ,EAAE,aAAa,CAAC,KAAK,EAAE,GAAY,EAAE,EAAE;QAC7C,MAAM,GAAG,GAAG,0BAA0B,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACpD,IAAI,GAAG,YAAY,IAAI,CAAC,MAAM;YAAE,OAAO,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QAChE,OAAO,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;IAC1D,CAAC,CAAC;IACF,MAAM,EAAE,SAAS,CACf,KAAK,EACH,GAIC,EACkC,EAAE;QACrC,MAAM,GAAG,GAAG,GAAG,CAAC,SAAS,CAAC,OAAO,CAAC;QAClC,MAAM,IAAI,GAAG,GAAG,CAAC,GAAG,CAAC,UAAU,CAAiB,aAAa,CAAC,CAAC;QAE/D,IAAI,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,EAAE,QAAQ,CAAC,KAAK,KAAK,EAAE,CAAC;YACjE,MAAM,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE;gBACvB,IAAI,EAAE,qBAAqB;gBAC3B,KAAK,EAAE,EAAE,OAAO,EAAE,kCAAkC,EAAE,IAAI,EAAE,uBAAuB,EAAE;aACnE,CAAC,CAAC;YACtB,OAAO,MAAM,CAAC,EAAE,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;QAC1C,CAAC;QAED,MAAM,GAAG,GAAG,MAAM,YAAY,CAAC,IAAI,EAAE,oBAAoB,EAAE,0BAA0B,EAAE,GAAG,EAAE,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC;QACvH,MAAM,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QAC9B,OAAO,MAAM,CAAC,EAAE,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;IAC1C,CAAC,CACF;CACF,CAAC"}
|
|
@@ -51,9 +51,8 @@ export const reportGrowthVibesWithDataEvento = {
|
|
|
51
51
|
const vctx = ctx.ctx.getOrThrow("vibesApiCtx");
|
|
52
52
|
if (hasReport(req._auth.verifiedAuth.claims, "growth") === false) {
|
|
53
53
|
await ctx.send.send(ctx, {
|
|
54
|
-
type: "vibes.diy.error",
|
|
55
|
-
message: "not authorized for growth report",
|
|
56
|
-
code: "report-not-authorized",
|
|
54
|
+
type: "vibes.diy.res-error",
|
|
55
|
+
error: { message: "not authorized for growth report", code: "report-not-authorized" },
|
|
57
56
|
});
|
|
58
57
|
return Result.Ok(EventoResult.Continue);
|
|
59
58
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"report-growth-vibes-with-data.js","sourceRoot":"","sources":["../../jsr/public/report-growth-vibes-with-data.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"report-growth-vibes-with-data.js","sourceRoot":"","sources":["../../jsr/public/report-growth-vibes-with-data.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import { EventoHandler } from "@adviser/cement";
|
|
2
|
+
import { MsgBase, ReqReportTopVibesByMembers, ResReportTopVibesByMembers, VibesDiyError, W3CWebSocketEvent } from "@vibes.diy/api-types";
|
|
3
|
+
export declare const reportTopVibesByMembersEvento: EventoHandler<W3CWebSocketEvent, MsgBase<ReqReportTopVibesByMembers>, ResReportTopVibesByMembers | VibesDiyError>;
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { Result, Option, EventoResult } from "@adviser/cement";
|
|
2
|
+
import { reqReportTopVibesByMembers, resReportTopVibesByMembers, } from "@vibes.diy/api-types";
|
|
3
|
+
import { type } from "arktype";
|
|
4
|
+
import { eq } from "drizzle-orm";
|
|
5
|
+
import { unwrapMsgBase } from "../unwrap-msg-base.js";
|
|
6
|
+
import { checkAuth } from "../check-auth.js";
|
|
7
|
+
import { cachedReport, hasReport } from "./report-cache.js";
|
|
8
|
+
async function computeTopVibesByMembers(vctx) {
|
|
9
|
+
const t = vctx.sql.tables;
|
|
10
|
+
const reqRows = await vctx.sql.db
|
|
11
|
+
.select({
|
|
12
|
+
memberId: t.requestGrants.foreignUserId,
|
|
13
|
+
userSlug: t.requestGrants.userSlug,
|
|
14
|
+
appSlug: t.requestGrants.appSlug,
|
|
15
|
+
})
|
|
16
|
+
.from(t.requestGrants)
|
|
17
|
+
.where(eq(t.requestGrants.state, "approved"));
|
|
18
|
+
const invRows = await vctx.sql.db
|
|
19
|
+
.select({
|
|
20
|
+
memberId: t.inviteGrants.tokenOrGrantUserId,
|
|
21
|
+
userSlug: t.inviteGrants.userSlug,
|
|
22
|
+
appSlug: t.inviteGrants.appSlug,
|
|
23
|
+
})
|
|
24
|
+
.from(t.inviteGrants)
|
|
25
|
+
.where(eq(t.inviteGrants.state, "accepted"));
|
|
26
|
+
const vibeMembers = new Map();
|
|
27
|
+
for (const r of [...reqRows, ...invRows]) {
|
|
28
|
+
const vibeKey = `${r.userSlug}\x00${r.appSlug}`;
|
|
29
|
+
let members = vibeMembers.get(vibeKey);
|
|
30
|
+
if (members === undefined) {
|
|
31
|
+
members = new Set();
|
|
32
|
+
vibeMembers.set(vibeKey, members);
|
|
33
|
+
}
|
|
34
|
+
members.add(r.memberId);
|
|
35
|
+
}
|
|
36
|
+
const rows = [...vibeMembers.entries()]
|
|
37
|
+
.map(([key, members]) => {
|
|
38
|
+
const sep = key.indexOf("\x00");
|
|
39
|
+
return {
|
|
40
|
+
userSlug: key.slice(0, sep),
|
|
41
|
+
appSlug: key.slice(sep + 1),
|
|
42
|
+
memberCount: members.size,
|
|
43
|
+
};
|
|
44
|
+
})
|
|
45
|
+
.sort((a, b) => b.memberCount - a.memberCount)
|
|
46
|
+
.slice(0, 20);
|
|
47
|
+
return {
|
|
48
|
+
type: "vibes.diy.res-report-top-vibes-by-members",
|
|
49
|
+
generatedAt: new Date().toISOString(),
|
|
50
|
+
rows,
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
export const reportTopVibesByMembersEvento = {
|
|
54
|
+
hash: "vibes.diy.req-report-top-vibes-by-members",
|
|
55
|
+
validate: unwrapMsgBase(async (msg) => {
|
|
56
|
+
const ret = reqReportTopVibesByMembers(msg.payload);
|
|
57
|
+
if (ret instanceof type.errors)
|
|
58
|
+
return Result.Ok(Option.None());
|
|
59
|
+
return Result.Ok(Option.Some({ ...msg, payload: ret }));
|
|
60
|
+
}),
|
|
61
|
+
handle: checkAuth(async (ctx) => {
|
|
62
|
+
const req = ctx.validated.payload;
|
|
63
|
+
const vctx = ctx.ctx.getOrThrow("vibesApiCtx");
|
|
64
|
+
if (hasReport(req._auth.verifiedAuth.claims, "growth") === false) {
|
|
65
|
+
await ctx.send.send(ctx, {
|
|
66
|
+
type: "vibes.diy.res-error",
|
|
67
|
+
error: { message: "not authorized for growth report", code: "report-not-authorized" },
|
|
68
|
+
});
|
|
69
|
+
return Result.Ok(EventoResult.Continue);
|
|
70
|
+
}
|
|
71
|
+
const res = await cachedReport(vctx, "top-vibes-by-members", resReportTopVibesByMembers, () => computeTopVibesByMembers(vctx));
|
|
72
|
+
await ctx.send.send(ctx, res);
|
|
73
|
+
return Result.Ok(EventoResult.Continue);
|
|
74
|
+
}),
|
|
75
|
+
};
|
|
76
|
+
//# sourceMappingURL=report-top-vibes-by-members.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"report-top-vibes-by-members.js","sourceRoot":"","sources":["../../jsr/public/report-top-vibes-by-members.ts"],"names":[],"mappings":"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"}
|
package/public/request-flow.js
CHANGED
|
@@ -64,9 +64,8 @@ export async function hasAccessRequest(vctx, req) {
|
|
|
64
64
|
.limit(1);
|
|
65
65
|
if (ownerRows[0]?.userId === req.foreignUserId) {
|
|
66
66
|
return Result.Ok({
|
|
67
|
-
type: "vibes.diy.error",
|
|
68
|
-
message: `owner cannot check own app access: ${req.userSlug}/${req.appSlug}`,
|
|
69
|
-
code: "owner-error",
|
|
67
|
+
type: "vibes.diy.res-error",
|
|
68
|
+
error: { message: `owner cannot check own app access: ${req.userSlug}/${req.appSlug}`, code: "owner-error" },
|
|
70
69
|
});
|
|
71
70
|
}
|
|
72
71
|
return exception2Result(() => vctx.sql.db
|
|
@@ -132,25 +131,22 @@ export async function requestAccess(vctx, req, senderConnId) {
|
|
|
132
131
|
const record = rSettings.Ok();
|
|
133
132
|
if (!record) {
|
|
134
133
|
return Result.Ok({
|
|
135
|
-
type: "vibes.diy.error",
|
|
136
|
-
message: `app not found: ${req.userSlug}/${req.appSlug}`,
|
|
137
|
-
code: "request-access-app-not-found",
|
|
134
|
+
type: "vibes.diy.res-error",
|
|
135
|
+
error: { message: `app not found: ${req.userSlug}/${req.appSlug}`, code: "request-access-app-not-found" },
|
|
138
136
|
});
|
|
139
137
|
}
|
|
140
138
|
if (record.userId === req.foreignUserId) {
|
|
141
139
|
return Result.Ok({
|
|
142
|
-
type: "vibes.diy.error",
|
|
143
|
-
message: `owner cannot request access to own app: ${req.userSlug}/${req.appSlug}`,
|
|
144
|
-
code: "owner-error",
|
|
140
|
+
type: "vibes.diy.res-error",
|
|
141
|
+
error: { message: `owner cannot request access to own app: ${req.userSlug}/${req.appSlug}`, code: "owner-error" },
|
|
145
142
|
});
|
|
146
143
|
}
|
|
147
144
|
const settings = (record.settings ?? []);
|
|
148
145
|
const enableRequest = settings.find(isEnableRequest);
|
|
149
146
|
if (!enableRequest?.enable) {
|
|
150
147
|
return Result.Ok({
|
|
151
|
-
type: "vibes.diy.error",
|
|
152
|
-
message: `access requests not enabled for ${req.userSlug}/${req.appSlug}`,
|
|
153
|
-
code: "request-access-not-enabled",
|
|
148
|
+
type: "vibes.diy.res-error",
|
|
149
|
+
error: { message: `access requests not enabled for ${req.userSlug}/${req.appSlug}`, code: "request-access-not-enabled" },
|
|
154
150
|
});
|
|
155
151
|
}
|
|
156
152
|
const autoAcceptRole = enableRequest.autoAcceptRole;
|
|
@@ -358,9 +354,11 @@ export const approveRequestEvento = {
|
|
|
358
354
|
.limit(1);
|
|
359
355
|
if (!existing[0]) {
|
|
360
356
|
await ctx.send.send(ctx, {
|
|
361
|
-
type: "vibes.diy.error",
|
|
362
|
-
|
|
363
|
-
|
|
357
|
+
type: "vibes.diy.res-error",
|
|
358
|
+
error: {
|
|
359
|
+
message: `approve-request: not found ${req.userSlug}/${req.appSlug}/${req.foreignUserId}`,
|
|
360
|
+
code: "approve-request-not-found",
|
|
361
|
+
},
|
|
364
362
|
});
|
|
365
363
|
return Result.Ok(EventoResult.Continue);
|
|
366
364
|
}
|
|
@@ -421,9 +419,11 @@ export const requestSetRoleEvento = {
|
|
|
421
419
|
.then((rows) => rows[0]);
|
|
422
420
|
if (!existing) {
|
|
423
421
|
await ctx.send.send(ctx, {
|
|
424
|
-
type: "vibes.diy.error",
|
|
425
|
-
|
|
426
|
-
|
|
422
|
+
type: "vibes.diy.res-error",
|
|
423
|
+
error: {
|
|
424
|
+
message: `request-set-role: not found ${req.userSlug}/${req.appSlug}/${req.foreignUserId}`,
|
|
425
|
+
code: "request-set-role-not-found",
|
|
426
|
+
},
|
|
427
427
|
});
|
|
428
428
|
return Result.Ok(EventoResult.Continue);
|
|
429
429
|
}
|