aaspai-authx 0.1.1 → 0.1.3

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.
@@ -178,10 +178,14 @@ function buildSession(payload) {
178
178
  roles: normalizedRoles,
179
179
  permissions
180
180
  };
181
+ if (payload?.firstName) session.firstName = payload.firstName;
182
+ if (payload?.lastName) session.lastName = payload.lastName;
181
183
  if (payload?.projectId) session.projectId = payload.projectId;
182
184
  if (payload?.orgId) session.orgId = payload.orgId;
183
185
  if (payload?.org_id) session.org_id = payload.org_id;
184
186
  if (payload?.authType) session.authType = payload.authType;
187
+ if (payload?.createdAt) session.createdAt = payload.createdAt;
188
+ if (payload?.metadata) session.metadata = payload.metadata;
185
189
  Object.keys(payload || {}).forEach((key) => {
186
190
  if (![
187
191
  "sub",
@@ -355,10 +359,14 @@ function requireAuth() {
355
359
  const session = buildSession({
356
360
  sub: user.id.toString(),
357
361
  email: user.email,
362
+ firstName: user.firstName,
363
+ lastName: user.lastName,
364
+ metadata: user.metadata || [],
358
365
  roles: user.roles || [],
359
366
  orgId: user.orgId,
360
367
  org_id: user.orgId,
361
- projectId: user.projectId
368
+ projectId: user.projectId,
369
+ createdAt: user.createdAt
362
370
  });
363
371
  session.authType = "api-key";
364
372
  session.projectId = readProjectId(req) || user.projectId || void 0;
@@ -455,7 +463,6 @@ var Invite = import_mongoose3.default.model("Invite", InviteSchema);
455
463
  // src/services/auth-admin.service.ts
456
464
  var import_bcrypt = __toESM(require("bcrypt"), 1);
457
465
  var import_jsonwebtoken2 = __toESM(require("jsonwebtoken"), 1);
458
- var import_uuid2 = require("uuid");
459
466
 
460
467
  // src/models/client.model.ts
461
468
  var import_mongoose4 = __toESM(require("mongoose"), 1);
@@ -525,7 +532,7 @@ var AuthAdminService = class {
525
532
  async createUserInRealm(payload) {
526
533
  const hashedPassword = payload.credentials?.[0]?.value ? await import_bcrypt.default.hash(payload.credentials[0].value, 10) : void 0;
527
534
  const user = await OrgUser.create({
528
- id: (0, import_uuid2.v4)(),
535
+ id: crypto.randomUUID(),
529
536
  email: payload.email,
530
537
  firstName: payload.firstName,
531
538
  lastName: payload.lastName,
@@ -589,24 +596,61 @@ var EmailService = class {
589
596
  host: process.env.EMAIL_HOST || "smtp.postmarkapp.com",
590
597
  port: process.env.EMAIL_PORT ? Number(process.env.EMAIL_PORT) : 587,
591
598
  secure: (process.env.EMAIL_SECURE || "false") === "true",
592
- auth: { user: process.env.EMAIL_USER, pass: process.env.EMAIL_PASSWORD }
599
+ auth: {
600
+ user: process.env.EMAIL_USER,
601
+ pass: process.env.EMAIL_PASSWORD
602
+ }
593
603
  });
594
604
  }
595
605
  sign(payload, ttlSec = 60 * 60 * 24) {
596
- return import_jsonwebtoken3.default.sign(payload, process.env.EMAIL_JWT_SECRET, { expiresIn: ttlSec });
606
+ return import_jsonwebtoken3.default.sign(payload, process.env.EMAIL_JWT_SECRET, {
607
+ expiresIn: ttlSec
608
+ });
597
609
  }
598
610
  verify(token) {
599
611
  return import_jsonwebtoken3.default.verify(token, process.env.EMAIL_JWT_SECRET);
600
612
  }
601
613
  async send(to, subject, html) {
602
- await this.transporter.sendMail({
603
- from: process.env.EMAIL_FROM,
604
- to,
605
- subject,
606
- html
607
- });
614
+ console.log("[EmailService] Attempting to send:", { to, subject });
615
+ try {
616
+ const info = await this.transporter.sendMail({
617
+ from: process.env.EMAIL_FROM,
618
+ to,
619
+ subject,
620
+ html
621
+ });
622
+ console.log("[EmailService] \u2705 Email sent successfully:", {
623
+ messageId: info.messageId,
624
+ response: info.response,
625
+ accepted: info.accepted,
626
+ rejected: info.rejected
627
+ });
628
+ return info;
629
+ } catch (error) {
630
+ console.error("[EmailService] \u274C Failed to send email:", {
631
+ message: error.message,
632
+ code: error.code,
633
+ command: error.command,
634
+ responseCode: error.responseCode,
635
+ response: error.response,
636
+ stack: error.stack
637
+ });
638
+ throw error;
639
+ }
608
640
  }
609
641
  canSend(lastEmailSent) {
642
+ console.log(
643
+ process.env.EMAIL_PASSWORD,
644
+ "pssword",
645
+ process.env.EMAIL_USER,
646
+ "user",
647
+ process.env.EMAIL_SECURE,
648
+ "secure",
649
+ process.env.EMAIL_PORT,
650
+ "porat",
651
+ process.env.EMAIL_HOST,
652
+ "hosat"
653
+ );
610
654
  const now = Date.now();
611
655
  const windowStart = now - this.WINDOW_MINUTES * 60 * 1e3;
612
656
  const emailsInWindow = (lastEmailSent || []).map((d) => new Date(d)).filter((d) => d.getTime() >= windowStart);
@@ -998,7 +1042,11 @@ function createAuthRouter(options = {}) {
998
1042
  if (!isGoogleEnabled) {
999
1043
  return res.status(500).json({ error: "Google login not configured" });
1000
1044
  }
1001
- const state = req.query.redirectTo ? encodeURIComponent(String(req.query.redirectTo)) : "";
1045
+ const stateData = {
1046
+ redirectTo: req.query.redirectTo || "",
1047
+ projectId: req.query.projectId || process.env.DEFAULT_PROJECT_ID || ""
1048
+ };
1049
+ const state = encodeURIComponent(JSON.stringify(stateData));
1002
1050
  const params = new URLSearchParams({
1003
1051
  client_id: googleClientId,
1004
1052
  redirect_uri: googleRedirectUri,
@@ -1009,6 +1057,7 @@ function createAuthRouter(options = {}) {
1009
1057
  state
1010
1058
  });
1011
1059
  const url = `https://accounts.google.com/o/oauth2/v2/auth?${params.toString()}`;
1060
+ console.log(url, "url");
1012
1061
  res.redirect(url);
1013
1062
  });
1014
1063
  r.get("/google/callback", async (req, res) => {
@@ -1016,7 +1065,21 @@ function createAuthRouter(options = {}) {
1016
1065
  return res.status(500).json({ error: "Google login not configured" });
1017
1066
  }
1018
1067
  const code = String(req.query.code || "");
1019
- const state = req.query.state ? String(req.query.state) : "";
1068
+ let stateData = { redirectTo: "", projectId: "" };
1069
+ try {
1070
+ if (req.query.state) {
1071
+ stateData = JSON.parse(decodeURIComponent(String(req.query.state)));
1072
+ }
1073
+ } catch (err) {
1074
+ console.error("Failed to parse state:", err);
1075
+ }
1076
+ const { redirectTo, projectId } = stateData;
1077
+ console.log(
1078
+ "Parsed state - redirectTo:",
1079
+ redirectTo,
1080
+ "projectId:",
1081
+ projectId
1082
+ );
1020
1083
  if (!code) {
1021
1084
  return res.status(400).json({ ok: false, error: "Missing authorization code" });
1022
1085
  }
@@ -1051,13 +1114,19 @@ function createAuthRouter(options = {}) {
1051
1114
  const lastName = decoded.family_name || "";
1052
1115
  let user = await OrgUser.findOne({ email: email2 }).lean();
1053
1116
  if (!user) {
1117
+ const finalProjectId = projectId || process.env.DEFAULT_PROJECT_ID;
1118
+ if (!finalProjectId) {
1119
+ console.error("No projectId available for new user");
1120
+ const errorRedirect = (redirectTo || googleDefaultRedirect) + (redirectTo?.includes("?") ? "&" : "?") + "error=missing_project_id";
1121
+ return res.redirect(errorRedirect);
1122
+ }
1054
1123
  const created = await OrgUser.create({
1055
1124
  email: email2,
1056
1125
  firstName,
1057
1126
  lastName,
1058
1127
  emailVerified,
1059
1128
  roles: ["platform_user"],
1060
- projectId: null,
1129
+ projectId: finalProjectId,
1061
1130
  metadata: []
1062
1131
  // you can also store googleId: decoded.sub
1063
1132
  });
@@ -1065,8 +1134,14 @@ function createAuthRouter(options = {}) {
1065
1134
  }
1066
1135
  const tokens = generateTokens(user);
1067
1136
  setAuthCookies(res, tokens, cookieConfig);
1068
- const redirectTo = state ? decodeURIComponent(state) : googleDefaultRedirect;
1069
- res.redirect(redirectTo);
1137
+ if (user.projectId) {
1138
+ res.cookie(options.projectCookieName || "projectId", user.projectId, {
1139
+ ...baseProjectCookieOptionsFrom(cookieConfig),
1140
+ httpOnly: true
1141
+ });
1142
+ }
1143
+ const finalRedirect = redirectTo || googleDefaultRedirect;
1144
+ res.redirect(finalRedirect);
1070
1145
  } catch (err) {
1071
1146
  console.error("Google callback error", err);
1072
1147
  const redirectError = googleDefaultRedirect.includes("?") ? `${googleDefaultRedirect}&error=google_login_failed` : `${googleDefaultRedirect}?error=google_login_failed`;
@@ -1238,6 +1313,7 @@ async function sendRateLimitedEmail({
1238
1313
  if (!can.ok) {
1239
1314
  return { rateLimited: true, waitMs: can.waitMs };
1240
1315
  }
1316
+ console.log(can, "can");
1241
1317
  await emailService.send(user.email, subject, html);
1242
1318
  user.lastEmailSent = [...user.lastEmailSent || [], /* @__PURE__ */ new Date()];
1243
1319
  await user.save();
@@ -1251,6 +1327,11 @@ function generateTokens(user) {
1251
1327
  orgId: user.orgId || null,
1252
1328
  org_id: user.orgId || null,
1253
1329
  projectId: user.projectId || null,
1330
+ firstName: user.firstName,
1331
+ lastName: user.lastName,
1332
+ emailVerified: user.emailVerified,
1333
+ createdAt: user.createdAt,
1334
+ metadata: user.metadata,
1254
1335
  type: "user"
1255
1336
  };
1256
1337
  const accessToken = import_jsonwebtoken4.default.sign(accessPayload, process.env.JWT_SECRET, {