@nextsparkjs/core 0.1.0-beta.179 → 0.1.0-beta.180
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/dist/contexts/TeamContext.d.ts.map +1 -1
- package/dist/contexts/TeamContext.js +18 -7
- package/dist/lib/api/auth/dual-auth.d.ts.map +1 -1
- package/dist/lib/api/auth/dual-auth.js +9 -1
- package/dist/lib/auth.d.ts +26 -0
- package/dist/lib/auth.d.ts.map +1 -1
- package/dist/lib/auth.js +18 -4
- package/dist/lib/teams/types.d.ts +1 -0
- package/dist/lib/teams/types.d.ts.map +1 -1
- package/dist/migrations/023_team_invitations_pending_email_index.sql +7 -0
- package/dist/migrations/024_teams_soft_delete.sql +36 -0
- package/dist/styles/classes.json +1 -1
- package/migrations/023_team_invitations_pending_email_index.sql +7 -0
- package/migrations/024_teams_soft_delete.sql +36 -0
- package/package.json +2 -2
- package/tests/jest/__mocks__/better-auth-plugins.js +8 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TeamContext.d.ts","sourceRoot":"","sources":["../../src/contexts/TeamContext.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAwE,SAAS,EAAE,MAAM,OAAO,CAAA;AAGvG,OAAO,EAAE,IAAI,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAA;AAM7D,UAAU,gBAAgB;IACxB,WAAW,EAAE,IAAI,GAAG,IAAI,CAAA;IACxB,SAAS,EAAE,kBAAkB,EAAE,CAAA;IAC/B,SAAS,EAAE,OAAO,CAAA;IAClB,WAAW,EAAE,OAAO,CAAA;IACpB,wBAAwB,EAAE,OAAO,CAAA;IACjC,UAAU,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IAC7C,YAAY,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;CAClC;AAKD,eAAO,MAAM,eAAe,yBAA0B,CAAA;AAGtD,wBAAsB,cAAc,IAAI,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAwBpE;AAED,wBAAgB,YAAY,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,EAAE,SAAS,CAAA;CAAE,
|
|
1
|
+
{"version":3,"file":"TeamContext.d.ts","sourceRoot":"","sources":["../../src/contexts/TeamContext.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAwE,SAAS,EAAE,MAAM,OAAO,CAAA;AAGvG,OAAO,EAAE,IAAI,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAA;AAM7D,UAAU,gBAAgB;IACxB,WAAW,EAAE,IAAI,GAAG,IAAI,CAAA;IACxB,SAAS,EAAE,kBAAkB,EAAE,CAAA;IAC/B,SAAS,EAAE,OAAO,CAAA;IAClB,WAAW,EAAE,OAAO,CAAA;IACpB,wBAAwB,EAAE,OAAO,CAAA;IACjC,UAAU,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IAC7C,YAAY,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;CAClC;AAKD,eAAO,MAAM,eAAe,yBAA0B,CAAA;AAGtD,wBAAsB,cAAc,IAAI,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAwBpE;AAED,wBAAgB,YAAY,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,EAAE,SAAS,CAAA;CAAE,2CAuNjE;AAED,wBAAgB,cAAc,qBAM7B"}
|
|
@@ -37,7 +37,6 @@ function TeamProvider({ children }) {
|
|
|
37
37
|
const queryClient = useQueryClient();
|
|
38
38
|
const [currentTeam, setCurrentTeam] = useState(null);
|
|
39
39
|
const [isSwitching, setIsSwitching] = useState(false);
|
|
40
|
-
const [initialSyncDone, setInitialSyncDone] = useState(false);
|
|
41
40
|
const [switchModalOpen, setSwitchModalOpen] = useState(false);
|
|
42
41
|
const [previousTeam, setPreviousTeam] = useState(null);
|
|
43
42
|
const [targetTeam, setTargetTeam] = useState(null);
|
|
@@ -53,8 +52,11 @@ function TeamProvider({ children }) {
|
|
|
53
52
|
// Cache for 5 minutes - prevents refetch on navigation
|
|
54
53
|
gcTime: 1e3 * 60 * 60,
|
|
55
54
|
// Keep in cache for 1 hour
|
|
56
|
-
|
|
57
|
-
//
|
|
55
|
+
// Automatic safety net for the self-heal above: if a membership change
|
|
56
|
+
// happened while this tab was unfocused (removed from a team, a team
|
|
57
|
+
// soft-deleted elsewhere), returning focus re-fetches userTeams without
|
|
58
|
+
// depending on whatever mutated it remembering to call refreshTeams().
|
|
59
|
+
refetchOnWindowFocus: true,
|
|
58
60
|
refetchOnMount: false
|
|
59
61
|
// Don't refetch if data exists and is not stale
|
|
60
62
|
});
|
|
@@ -66,7 +68,18 @@ function TeamProvider({ children }) {
|
|
|
66
68
|
return canUserCreateTeam(mode, options || {}, ownedTeamsCount);
|
|
67
69
|
}, [userTeams, user]);
|
|
68
70
|
useEffect(() => {
|
|
69
|
-
if (!user
|
|
71
|
+
if (!user) return;
|
|
72
|
+
if (!teamsLoading && userTeams.length === 0) {
|
|
73
|
+
if (currentTeam) {
|
|
74
|
+
setCurrentTeam(null);
|
|
75
|
+
if (typeof window !== "undefined") {
|
|
76
|
+
localStorage.removeItem("activeTeamId");
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
if (!userTeams.length) return;
|
|
82
|
+
if (currentTeam && userTeams.some((t) => t.team.id === currentTeam.id)) return;
|
|
70
83
|
const storedTeamId = typeof window !== "undefined" ? localStorage.getItem("activeTeamId") : null;
|
|
71
84
|
const storedTeam = storedTeamId ? userTeams.find((t) => t.team.id === storedTeamId) : null;
|
|
72
85
|
const activeTeam = storedTeam || userTeams[0];
|
|
@@ -82,13 +95,11 @@ function TeamProvider({ children }) {
|
|
|
82
95
|
body: JSON.stringify({ teamId: activeTeam.team.id })
|
|
83
96
|
}).catch((err) => console.error("Failed to sync team cookie:", err));
|
|
84
97
|
}
|
|
85
|
-
setInitialSyncDone(true);
|
|
86
98
|
}
|
|
87
|
-
}, [user, userTeams,
|
|
99
|
+
}, [user, userTeams, currentTeam, teamsLoading]);
|
|
88
100
|
useEffect(() => {
|
|
89
101
|
if (!user && !authLoading) {
|
|
90
102
|
setCurrentTeam(null);
|
|
91
|
-
setInitialSyncDone(false);
|
|
92
103
|
if (typeof window !== "undefined") {
|
|
93
104
|
localStorage.removeItem("activeTeamId");
|
|
94
105
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dual-auth.d.ts","sourceRoot":"","sources":["../../../../src/lib/api/auth/dual-auth.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"dual-auth.d.ts","sourceRoot":"","sources":["../../../../src/lib/api/auth/dual-auth.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAUvD;;;GAGG;AACH,eAAO,MAAM,oBAAoB,uBAAuB,CAAA;AAExD;;GAEG;AACH,eAAO,MAAM,mBAAmB,mBAAmB,CAAA;AACnD,eAAO,MAAM,kBAAkB,8BAA8B,CAAA;AAE7D;;;;;;;GAOG;AACH,eAAO,MAAM,kBAAkB,kBAAkB,CAAA;AAOjD,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,aAAa,CAAC,EAAE,MAAM,CAAA;CACvB;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,OAAO,CAAA;IAChB,IAAI,EAAE,SAAS,GAAG,SAAS,GAAG,MAAM,CAAA;IACpC,IAAI,EAAE,YAAY,GAAG,IAAI,CAAA;IACzB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;IACjB,iBAAiB,CAAC,EAAE,QAAQ,CAAA;IAC5B,2EAA2E;IAC3E,QAAQ,CAAC,EAAE;QAAE,cAAc,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,CAAA;CAC5D;AAqBD;;GAEG;AACH,wBAAsB,mBAAmB,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,cAAc,CAAC,CAkBvF;AAqKD;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,GAAG,OAAO,CAY3F;AAMD;;;;;;;;;;;;;GAaG;AACH,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,WAAW,EACpB,UAAU,EAAE,cAAc,GACzB,OAAO,CAAC,MAAM,GAAG,YAAY,CAAC,CAsChC;AAMD;;;;;;;;;GASG;AACH,wBAAsB,oBAAoB,CACxC,UAAU,EAAE,cAAc,EAC1B,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC,OAAO,CAAC,CAkBlB;AAkBD;;GAEG;AACH,wBAAgB,eAAe,CAAC,OAAO,GAAE,MAAkC,EAAE,MAAM,GAAE,MAAY;;;;GAShG"}
|
|
@@ -3,6 +3,7 @@ import { auth } from "../../auth.js";
|
|
|
3
3
|
import { validateApiKey } from "../auth.js";
|
|
4
4
|
import { queryOne } from "../../db.js";
|
|
5
5
|
import { TeamMemberService } from "../../services/team-member.service.js";
|
|
6
|
+
import { TeamService } from "../../services/team.service.js";
|
|
6
7
|
const SYSTEM_ADMIN_TEAM_ID = "team-nextspark-001";
|
|
7
8
|
const ADMIN_BYPASS_HEADER = "x-admin-bypass";
|
|
8
9
|
const ADMIN_BYPASS_VALUE = "confirm-cross-team-access";
|
|
@@ -157,10 +158,17 @@ async function resolveTeamContext(request, authResult) {
|
|
|
157
158
|
{ status: 400 }
|
|
158
159
|
);
|
|
159
160
|
}
|
|
161
|
+
const team = await TeamService.getById(teamId);
|
|
162
|
+
if (!team || team.deletedAt) {
|
|
163
|
+
return NextResponse.json(
|
|
164
|
+
{ success: false, error: "Team not found", code: "TEAM_NOT_FOUND" },
|
|
165
|
+
{ status: 403 }
|
|
166
|
+
);
|
|
167
|
+
}
|
|
160
168
|
const isMember = await TeamMemberService.isMember(teamId, authResult.user.id);
|
|
161
169
|
if (!isMember) {
|
|
162
170
|
return NextResponse.json(
|
|
163
|
-
{ success: false, error: "Access denied: You are not a member of this team" },
|
|
171
|
+
{ success: false, error: "Access denied: You are not a member of this team", code: "NOT_A_MEMBER" },
|
|
164
172
|
{ status: 403 }
|
|
165
173
|
);
|
|
166
174
|
}
|
package/dist/lib/auth.d.ts
CHANGED
|
@@ -1,4 +1,30 @@
|
|
|
1
1
|
import { type UserRole } from './config';
|
|
2
|
+
/**
|
|
3
|
+
* Does this email have a pending, unexpired team invitation waiting?
|
|
4
|
+
*
|
|
5
|
+
* Used by the signup `after` hook to skip auto-creating a personal team —
|
|
6
|
+
* closes the gap where skipTeamCreation (auth-context.ts) is only set by
|
|
7
|
+
* the dedicated signup-with-invite route: a person who signs up on their
|
|
8
|
+
* own, unaware they already have a pending invitation, would otherwise
|
|
9
|
+
* still get an orphan personal team created first.
|
|
10
|
+
*
|
|
11
|
+
* No userId passed to queryOne → runs on the service (RLS-bypass) pool,
|
|
12
|
+
* same reasoning as the TEAM_NOT_FOUND check in dual-auth.ts: this has to
|
|
13
|
+
* see invitations regardless of whether anyone is "logged in" yet during
|
|
14
|
+
* signup, not a user-scoped read.
|
|
15
|
+
*/
|
|
16
|
+
export declare function hasPendingInvitationForEmail(email: string): Promise<boolean>;
|
|
17
|
+
/**
|
|
18
|
+
* Should this signup skip automatic team creation?
|
|
19
|
+
*
|
|
20
|
+
* True if either the request came through the dedicated invite-flow context
|
|
21
|
+
* (shouldSkipTeamCreation(), set by signup-with-invite), OR this email
|
|
22
|
+
* already has a pending, unexpired invitation waiting from any other signup
|
|
23
|
+
* path (hasPendingInvitationForEmail — see its own doc comment for why this
|
|
24
|
+
* second check exists). Short-circuits on the first true so a signup that's
|
|
25
|
+
* already known to be invite-flow never pays for the extra query.
|
|
26
|
+
*/
|
|
27
|
+
export declare function shouldSkipTeamCreationForUser(email: string): Promise<boolean>;
|
|
2
28
|
export declare const auth: {
|
|
3
29
|
handler: (request: Request) => Promise<Response>;
|
|
4
30
|
api: import("better-auth").InferAPI<{
|
package/dist/lib/auth.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/lib/auth.ts"],"names":[],"mappings":"AAWA,OAAO,EAAgF,KAAK,QAAQ,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/lib/auth.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/auth.js
CHANGED
|
@@ -2,7 +2,7 @@ import { betterAuth } from "better-auth";
|
|
|
2
2
|
import { Pool } from "pg";
|
|
3
3
|
import { nextCookies } from "better-auth/next-js";
|
|
4
4
|
import { emailOTP } from "better-auth/plugins";
|
|
5
|
-
import { parseSSLConfig, stripSSLParams } from "./db.js";
|
|
5
|
+
import { parseSSLConfig, stripSSLParams, queryOne } from "./db.js";
|
|
6
6
|
import { EmailFactory } from "./email/index.js";
|
|
7
7
|
import {
|
|
8
8
|
sendVerifyEmail,
|
|
@@ -17,6 +17,18 @@ import { shouldSkipTeamCreation, getSignupContext } from "./auth-context.js";
|
|
|
17
17
|
import { isDomainAllowed } from "./auth/registration-helpers.js";
|
|
18
18
|
import { registrationGuardPlugin } from "./auth/registration-guard-plugin.js";
|
|
19
19
|
import { getCorsOrigins } from "./utils/cors.js";
|
|
20
|
+
async function hasPendingInvitationForEmail(email) {
|
|
21
|
+
const row = await queryOne(
|
|
22
|
+
`SELECT id FROM "team_invitations"
|
|
23
|
+
WHERE lower(email) = lower($1) AND status = 'pending' AND "expiresAt" > now()
|
|
24
|
+
LIMIT 1`,
|
|
25
|
+
[email]
|
|
26
|
+
);
|
|
27
|
+
return !!row;
|
|
28
|
+
}
|
|
29
|
+
async function shouldSkipTeamCreationForUser(email) {
|
|
30
|
+
return shouldSkipTeamCreation() || await hasPendingInvitationForEmail(email);
|
|
31
|
+
}
|
|
20
32
|
const isProd = process.env.NODE_ENV === "production";
|
|
21
33
|
const baseUrl = process.env.BETTER_AUTH_URL || process.env.NEXT_PUBLIC_APP_URL || "http://localhost:5173";
|
|
22
34
|
const emailService = EmailFactory.create();
|
|
@@ -272,8 +284,8 @@ const auth = betterAuth({
|
|
|
272
284
|
after: async (user) => {
|
|
273
285
|
var _a, _b;
|
|
274
286
|
try {
|
|
275
|
-
if (
|
|
276
|
-
console.log(`[Teams] Skipping team creation for user ${user.id} (invite flow)`);
|
|
287
|
+
if (await shouldSkipTeamCreationForUser(user.email)) {
|
|
288
|
+
console.log(`[Teams] Skipping team creation for user ${user.id} (invite flow or pending invitation)`);
|
|
277
289
|
return;
|
|
278
290
|
}
|
|
279
291
|
const teamsMode = TEAMS_CONFIG.mode;
|
|
@@ -418,5 +430,7 @@ async function getTypedSession(headers) {
|
|
|
418
430
|
}
|
|
419
431
|
export {
|
|
420
432
|
auth,
|
|
421
|
-
getTypedSession
|
|
433
|
+
getTypedSession,
|
|
434
|
+
hasPendingInvitationForEmail,
|
|
435
|
+
shouldSkipTeamCreationForUser
|
|
422
436
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/lib/teams/types.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAQH;;;GAGG;AACH,MAAM,MAAM,YAAY,GAAG,OAAO,GAAG,OAAO,GAAG,QAAQ,GAAG,QAAQ,CAAA;AAElE;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,MAAM,QAAQ,GAAG,YAAY,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC,CAAA;AAEnD;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,IAAI,QAAQ,CAG9D;AAED;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,SAAS,MAAM,EAAE,CAIzD;AAGD,MAAM,MAAM,gBAAgB,GAAG,SAAS,GAAG,UAAU,GAAG,UAAU,GAAG,SAAS,CAAA;AAG9E,MAAM,WAAW,IAAI;IACnB,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1B,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,QAAQ,EAAE,OAAO,CAAA;IACjB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IAC7B,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/lib/teams/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
-- Migration: 023_team_invitations_pending_email_index.sql
|
|
2
|
+
-- Description: Partial functional index supporting the pending-invitation-by-email lookup added for nextspark#78 (hasPendingInvitationForEmail in lib/auth.ts)
|
|
3
|
+
-- Date: 2026-07-17
|
|
4
|
+
|
|
5
|
+
CREATE INDEX IF NOT EXISTS idx_invitations_pending_email_lower
|
|
6
|
+
ON public."team_invitations" (lower(email))
|
|
7
|
+
WHERE status = 'pending';
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
-- Migration: 024_teams_soft_delete.sql
|
|
2
|
+
-- Description: Add `deletedAt` column to teams for soft-delete support.
|
|
3
|
+
-- Date: 2026-07-18
|
|
4
|
+
--
|
|
5
|
+
-- Why this is needed:
|
|
6
|
+
-- Commit 11f62e17 ("enhance team retrieval logic to exclude soft-deleted
|
|
7
|
+
-- teams") added `t."deletedAt" IS NULL` predicates to TeamService.switchActive
|
|
8
|
+
-- (team.service.ts) and GET /api/v1/teams (templates/app/api/v1/teams/route.ts),
|
|
9
|
+
-- on the assumption that a soft-delete marker already existed on `teams`. It
|
|
10
|
+
-- never did — 007_teams_table.sql's CREATE TABLE has no such column, and no
|
|
11
|
+
-- migration since has added one. Both call sites throw a real Postgres
|
|
12
|
+
-- "column deletedAt does not exist" error against a database built purely
|
|
13
|
+
-- from this package's own migrations.
|
|
14
|
+
--
|
|
15
|
+
-- A team is never hard-deleted (TeamService.delete() does perform a real
|
|
16
|
+
-- DELETE today, but a consuming app implementing its own "delete team"
|
|
17
|
+
-- feature is expected to soft-delete instead, to preserve history) — this
|
|
18
|
+
-- column is what the two call sites above already assume is available.
|
|
19
|
+
--
|
|
20
|
+
-- 100% additive: NULL = active team (unchanged prior behavior for every
|
|
21
|
+
-- existing row).
|
|
22
|
+
|
|
23
|
+
ALTER TABLE public."teams"
|
|
24
|
+
ADD COLUMN IF NOT EXISTS "deletedAt" TIMESTAMPTZ;
|
|
25
|
+
|
|
26
|
+
COMMENT ON COLUMN public."teams"."deletedAt"
|
|
27
|
+
IS 'Soft-delete marker. NULL = team active. NOT NULL = team soft-deleted; '
|
|
28
|
+
'the row is preserved for historical/audit purposes. '
|
|
29
|
+
'TeamService.switchActive() and GET /api/v1/teams exclude non-NULL rows '
|
|
30
|
+
'from active-team resolution.';
|
|
31
|
+
|
|
32
|
+
-- Partial index for active-team lookups (deletedAt IS NULL) — keeps the two
|
|
33
|
+
-- call sites above fast without a sequential scan as `teams` grows.
|
|
34
|
+
CREATE INDEX IF NOT EXISTS idx_teams_active
|
|
35
|
+
ON public."teams" (id)
|
|
36
|
+
WHERE "deletedAt" IS NULL;
|
package/dist/styles/classes.json
CHANGED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
-- Migration: 023_team_invitations_pending_email_index.sql
|
|
2
|
+
-- Description: Partial functional index supporting the pending-invitation-by-email lookup added for nextspark#78 (hasPendingInvitationForEmail in lib/auth.ts)
|
|
3
|
+
-- Date: 2026-07-17
|
|
4
|
+
|
|
5
|
+
CREATE INDEX IF NOT EXISTS idx_invitations_pending_email_lower
|
|
6
|
+
ON public."team_invitations" (lower(email))
|
|
7
|
+
WHERE status = 'pending';
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
-- Migration: 024_teams_soft_delete.sql
|
|
2
|
+
-- Description: Add `deletedAt` column to teams for soft-delete support.
|
|
3
|
+
-- Date: 2026-07-18
|
|
4
|
+
--
|
|
5
|
+
-- Why this is needed:
|
|
6
|
+
-- Commit 11f62e17 ("enhance team retrieval logic to exclude soft-deleted
|
|
7
|
+
-- teams") added `t."deletedAt" IS NULL` predicates to TeamService.switchActive
|
|
8
|
+
-- (team.service.ts) and GET /api/v1/teams (templates/app/api/v1/teams/route.ts),
|
|
9
|
+
-- on the assumption that a soft-delete marker already existed on `teams`. It
|
|
10
|
+
-- never did — 007_teams_table.sql's CREATE TABLE has no such column, and no
|
|
11
|
+
-- migration since has added one. Both call sites throw a real Postgres
|
|
12
|
+
-- "column deletedAt does not exist" error against a database built purely
|
|
13
|
+
-- from this package's own migrations.
|
|
14
|
+
--
|
|
15
|
+
-- A team is never hard-deleted (TeamService.delete() does perform a real
|
|
16
|
+
-- DELETE today, but a consuming app implementing its own "delete team"
|
|
17
|
+
-- feature is expected to soft-delete instead, to preserve history) — this
|
|
18
|
+
-- column is what the two call sites above already assume is available.
|
|
19
|
+
--
|
|
20
|
+
-- 100% additive: NULL = active team (unchanged prior behavior for every
|
|
21
|
+
-- existing row).
|
|
22
|
+
|
|
23
|
+
ALTER TABLE public."teams"
|
|
24
|
+
ADD COLUMN IF NOT EXISTS "deletedAt" TIMESTAMPTZ;
|
|
25
|
+
|
|
26
|
+
COMMENT ON COLUMN public."teams"."deletedAt"
|
|
27
|
+
IS 'Soft-delete marker. NULL = team active. NOT NULL = team soft-deleted; '
|
|
28
|
+
'the row is preserved for historical/audit purposes. '
|
|
29
|
+
'TeamService.switchActive() and GET /api/v1/teams exclude non-NULL rows '
|
|
30
|
+
'from active-team resolution.';
|
|
31
|
+
|
|
32
|
+
-- Partial index for active-team lookups (deletedAt IS NULL) — keeps the two
|
|
33
|
+
-- call sites above fast without a sequential scan as `teams` grows.
|
|
34
|
+
CREATE INDEX IF NOT EXISTS idx_teams_active
|
|
35
|
+
ON public."teams" (id)
|
|
36
|
+
WHERE "deletedAt" IS NULL;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nextsparkjs/core",
|
|
3
|
-
"version": "0.1.0-beta.
|
|
3
|
+
"version": "0.1.0-beta.180",
|
|
4
4
|
"description": "NextSpark - The complete SaaS framework for Next.js",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "NextSpark <hello@nextspark.dev>",
|
|
@@ -470,7 +470,7 @@
|
|
|
470
470
|
"tailwind-merge": "^3.3.1",
|
|
471
471
|
"uuid": "^13.0.0",
|
|
472
472
|
"zod": "^4.1.5",
|
|
473
|
-
"@nextsparkjs/testing": "0.1.0-beta.
|
|
473
|
+
"@nextsparkjs/testing": "0.1.0-beta.180"
|
|
474
474
|
},
|
|
475
475
|
"scripts": {
|
|
476
476
|
"postinstall": "node scripts/postinstall.mjs || true",
|