Skip to content

Commit 5aee414

Browse files
authored
Merge pull request #292 from kinde-oss/fix/hasuramapping
2 parents 19239d5 + 160c18d commit 5aee414

7 files changed

+100
-18
lines changed

src/session/getFlag.js

+42-6
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { sessionManager } from "./sessionManager";
2+
import { FlagDataType } from "@kinde-oss/kinde-typescript-sdk";
23
import { kindeClient } from "./kindeServerClient";
34

45
/**
@@ -18,14 +19,49 @@ import { kindeClient } from "./kindeServerClient";
1819
export const getFlagFactory =
1920
(req, res) => async (code, defaultValue, flagType) => {
2021
try {
21-
const flag = await kindeClient.getFlag(
22-
await sessionManager(req, res),
23-
code,
24-
defaultValue,
25-
flagType,
22+
const tokenFeatureFlags = await kindeClient.getClaimValue(
23+
sessionManager,
24+
"feature_flags",
25+
"access_token",
26+
);
27+
28+
const tokenHasuraFeatureFlags = await kindeClient.getClaimValue(
29+
sessionManager,
30+
"x-hasura-feature-flags",
31+
"access_token",
2632
);
2733

28-
return flag;
34+
const featureFlags = {
35+
...tokenFeatureFlags,
36+
...tokenHasuraFeatureFlags,
37+
};
38+
39+
const flag = featureFlags[code];
40+
41+
if (!flag && defaultValue === undefined) {
42+
throw new Error(
43+
`Flag ${code} was not found, and no default value has been provided`,
44+
);
45+
}
46+
47+
if (flag?.t && flagType && flagType !== flag?.t) {
48+
throw new Error(
49+
`Flag ${code} is of type ${FlagDataType[flag.t]}, expected type is ${
50+
FlagDataType[flagType]
51+
}`,
52+
);
53+
}
54+
55+
const isDefault = flag?.v === undefined;
56+
const response = {
57+
is_default: isDefault,
58+
value: flag?.v ?? defaultValue,
59+
code,
60+
type: isDefault ? FlagDataType[flag?.t ?? flagType] : false,
61+
defaultValue
62+
};
63+
64+
return response;
2965
} catch (error) {
3066
// @ts-ignore
3167
if (error.message.includes("no default value has been provided")) {

src/session/getPermission.js

+10
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,16 @@ export const getPermissionFactory = (req, res) => async (name) => {
2020
await sessionManager(req, res),
2121
name,
2222
);
23+
24+
if (!permission.isGranted) {
25+
const hasuraPermissions = await kindeClient.getClaimValue(
26+
await sessionManager(req, res),
27+
"x-hasura-permissions",
28+
);
29+
if (hasuraPermissions.includes(name)) {
30+
return { isGranted: true, orgCode: permission.orgCode };
31+
}
32+
}
2333
return permission;
2434
} catch (error) {
2535
if (config.isDebugMode) {

src/session/getPermissions.js

+17
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { sessionManager } from "./sessionManager";
22
import { kindeClient } from "./kindeServerClient";
33
import { config } from "../config/index";
4+
45
/**
56
* @callback getPermissions
67
* @returns {Promise<import('../../types').KindePermissions | null>}
@@ -17,6 +18,22 @@ export const getPermissionsFactory = (req, res) => async () => {
1718
const permissions = await kindeClient.getPermissions(
1819
await sessionManager(req, res),
1920
);
21+
22+
if (!permissions.permissions) {
23+
const hasuraPermissions = await kindeClient.getClaimValue(
24+
await sessionManager(req, res),
25+
"x-hasura-permissions",
26+
);
27+
28+
return {
29+
permissions: hasuraPermissions,
30+
orgCode: await kindeClient.getClaimValue(
31+
await sessionManager(req, res),
32+
"x-hasura-org-code",
33+
),
34+
};
35+
}
36+
2037
return permissions;
2138
} catch (error) {
2239
if (config.isDebugMode) {

src/session/getRoles.js

+10
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,16 @@ export const getRolesFactory = (req, res) => async () => {
1818
await sessionManager(req, res),
1919
"roles",
2020
);
21+
22+
if (!roles) {
23+
const hasuraRoles = await kindeClient.getClaimValue(
24+
await sessionManager(req, res),
25+
"x-hasura-roles",
26+
);
27+
28+
return hasuraRoles;
29+
}
30+
2131
return roles;
2232
} catch (error) {
2333
if (config.isDebugMode) {

src/session/getUser.ts

-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ import { NextApiRequest, NextApiResponse } from "next";
22
import { KindeAccessToken, KindeIdToken, KindeUser } from "../../types";
33
import { config } from "../config/index";
44
import { generateUserObject } from "../utils/generateUserObject";
5-
import { sessionManager } from "./sessionManager";
65
import { jwtDecoder } from "@kinde/jwt-decoder";
76
import { getAccessToken } from "../utils/getAccessToken";
87
import { getIdToken } from "../utils/getIdToken";

src/session/getUserOrganizations.ts

+6-6
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,12 @@ export const getUserOrganizationsFactory =
1010
try {
1111
const session = await sessionManager(req, res);
1212
const userOrgs = await kindeClient.getUserOrganizations(session);
13-
const orgNames = (await kindeClient.getClaimValue(
14-
session,
15-
"organizations",
16-
"id_token",
17-
)) as { id: string; name: string }[];
13+
const orgNames =
14+
((await kindeClient.getClaimValue(
15+
session,
16+
"organizations",
17+
"id_token",
18+
)) as { id: string; name: string }[]) ?? [];
1819

1920
const hasuraOrgCodes =
2021
((await kindeClient.getClaimValue(
@@ -29,7 +30,6 @@ export const getUserOrganizationsFactory =
2930
"x-hasura-organizations",
3031
"id_token",
3132
)) as { id: string; name: string }[]) ?? [];
32-
3333
return {
3434
orgCodes: [...userOrgs.orgCodes, ...hasuraOrgCodes],
3535
orgs: [...orgNames, ...hasuraOrganizations].map((org) => ({

src/utils/generateOrganizationObject.ts

+15-5
Original file line numberDiff line numberDiff line change
@@ -13,22 +13,32 @@ const getOrgProperty = (
1313
idToken: KindeIdToken,
1414
accessToken: KindeAccessToken,
1515
): string | undefined => {
16-
const idValue = idToken.organization_properties?.[`kp_org_${key}`]?.v;
17-
const accessValue = accessToken.organization_properties?.[`kp_org_${key}`]?.v;
16+
const orgIdTokenProperties =
17+
idToken.organization_properties ||
18+
idToken["x-hasura-organization_properties"] ||
19+
{};
20+
const orgAccessTokenProperties =
21+
accessToken.organization_properties ||
22+
accessToken["x-hasura-organization_properties"] ||
23+
{};
24+
const idValue = orgIdTokenProperties[`kp_org_${key}`]?.v;
25+
const accessValue = orgAccessTokenProperties[`kp_org_${key}`]?.v;
1826
return idValue || accessValue;
1927
};
2028

2129
export const generateOrganizationObject = (
2230
idToken: KindeIdToken,
2331
accessToken: KindeAccessToken,
2432
) => {
25-
if (!accessToken.org_code) {
33+
const orgCode = accessToken.org_code || accessToken["x-hasura-org-code"];
34+
const orgName = accessToken.org_name || accessToken["x-hasura-org-name"];
35+
if (!orgCode) {
2636
throw new Error("Missing required organization fields in access token");
2737
}
2838

2939
return {
30-
orgCode: accessToken.org_code,
31-
orgName: accessToken.org_name,
40+
orgCode,
41+
orgName,
3242
properties: {
3343
city: getOrgProperty("city", idToken, accessToken),
3444
industry: getOrgProperty("industry", idToken, accessToken),

0 commit comments

Comments
 (0)