@culturefy/shared 1.0.28 → 1.0.29
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/build/cjs/dto/index.js +8 -0
- package/build/cjs/dto/index.js.map +1 -1
- package/build/cjs/index.js +6 -0
- package/build/cjs/index.js.map +1 -1
- package/build/cjs/interfaces/index.js +16 -0
- package/build/cjs/interfaces/index.js.map +1 -0
- package/build/cjs/interfaces/keycloak.js +2 -0
- package/build/cjs/interfaces/keycloak.js.map +1 -0
- package/build/cjs/interfaces/user.js +2 -0
- package/build/cjs/interfaces/user.js.map +1 -0
- package/build/cjs/middlewares/index.js +10 -0
- package/build/cjs/middlewares/index.js.map +1 -0
- package/build/cjs/middlewares/token-validation.js +485 -0
- package/build/cjs/middlewares/token-validation.js.map +1 -0
- package/build/cjs/models/user.model.js +507 -0
- package/build/cjs/models/user.model.js.map +1 -0
- package/build/cjs/service/keycloak.service.js +1003 -0
- package/build/cjs/service/keycloak.service.js.map +1 -0
- package/build/cjs/service/user.service.js +95 -0
- package/build/cjs/service/user.service.js.map +1 -0
- package/build/cjs/utils/index.js +6 -0
- package/build/cjs/utils/index.js.map +1 -1
- package/build/cjs/utils/jwt.js +14 -0
- package/build/cjs/utils/jwt.js.map +1 -0
- package/build/cjs/utils/response.js +19 -0
- package/build/cjs/utils/response.js.map +1 -1
- package/build/esm/dto/index.js +1 -1
- package/build/esm/dto/index.js.map +1 -1
- package/build/esm/index.js +1 -0
- package/build/esm/index.js.map +1 -1
- package/build/esm/interfaces/index.js +3 -0
- package/build/esm/interfaces/index.js.map +1 -0
- package/build/esm/interfaces/keycloak.js +2 -0
- package/build/esm/interfaces/keycloak.js.map +1 -0
- package/build/esm/interfaces/user.js +2 -0
- package/build/esm/interfaces/user.js.map +1 -0
- package/build/esm/middlewares/index.js +2 -0
- package/build/esm/middlewares/index.js.map +1 -0
- package/build/esm/middlewares/token-validation.js +481 -0
- package/build/esm/middlewares/token-validation.js.map +1 -0
- package/build/esm/models/user.model.js +497 -0
- package/build/esm/models/user.model.js.map +1 -0
- package/build/esm/service/keycloak.service.js +996 -0
- package/build/esm/service/keycloak.service.js.map +1 -0
- package/build/esm/service/user.service.js +91 -0
- package/build/esm/service/user.service.js.map +1 -0
- package/build/esm/utils/index.js +1 -0
- package/build/esm/utils/index.js.map +1 -1
- package/build/esm/utils/jwt.js +10 -0
- package/build/esm/utils/jwt.js.map +1 -0
- package/build/esm/utils/response.js +18 -0
- package/build/esm/utils/response.js.map +1 -1
- package/build/package.json +13 -2
- package/build/src/dto/index.d.ts +1 -0
- package/build/src/dto/index.js +3 -0
- package/build/src/dto/index.js.map +1 -1
- package/build/src/index.d.ts +1 -0
- package/build/src/index.js +1 -0
- package/build/src/index.js.map +1 -1
- package/build/src/interfaces/index.d.ts +2 -0
- package/build/src/interfaces/index.js +6 -0
- package/build/src/interfaces/index.js.map +1 -0
- package/build/src/interfaces/keycloak.d.ts +151 -0
- package/build/src/interfaces/keycloak.js +3 -0
- package/build/src/interfaces/keycloak.js.map +1 -0
- package/build/src/interfaces/user.d.ts +5 -0
- package/build/src/interfaces/user.js +3 -0
- package/build/src/interfaces/user.js.map +1 -0
- package/build/src/middlewares/index.d.ts +1 -0
- package/build/src/middlewares/index.js +5 -0
- package/build/src/middlewares/index.js.map +1 -0
- package/build/src/middlewares/token-validation.d.ts +17 -0
- package/build/src/middlewares/token-validation.js +329 -0
- package/build/src/middlewares/token-validation.js.map +1 -0
- package/build/src/models/user.model.d.ts +193 -0
- package/build/src/models/user.model.js +401 -0
- package/build/src/models/user.model.js.map +1 -0
- package/build/src/service/keycloak.service.d.ts +88 -0
- package/build/src/service/keycloak.service.js +1059 -0
- package/build/src/service/keycloak.service.js.map +1 -0
- package/build/src/service/user.service.d.ts +11 -0
- package/build/src/service/user.service.js +118 -0
- package/build/src/service/user.service.js.map +1 -0
- package/build/src/utils/index.d.ts +1 -0
- package/build/src/utils/index.js +1 -0
- package/build/src/utils/index.js.map +1 -1
- package/build/src/utils/jwt.d.ts +1 -0
- package/build/src/utils/jwt.js +14 -0
- package/build/src/utils/jwt.js.map +1 -0
- package/build/src/utils/response.d.ts +1 -0
- package/build/src/utils/response.js +19 -0
- package/build/src/utils/response.js.map +1 -1
- package/package.json +13 -2
- package/src/dto/index.ts +1 -0
- package/src/index.ts +2 -1
- package/src/interfaces/index.ts +2 -0
- package/src/interfaces/keycloak.ts +161 -0
- package/src/interfaces/user.ts +5 -0
- package/src/middlewares/index.ts +1 -0
- package/src/middlewares/token-validation.ts +456 -0
- package/src/models/user.model.ts +488 -0
- package/src/service/keycloak.service.ts +1104 -0
- package/src/service/user.service.ts +99 -0
- package/src/utils/index.ts +2 -1
- package/src/utils/jwt.ts +10 -0
- package/src/utils/response.ts +19 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keycloak.service.js","names":["_axios","_interopRequireDefault","require","e","__esModule","default","KeycloakAdminService","constructor","context","config","baseUrl","adminClientId","adminClientSecret","axiosInstance","accessToken","error","Error","axios","create","baseURL","authenticate","params","URLSearchParams","append","log","JSON","stringify","response","post","headers","status","data","access_token","defaults","common","authenticateRelmClient","realm","clientId","clientUUID","getClientUUID","clientSecret","getClientSecret","createRealm","_realm$enabled","id","displayName","enabled","sslRequired","bruteForceProtected","eventsEnabled","createClient","client","_client$publicClient","_client$directAccessG","_client$standardFlowE","_client$implicitFlowE","_client$serviceAccoun","_client$authorization","_client$bearerOnly","_client$consentRequir","_client$fullScopeAllo","name","description","protocol","publicClient","secret","directAccessGrantsEnabled","standardFlowEnabled","implicitFlowEnabled","serviceAccountsEnabled","authorizationServicesEnabled","redirectUris","webOrigins","bearerOnly","consentRequired","fullScopeAllowed","attributes","tls_client_certificate_bound_access_tokens","client_credentials_use_refresh_token","getClient","get","find","c","getServiceAccountUserId","getAllRoles","getAssignedRoles","userId","assignRolesToServiceAccount","roles","roleMappings","map","role","composite","clientRole","containerId","assignAllRealmMgmtRolesToClient","realmMgmtUUID","serviceUserId","allRoles","assignedRoles","assignedNames","Set","r","unassignedRoles","filter","has","length","assignAllAccountMgmtRolesToClient","accountMgmtUUID","assignAllBrokerMgmtRolesToClient","brokerMgmtUUID","value","createUser","user","username","email","firstName","lastName","emailVerified","credentials","type","password","temporary","requiredActions","realmRoles","groups","federationLink","totp","disableableCredentialTypes","notBefore","access","manage","listUsers","getUser","getUserByUsername","getUserByEmail","login","loginIdentifier","error_description","resetPassword","put","_error$response","_error$response2","logout","refreshToken","warn","_error$response3","_error$response4","_error$response5","_error$response6","_error$response7","_error$response8","_error$response9","_error$response10","_error$response11","_error$response12","_error$response13","_error$response0","_error$response1","_error$response14","introspectToken","token","auth","active","_error$response15","_error$response16","_error$response17","_error$response18","_error$response19","getUserByToken","userInfo","userResponse","sub","user_id","preferred_username","given_name","first_name","family_name","last_name","email_verified","createdTimestamp","iat","userinfoError","decoded","decodeJwtToken","adminApiError","jwtError","_error$response20","_error$response21","_error$response22","_error$response23","_error$response24","parts","split","payload","decodedPayload","Buffer","from","toString","parse","exports"],"sources":["../../../src/service/keycloak.service.ts"],"sourcesContent":["// keycloak-admin.service.ts\nimport axios, { AxiosInstance } from 'axios';\nimport { InvocationContext } from '@azure/functions';\nimport {\n CreateClientDto, CreateRealmDto, CreateUserDto,\n KeycloakClientLoginResponse, KeycloakClientResponse, KeycloakClientSecretResponse,\n KeycloakIntrospectTokenResponse, KeycloakRoleResponse, KeycloakUserLoginDto,\n KeycloakUserLoginResponse, KeycloakUserResponse\n} from '../interfaces';\n\nexport class KeycloakAdminService {\n\n private context: InvocationContext;\n\n private baseUrl: string;\n private adminClientId: string;\n private adminClientSecret: string;\n private axiosInstance: AxiosInstance;\n private accessToken: string | null = null;\n\n constructor(context: InvocationContext, config: {\n baseUrl: string;\n adminClientId: string;\n adminClientSecret: string;\n }) {\n this.context = context;\n\n if (!config.baseUrl || !config.adminClientId || !config.adminClientSecret) {\n this.context.error(\"Missing required configuration\");\n throw new Error('Missing required configuration');\n }\n\n\n this.baseUrl = config.baseUrl;\n this.adminClientId = config.adminClientId;\n this.adminClientSecret = config.adminClientSecret;\n\n try {\n this.axiosInstance = axios.create({\n baseURL: this.baseUrl,\n });\n } catch (error) {\n this.context.error(\"Error in createAxiosInstance\", error);\n throw error;\n }\n }\n\n async authenticate(): Promise<KeycloakClientLoginResponse> {\n try {\n const params = new URLSearchParams();\n params.append('grant_type', 'client_credentials');\n params.append('client_id', this.adminClientId);\n params.append('client_secret', this.adminClientSecret);\n\n this.context.log(`Params: ${JSON.stringify(params)}`);\n\n const response = await this.axiosInstance.post('/realms/master/protocol/openid-connect/token', params, {\n headers: { 'Content-Type': 'application/x-www-form-urlencoded' },\n });\n if (response.status !== 200) {\n throw new Error(`Failed to authenticate: ${JSON.stringify(response.data)}`);\n }\n // this.context.log(`Response: ${JSON.stringify(response.data)}`);\n\n const data: KeycloakClientLoginResponse = response.data;\n\n this.accessToken = data.access_token;\n this.axiosInstance.defaults.headers.common['Authorization'] = `Bearer ${this.accessToken}`;\n\n return data;\n } catch (error) {\n this.context.error(\"Error in authenticate\", error);\n throw error;\n }\n }\n\n async authenticateRelmClient(realm: string, clientId: string): Promise<KeycloakClientLoginResponse> {\n try {\n\n const clientUUID = await this.getClientUUID(realm, clientId);\n if (!clientUUID) {\n throw new Error(`Client UUID for \"${clientId}\" not found`);\n }\n\n const clientSecret = await this.getClientSecret(realm, clientId);\n if (!clientSecret) {\n throw new Error(`Client secret for \"${clientId}\" not found`);\n }\n\n const params = new URLSearchParams();\n params.append('grant_type', 'client_credentials');\n params.append('client_id', clientId);\n params.append('client_secret', clientSecret);\n\n const response = await this.axiosInstance.post(`/realms/${realm}/protocol/openid-connect/token`, params, {\n headers: { 'Content-Type': 'application/x-www-form-urlencoded' },\n });\n if (response.status !== 200) {\n throw new Error(`Failed to authenticate realm client: ${JSON.stringify(response.data)}`);\n }\n // this.context.log(`Response: ${JSON.stringify(response.data)}`);\n\n const data: KeycloakClientLoginResponse = response.data;\n\n this.accessToken = data.access_token;\n this.axiosInstance.defaults.headers.common['Authorization'] = `Bearer ${this.accessToken}`;\n return data;\n } catch (error) {\n this.context.error(\"Error in authenticateRelmClient\", error);\n throw error;\n }\n }\n\n async createRealm(realm: CreateRealmDto): Promise<void> {\n try {\n this.context.log(`Realm: ${JSON.stringify(realm)}`);\n\n await this.authenticate();\n this.context.log(`Authenticated`, JSON.stringify(this.accessToken));\n\n\n const response = await this.axiosInstance.post('/admin/realms', {\n realm: realm.realm,\n id: realm.realm,\n displayName: realm.displayName || realm.realm,\n enabled: realm.enabled ?? true,\n sslRequired: 'external',\n bruteForceProtected: true,\n eventsEnabled: false,\n });\n if (response.status !== 201) {\n throw new Error(`Failed to create realm: ${JSON.stringify(response.data)}`);\n }\n this.context.log(`Response: Successfully created realm`);\n return;\n } catch (error) {\n this.context.error(\"Error in createRealm\", error);\n throw error;\n }\n }\n\n async createClient(realm: string, client: CreateClientDto): Promise<void> {\n try {\n this.context.log(`Realm name: ${realm}`);\n this.context.log(`Creating client: ${JSON.stringify(client)}`);\n\n await this.authenticate();\n this.context.log(`Authenticated`, JSON.stringify(this.accessToken));\n\n const response = await this.axiosInstance.post(`/admin/realms/${realm}/clients`, {\n clientId: client.clientId,\n name: client.name,\n description: client.description,\n enabled: client.enabled,\n protocol: client.protocol || 'openid-connect',\n publicClient: client.publicClient ?? false,\n secret: client.secret || null,\n directAccessGrantsEnabled: client.directAccessGrantsEnabled ?? true,\n standardFlowEnabled: client.standardFlowEnabled ?? true,\n implicitFlowEnabled: client.implicitFlowEnabled ?? false,\n serviceAccountsEnabled: client.serviceAccountsEnabled ?? true,\n authorizationServicesEnabled: client.authorizationServicesEnabled ?? true,\n redirectUris: client.redirectUris || [],\n webOrigins: client.webOrigins || [],\n bearerOnly: client.bearerOnly ?? false,\n consentRequired: client.consentRequired ?? false,\n fullScopeAllowed: client.fullScopeAllowed ?? true,\n attributes: client.attributes || {\n tls_client_certificate_bound_access_tokens: \"false\",\n client_credentials_use_refresh_token: \"true\"\n }\n });\n if (response.status !== 201) {\n throw new Error(`Failed to create client: ${JSON.stringify(response.data)}`);\n }\n\n this.context.log(`Response: ${JSON.stringify(response.data)}`);\n return;\n } catch (error) {\n this.context.error(\"Error in createClient\", error);\n throw error;\n }\n }\n\n async getClient(realm: string, clientId: string, clientUUID: string): Promise<KeycloakClientResponse> {\n try {\n this.context.log(`Realm: ${realm}`);\n this.context.log(`Client ID: ${clientId}`);\n\n await this.authenticateRelmClient(realm, clientId);\n this.context.log(`Authenticated`, JSON.stringify(this.accessToken));\n\n const response = await this.axiosInstance.get(`/admin/realms/${realm}/clients/${clientUUID}`);\n if (response.status !== 200) {\n throw new Error(`Failed to get client: ${JSON.stringify(response.data)}`);\n }\n this.context.log(`(getClient) Client: ${JSON.stringify(response.data)}`);\n const data: KeycloakClientResponse = response.data;\n return data;\n } catch (error) {\n this.context.error(\"Error in getClient\", error);\n throw error;\n }\n }\n\n async getClientUUID(realm: string, clientId: string): Promise<string> {\n try {\n this.context.log(`Realm: ${realm}`);\n this.context.log(`Client ID: ${clientId}`);\n\n await this.authenticate();\n // this.context.log(`Authenticated`, JSON.stringify(this.accessToken));\n\n const response = await this.axiosInstance.get(`/admin/realms/${realm}/clients`, {\n params: { clientId },\n });\n if (response.status !== 200) {\n throw new Error(`Failed to get clients: ${JSON.stringify(response.data)}`);\n }\n this.context.log(`Clients: ${JSON.stringify(response.data)}`);\n\n const data: KeycloakClientResponse[] = response.data;\n\n const client = data.find((c: KeycloakClientResponse) => c.clientId == clientId);\n this.context.log(`(getClientUUID) Client: ${JSON.stringify(client)}`);\n if (!client) {\n throw new Error(`Client \"${clientId}\" not found`);\n }\n return client.id;\n } catch (error) {\n this.context.error(\"Error in getClientUUID\", error);\n throw error;\n }\n }\n\n async getServiceAccountUserId(realm: string, clientUUID: string): Promise<string> {\n try {\n await this.authenticate();\n this.context.log(`Authenticated`, JSON.stringify(this.accessToken));\n\n const response = await this.axiosInstance.get(`/admin/realms/${realm}/clients/${clientUUID}/service-account-user`);\n if (response.status !== 200) {\n throw new Error(`Failed to get service account user: ${JSON.stringify(response.data)}`);\n }\n this.context.log(`Service account user: ${JSON.stringify(response.data)}`);\n return response.data.id;\n } catch (error) {\n this.context.error(\"Error in getServiceAccountUserId\", error);\n throw error;\n }\n }\n\n async getAllRoles(realm: string, clientUUID: string): Promise<KeycloakRoleResponse[]> {\n try {\n await this.authenticate();\n this.context.log(`Authenticated`, JSON.stringify(this.accessToken));\n\n const response = await this.axiosInstance.get(`/admin/realms/${realm}/clients/${clientUUID}/roles`);\n if (response.status !== 200) {\n throw new Error(`Failed to get all roles: ${JSON.stringify(response.data)}`);\n }\n this.context.log(`All roles: ${JSON.stringify(response.data)}`);\n const data: KeycloakRoleResponse[] = response.data;\n return data;\n } catch (error) {\n this.context.error(\"Error in getAllRoles\", error);\n throw error;\n }\n }\n\n async getAssignedRoles(realm: string, userId: string, clientUUID: string): Promise<KeycloakRoleResponse[]> {\n try {\n await this.authenticate();\n this.context.log(`Authenticated`, JSON.stringify(this.accessToken));\n\n const response = await this.axiosInstance.get(`/admin/realms/${realm}/users/${userId}/role-mappings/clients/${clientUUID}`);\n if (response.status !== 200) {\n throw new Error(`Failed to get assigned roles: ${JSON.stringify(response.data)}`);\n }\n this.context.log(`Assigned roles: ${JSON.stringify(response.data)}`);\n const data: KeycloakRoleResponse[] = response.data;\n return data;\n } catch (error) {\n this.context.error(\"Error in getAssignedRoles\", error);\n throw error;\n }\n }\n\n async assignRolesToServiceAccount(realm: string, userId: string, clientUUID: string, roles: KeycloakRoleResponse[]): Promise<void> {\n try {\n await this.authenticate();\n this.context.log(`Authenticated`, JSON.stringify(this.accessToken));\n\n // According to Keycloak REST API documentation, we need to send role objects, not just IDs\n const roleMappings = roles.map((role) => ({\n id: role.id,\n name: role.name,\n description: role.description,\n composite: role.composite,\n clientRole: role.clientRole,\n containerId: role.containerId\n }));\n\n const response = await this.axiosInstance.post(`/admin/realms/${realm}/users/${userId}/role-mappings/clients/${clientUUID}`, roleMappings);\n if (response.status !== 204) {\n throw new Error(`Failed to assign roles to service account: ${JSON.stringify(response.data)}`);\n }\n this.context.log(`Response: ${JSON.stringify(response.data)}`);\n return;\n } catch (error) {\n this.context.error(\"Error in assignRolesToServiceAccount\", error);\n throw error;\n }\n }\n\n async assignAllRealmMgmtRolesToClient(realm: string, clientId: string): Promise<void> {\n try {\n this.context.log(`🔍 Getting UUID for clientId = ${clientId}`);\n const clientUUID = await this.getClientUUID(realm, clientId);\n\n this.context.log(`🔍 Getting UUID for realm-management`);\n const realmMgmtUUID = await this.getClientUUID(realm, \"realm-management\");\n\n this.context.log(`🔍 Getting service account user for ${clientId}`);\n const serviceUserId = await this.getServiceAccountUserId(realm, clientUUID);\n\n this.context.log(`🔍 Fetching all roles from realm-management`);\n const allRoles = await this.getAllRoles(realm, realmMgmtUUID);\n\n this.context.log(`🔍 Fetching already assigned roles`);\n const assignedRoles = await this.getAssignedRoles(realm, serviceUserId, realmMgmtUUID);\n const assignedNames = new Set(assignedRoles.map(r => r.name));\n\n const unassignedRoles = allRoles.filter(r => !assignedNames.has(r.name));\n this.context.log(`✅ Found ${unassignedRoles.length} unassigned roles`);\n\n if (unassignedRoles.length) {\n this.context.log(`🚀 Assigning roles to service account`);\n await this.assignRolesToServiceAccount(realm, serviceUserId, realmMgmtUUID, unassignedRoles);\n this.context.log(\"✅ Roles successfully assigned!\");\n } else {\n this.context.log(\"ℹ️ All roles are already assigned.\");\n }\n } catch (error) {\n this.context.error(\"Error in assignAllRealmMgmtRolesToClient\", error);\n throw error;\n }\n }\n\n async assignAllAccountMgmtRolesToClient(realm: string, clientId: string): Promise<void> {\n try {\n this.context.log(`🔍 Getting UUID for clientId = ${clientId}`);\n const clientUUID = await this.getClientUUID(realm, clientId);\n\n this.context.log(`🔍 Getting UUID for account`);\n const accountMgmtUUID = await this.getClientUUID(realm, \"account\");\n\n this.context.log(`🔍 Getting service account user for ${clientId}`);\n const serviceUserId = await this.getServiceAccountUserId(realm, clientUUID);\n\n this.context.log(`🔍 Fetching all roles from account`);\n const allRoles = await this.getAllRoles(realm, accountMgmtUUID);\n\n this.context.log(`🔍 Fetching already assigned roles`);\n const assignedRoles = await this.getAssignedRoles(realm, serviceUserId, accountMgmtUUID);\n const assignedNames = new Set(assignedRoles.map(r => r.name));\n\n const unassignedRoles = allRoles.filter(r => !assignedNames.has(r.name));\n this.context.log(`✅ Found ${unassignedRoles.length} unassigned roles`);\n\n if (unassignedRoles.length) {\n this.context.log(`🚀 Assigning roles to service account`);\n await this.assignRolesToServiceAccount(realm, serviceUserId, accountMgmtUUID, unassignedRoles);\n this.context.log(\"✅ Roles successfully assigned!\");\n } else {\n this.context.log(\"ℹ️ All roles are already assigned.\");\n }\n } catch (error) {\n this.context.error(\"Error in assignAllAccountMgmtRolesToClient\", error);\n throw error;\n }\n }\n\n async assignAllBrokerMgmtRolesToClient(realm: string, clientId: string): Promise<void> {\n try {\n this.context.log(`🔍 Getting UUID for clientId = ${clientId}`);\n const clientUUID = await this.getClientUUID(realm, clientId);\n\n this.context.log(`🔍 Getting UUID for broker`);\n const brokerMgmtUUID = await this.getClientUUID(realm, \"broker\");\n\n this.context.log(`🔍 Getting service broker user for ${clientId}`);\n const serviceUserId = await this.getServiceAccountUserId(realm, clientUUID);\n\n this.context.log(`🔍 Fetching all roles from broker`);\n const allRoles = await this.getAllRoles(realm, brokerMgmtUUID);\n\n this.context.log(`🔍 Fetching already assigned roles`);\n const assignedRoles = await this.getAssignedRoles(realm, serviceUserId, brokerMgmtUUID);\n const assignedNames = new Set(assignedRoles.map(r => r.name));\n\n const unassignedRoles = allRoles.filter(r => !assignedNames.has(r.name));\n this.context.log(`✅ Found ${unassignedRoles.length} unassigned roles`);\n\n if (unassignedRoles.length) {\n this.context.log(`🚀 Assigning roles to service account`);\n await this.assignRolesToServiceAccount(realm, serviceUserId, brokerMgmtUUID, unassignedRoles);\n this.context.log(\"✅ Roles successfully assigned!\");\n } else {\n this.context.log(\"ℹ️ All roles are already assigned.\");\n }\n } catch (error) {\n this.context.error(\"Error in assignAllBrokerMgmtRolesToClient\", error);\n throw error;\n }\n }\n\n async getClientSecret(realm: string, clientId: string): Promise<string> {\n try {\n this.context.log(`Realm: ${realm}`);\n this.context.log(`Client ID: ${clientId}`);\n\n await this.authenticate();\n // this.context.log(`Authenticated`, JSON.stringify(this.accessToken));\n\n const clientUUID = await this.getClientUUID(realm, clientId);\n if (!clientUUID) {\n throw new Error(`Failed to get UUID for client \"${clientId}\"`);\n }\n this.context.log(`Client UUID: ${clientUUID}`);\n\n const response = await this.axiosInstance.get(\n `/admin/realms/${realm}/clients/${clientUUID}/client-secret`\n );\n if (response.status !== 200) {\n throw new Error(`Failed to get client secret: ${JSON.stringify(response.data)}`);\n }\n this.context.log(`Client secret: ${JSON.stringify(response.data)}`);\n\n const data: KeycloakClientSecretResponse = response.data;\n return data.value;\n } catch (error) {\n this.context.error(\"Error in getClientSecret\", error);\n throw error;\n }\n }\n\n async createUser(realm: string, clientId: string, user: CreateUserDto): Promise<void> {\n try {\n this.context.log(`Realm name: ${realm}`);\n this.context.log(`Client ID: ${clientId}`);\n this.context.log(`User: ${JSON.stringify(user)}`);\n\n await this.authenticateRelmClient(realm, clientId);\n this.context.log(`Authenticated`, JSON.stringify(this.accessToken));\n\n const response = await this.axiosInstance.post(`/admin/realms/${realm}/users`, {\n username: user.username,\n email: user.email,\n firstName: user.firstName,\n lastName: user.lastName,\n enabled: true,\n emailVerified: true,\n credentials: [\n {\n type: \"password\",\n value: user.password,\n temporary: true // true if user must reset on first login\n }\n ],\n requiredActions: [\n // Options: \"VERIFY_EMAIL\", \"UPDATE_PROFILE\", \"UPDATE_PASSWORD\", \"CONFIGURE_TOTP\"\n \"UPDATE_PASSWORD\"\n ],\n realmRoles: [\n // Optional: assign realm-level roles\n \"offline_access\",\n \"uma_authorization\"\n ],\n groups: [\n // Optional: assign to realm groups\n // \"/devs\",\n // \"/admins\"\n ],\n federationLink: null, // for federated identity provider\n totp: false, // TOTP is not configured initially\n disableableCredentialTypes: [],\n // Optional advanced fields\n notBefore: 0,\n access: {\n manage: true\n }\n });\n if (response.status !== 201) {\n throw new Error(`Failed to create user: ${JSON.stringify(response.data)}`);\n }\n this.context.log(`Response: ${JSON.stringify(response.data)}`);\n return;\n } catch (error) {\n this.context.error(\"Error in createUser\", error);\n throw error;\n }\n }\n\n async listUsers(realm: string): Promise<KeycloakUserResponse[]> {\n try {\n await this.authenticate();\n this.context.log(`Authenticated`, JSON.stringify(this.accessToken));\n\n const response = await this.axiosInstance.get(`/admin/realms/${realm}/users`);\n if (response.status !== 200) {\n throw new Error(`Failed to list users: ${JSON.stringify(response.data)}`);\n }\n this.context.log(`Users: ${JSON.stringify(response.data)}`);\n const data: KeycloakUserResponse[] = response.data;\n return data;\n } catch (error) {\n this.context.error(\"Error in listUsers\", error);\n throw error;\n }\n }\n\n async getUser(realm: string, userId: string): Promise<KeycloakUserResponse> {\n try {\n await this.authenticate();\n this.context.log(`Authenticated`, JSON.stringify(this.accessToken));\n\n const response = await this.axiosInstance.get(`/admin/realms/${realm}/users/${userId}`);\n if (response.status !== 200) {\n throw new Error(`Failed to get user: ${JSON.stringify(response.data)}`);\n }\n this.context.log(`User: ${JSON.stringify(response.data)}`);\n const data: KeycloakUserResponse = response.data;\n return data;\n } catch (error) {\n this.context.error(\"Error in getUser\", error);\n throw error;\n }\n }\n\n async getUserByUsername(realm: string, username: string): Promise<KeycloakUserResponse> {\n try {\n await this.authenticate();\n this.context.log(`Authenticated`, JSON.stringify(this.accessToken));\n\n const response = await this.axiosInstance.get(`/admin/realms/${realm}/users`, {\n params: { username },\n });\n if (response.status !== 200) {\n throw new Error(`Failed to get user by username: ${JSON.stringify(response.data)}`);\n }\n this.context.log(`User: ${JSON.stringify(response.data)}`);\n if (response.data.length === 0) {\n throw new Error(`User \"${username}\" not found`);\n }\n const data: KeycloakUserResponse = response.data[0];\n return data;\n } catch (error) {\n this.context.error(\"Error in getUserByUsername\", error);\n throw error;\n }\n }\n\n async getUserByEmail(realm: string, email: string): Promise<KeycloakUserResponse> {\n try {\n await this.authenticate();\n this.context.log(`Authenticated`, JSON.stringify(this.accessToken));\n\n const response = await this.axiosInstance.get(`/admin/realms/${realm}/users`, {\n params: { email },\n });\n if (response.status !== 200) {\n throw new Error(`Failed to get user by email: ${JSON.stringify(response.data)}`);\n }\n this.context.log(`User: ${JSON.stringify(response.data)}`);\n if (response.data.length === 0) {\n throw new Error(`User \"${email}\" not found`);\n }\n const data: KeycloakUserResponse = response.data[0];\n return data;\n } catch (error) {\n this.context.error(\"Error in getUserByEmail\", error);\n throw error;\n }\n }\n\n async login(realm: string, clientId: string, user: KeycloakUserLoginDto): Promise<KeycloakUserLoginResponse> {\n try {\n this.context.log(`Realm name: ${realm}`);\n this.context.log(`Client ID: ${clientId}`);\n this.context.log(`User: ${JSON.stringify(user)}`);\n\n await this.authenticateRelmClient(realm, clientId);\n this.context.log(`Authenticated`, JSON.stringify(this.accessToken));\n\n const clientSecret = await this.getClientSecret(realm, clientId);\n if (!clientSecret) {\n throw new Error(`Client secret for \"${clientId}\" not found`);\n }\n\n const loginIdentifier = user.username || user.email;\n\n const params = new URLSearchParams();\n\n params.append('grant_type', 'password');\n params.append('username', loginIdentifier);\n params.append('password', user.password);\n params.append('client_id', clientId);\n params.append('client_secret', clientSecret);\n\n this.context.log(`Params: ${JSON.stringify(params)}`);\n\n const response = await this.axiosInstance.post(`/realms/${realm}/protocol/openid-connect/token`, params, {\n headers: { 'Content-Type': 'application/x-www-form-urlencoded' },\n });\n if (response.status !== 200) {\n this.context.error(`Response: ${JSON.stringify(response.data)}`);\n if (response.data.error === 'invalid_grant') {\n if (response.data.error_description === 'Account is not fully set up') {\n throw new Error(`Please reset your password`);\n }\n if (response.data.error_description === 'Invalid user credentials') {\n throw new Error(`Invalid username or password`);\n }\n } else if (response.data.error === 'invalid_token') {\n throw new Error(`Invalid token`);\n } else if (response.data.error === 'invalid_client') {\n throw new Error(`Invalid client`);\n } else if (response.data.error === 'invalid_request') {\n throw new Error(`Invalid request`);\n }\n throw new Error(`Failed to login user using keycloak`);\n }\n this.context.log(`Response: ${JSON.stringify(response.data)}`);\n const data: KeycloakUserLoginResponse = response.data;\n return data;\n } catch (error: any) {\n this.context.error(\"Error in login\", error);\n if (error?.response.data.error === 'invalid_grant') {\n if (error?.response.data.error_description === 'Account is not fully set up') {\n throw new Error(`Please reset your password`);\n }\n if (error?.response.data.error_description === 'Invalid user credentials') {\n throw new Error(`Invalid username or password`);\n }\n } else if (error?.response.data.error === 'invalid_token') {\n throw new Error(`Invalid token`);\n } else if (error?.response.data.error === 'invalid_client') {\n throw new Error(`Invalid client`);\n } else if (error?.response.data.error === 'invalid_request') {\n throw new Error(`Invalid request`);\n }\n throw new Error(`Failed to login user using keycloak`);\n }\n }\n\n async resetPassword(realm: string, userId: string, password: string): Promise<void> {\n try {\n await this.authenticate();\n this.context.log(`Authenticated`, JSON.stringify(this.accessToken));\n\n const response = await this.axiosInstance.put(`/admin/realms/${realm}/users/${userId}/reset-password`, {\n type: \"password\",\n value: password,\n temporary: false\n });\n if (response.status !== 204) {\n throw new Error(`Failed to reset password: ${JSON.stringify(response.data)}`);\n }\n return;\n } catch (error: any) {\n this.context.error(\"Error in resetPassword\", error);\n if (error?.response?.data?.error_description) {\n throw new Error(error?.response?.data?.error_description);\n }\n if (error?.response.data.error === 'invalid_grant') {\n throw new Error(`Invalid grant`);\n } else if (error?.response.data.error === 'invalid_token') {\n throw new Error(`Invalid token`);\n } else if (error?.response.data.error === 'invalid_client') {\n throw new Error(`Invalid client`);\n } else if (error?.response.data.error === 'invalid_request') {\n throw new Error(`Invalid request`);\n }\n throw error;\n }\n }\n\n /**\n * Logout culturefy and revoke refresh token\n * This method uses Keycloak's standard OpenID Connect logout endpoint\n * which both logs out the culturefy and invalidates the refresh token\n * \n * @param realm - The Keycloak realm name \n * @param clientId - The client ID\n * @param refreshToken - The refresh token to revoke\n * @returns Promise<void>\n */\n async logout(realm: string, clientId: string, refreshToken: string): Promise<void> {\n try {\n this.context.log(`Culturefy Logout - Realm: ${realm}, Client: ${clientId}`);\n this.context.log(`Culturefy Logout - Refresh Token: ${refreshToken}`);\n\n await this.authenticateRelmClient(realm, clientId);\n // this.context.log(`Authenticated`, JSON.stringify(this.accessToken));\n\n // Try to get client secret, but handle the case where it might not exist\n let clientSecret: string | null = null;\n try {\n clientSecret = await this.getClientSecret(realm, clientId);\n } catch (error) {\n this.context.warn(`Could not retrieve client secret for ${clientId}:`, error);\n // For admin-cli, we might not need a client secret\n clientSecret = null;\n }\n\n const params = new URLSearchParams();\n params.append('refresh_token', refreshToken || '');\n params.append('client_id', clientId || '');\n \n // Only add client_secret if it exists\n if (clientSecret) {\n params.append('client_secret', clientSecret || '');\n }\n\n this.context.log(`Culturefy Logout Params: ${JSON.stringify(params)}`);\n\n const response = await this.axiosInstance.post(`/realms/${realm}/protocol/openid-connect/logout`, params, {\n headers: { 'Content-Type': 'application/x-www-form-urlencoded' },\n });\n \n if (response.status !== 200) {\n this.context.error(`Culturefy Logout Response: ${JSON.stringify(response.data)}`);\n \n // Handle specific error cases\n if (response.data.error === 'invalid_grant') {\n throw new Error(`Invalid refresh token`);\n } else if (response.data.error === 'invalid_token') {\n throw new Error(`Invalid token`);\n } else if (response.data.error === 'invalid_client') {\n throw new Error(`Invalid client configuration - admin-cli client may not be properly configured`);\n } else if (response.data.error === 'invalid_request') {\n throw new Error(`Invalid request`);\n }\n throw new Error(`Failed to logout culturefy - check admin-cli client configuration`);\n }\n \n this.context.log(`Culturefy Logout Response: ${JSON.stringify(response.data)}`);\n return;\n\n } catch (error: any) {\n this.context.error(\"Error in logoutCulturefy\", error);\n \n // Handle specific error cases\n if (error?.response?.data?.error === 'invalid_grant') {\n throw new Error(`Invalid refresh token`);\n } else if (error?.response?.data?.error === 'invalid_token') {\n throw new Error(`Invalid token`);\n } else if (error?.response?.data?.error === 'invalid_client') {\n throw new Error(`Invalid client configuration - admin-cli client may not be properly configured`);\n } else if (error?.response?.data?.error === 'invalid_request') {\n throw new Error(`Invalid request`);\n }\n \n if (error?.response?.data?.error_description) {\n throw new Error(error?.response?.data?.error_description);\n }\n \n throw new Error(`Failed to logout culturefy - check admin-cli client configuration`);\n }\n }\n\n /**\n * Refresh culturefy access token using refresh token\n * This method uses Keycloak's standard OpenID Connect token endpoint\n * to refresh the access token for culturefy users\n * \n * @param realm - The Keycloak realm name\n * @param clientId - The client ID\n * @param refreshToken - The refresh token to use for getting new access token\n * @returns Promise<KeycloakUserLoginResponse> - New access and refresh tokens\n */\n async refreshToken(realm: string, clientId: string, refreshToken: string): Promise<KeycloakUserLoginResponse> {\n try {\n this.context.log(`Culturefy Token Refresh - Realm: ${realm}, Client: ${clientId}`);\n\n await this.authenticate();\n // this.context.log(`Authenticated`, JSON.stringify(this.accessToken));\n\n // Try to get client secret, but handle the case where it might not exist\n let clientSecret: string | null = null;\n try {\n clientSecret = await this.getClientSecret(realm, clientId);\n } catch (error) {\n this.context.warn(`Could not retrieve client secret for ${clientId}:`, error);\n // For admin-cli, we might not need a client secret\n clientSecret = null;\n }\n\n const params = new URLSearchParams();\n params.append('grant_type', 'refresh_token');\n params.append('refresh_token', refreshToken);\n params.append('client_id', clientId);\n \n // Only add client_secret if it exists\n if (clientSecret) {\n params.append('client_secret', clientSecret);\n }\n\n this.context.log(`Culturefy Token Refresh Params: ${JSON.stringify(params)}`);\n\n const response = await this.axiosInstance.post(`/realms/${realm}/protocol/openid-connect/token`, params, {\n headers: { 'Content-Type': 'application/x-www-form-urlencoded' },\n });\n \n if (response.status !== 200) {\n this.context.error(`Culturefy Token Refresh Response: ${JSON.stringify(response.data)}`);\n \n // Handle specific error cases\n if (response.data.error === 'invalid_grant') {\n if (response.data.error_description === 'Token is not active') {\n throw new Error(`Refresh token has expired, please login again`);\n }\n if (response.data.error_description === 'Invalid refresh token') {\n throw new Error(`Invalid refresh token`);\n }\n throw new Error(`Invalid refresh token`);\n } else if (response.data.error === 'invalid_token') {\n throw new Error(`Invalid token`);\n } else if (response.data.error === 'invalid_client') {\n throw new Error(`Invalid client configuration - admin-cli client may not be properly configured`);\n } else if (response.data.error === 'invalid_request') {\n throw new Error(`Invalid request`);\n }\n throw new Error(`Failed to refresh culturefy token - check admin-cli client configuration`);\n }\n \n this.context.log(`Culturefy Token Refresh Response: ${JSON.stringify(response.data)}`);\n const data: KeycloakUserLoginResponse = response.data;\n return data;\n\n } catch (error: any) {\n this.context.error(\"Error in refreshCulturefyToken\", error);\n \n // Handle specific error cases\n if (error?.response?.data?.error === 'invalid_grant') {\n if (error?.response?.data?.error_description === 'Token is not active') {\n throw new Error(`Refresh token has expired, please login again`);\n }\n if (error?.response?.data?.error_description === 'Invalid refresh token') {\n throw new Error(`Invalid refresh token`);\n }\n throw new Error(`Invalid refresh token`);\n } else if (error?.response?.data?.error === 'invalid_token') {\n throw new Error(`Invalid token`);\n } else if (error?.response?.data?.error === 'invalid_client') {\n throw new Error(`Invalid client configuration - admin-cli client may not be properly configured`);\n } else if (error?.response?.data?.error === 'invalid_request') {\n throw new Error(`Invalid request`);\n }\n \n if (error?.response?.data?.error_description) {\n throw new Error(error?.response?.data?.error_description);\n }\n \n throw new Error(`Failed to refresh culturefy token - check admin-cli client configuration`);\n }\n }\n\n /**\n * Introspect culturefy token to check if it's active\n * This method uses Keycloak's standard OpenID Connect token introspection endpoint\n * to verify the active state of a culturefy token\n * \n * @param realm - The Keycloak realm name\n * @param clientId - The client ID\n * @param token - The token to introspect\n * @returns Promise<KeycloakIntrospectTokenResponse> - Token introspection result\n */\n async introspectToken(realm: string, clientId: string, token: string): Promise<KeycloakIntrospectTokenResponse> {\n try {\n this.context.log(`Culturefy Token Introspection - Realm: ${realm}, Client: ${clientId}`);\n\n await this.authenticateRelmClient(realm, clientId);\n // this.context.log(`Authenticated`, JSON.stringify(this.accessToken));\n\n // Try to get client secret, but handle the case where it might not exist\n let clientSecret: string | null = null;\n try {\n clientSecret = await this.getClientSecret(realm, clientId);\n } catch (error) {\n this.context.warn(`Could not retrieve client secret for ${clientId}:`, error);\n // For admin-cli, we might not need a client secret\n clientSecret = null;\n }\n\n // Create introspection parameters\n const params = new URLSearchParams();\n params.append('token', token);\n\n this.context.log(`Culturefy Token Introspection Params: ${JSON.stringify(params)}`);\n\n // Perform the introspection request\n const response = await this.axiosInstance.post(`/realms/${realm}/protocol/openid-connect/token/introspect`, params, {\n headers: { 'Content-Type': 'application/x-www-form-urlencoded' },\n auth: {\n username: clientId,\n password: clientSecret || '' // Use empty string if no client secret\n }\n });\n\n if (response.status !== 200) {\n this.context.error(`Culturefy Token Introspection Response: ${JSON.stringify(response.data)}`);\n \n // Handle specific error cases\n if (response.data.error === 'invalid_token') {\n throw new Error(`Invalid token`);\n } else if (response.data.error === 'invalid_client') {\n throw new Error(`Invalid client configuration - admin-cli client may not be properly configured`);\n } else if (response.data.error === 'invalid_request') {\n throw new Error(`Invalid request`);\n }\n throw new Error(`Failed to introspect culturefy token - check admin-cli client configuration`);\n }\n\n this.context.log(`Culturefy Token Introspection Response: ${JSON.stringify(response.data)}`);\n const data: KeycloakIntrospectTokenResponse = response.data;\n\n // Check if token is active\n if (!data.active) {\n throw new Error(`Token is not active or has expired`);\n }\n\n return data;\n\n } catch (error: any) {\n this.context.error(\"Error in introspectCulturefyToken\", error);\n \n // Handle specific error cases\n if (error?.response?.data?.error === 'invalid_token') {\n throw new Error(`Invalid token`);\n } else if (error?.response?.data?.error === 'invalid_client') {\n throw new Error(`Invalid client configuration - admin-cli client may not be properly configured`);\n } else if (error?.response?.data?.error === 'invalid_request') {\n throw new Error(`Invalid request`);\n }\n \n if (error?.response?.data?.error_description) {\n throw new Error(error?.response?.data?.error_description);\n }\n \n throw new Error(`Failed to introspect culturefy token - check admin-cli client configuration`);\n }\n }\n\n /**\n * Get user details from a token using Keycloak's userinfo endpoint\n * This method uses Keycloak's standard OpenID Connect userinfo endpoint\n * to get the user details associated with the token\n * \n * @param realm - The Keycloak realm name\n * @param clientId - The client ID\n * @param token - The access token to get user info for\n * @returns Promise<KeycloakUserResponse> - User details from the token\n */\n async getUserByToken(realm: string, token: string): Promise<KeycloakUserResponse> {\n try {\n try {\n const response = await this.axiosInstance.get(`/realms/${realm}/protocol/openid-connect/userinfo`, {\n headers: { \n 'Authorization': `Bearer ${token}`,\n 'Content-Type': 'application/json'\n }\n });\n\n if (response.status === 200) {\n this.context.log(`User info from userinfo endpoint: ${JSON.stringify(response.data)}`);\n \n // Transform the userinfo response to match KeycloakUserResponse format\n const userInfo = response.data;\n const userResponse: KeycloakUserResponse = {\n id: userInfo.sub || userInfo.user_id,\n username: userInfo.preferred_username || userInfo.username,\n email: userInfo.email,\n firstName: userInfo.given_name || userInfo.first_name,\n lastName: userInfo.family_name || userInfo.last_name,\n emailVerified: userInfo.email_verified || false,\n enabled: true, // userinfo doesn't provide this, assume true if token is valid\n createdTimestamp: userInfo.iat ? userInfo.iat * 1000 : 0,\n totp: false,\n disableableCredentialTypes: [],\n requiredActions: [],\n notBefore: 0,\n access: {\n manage: true\n }\n };\n\n return userResponse;\n }\n } catch (userinfoError: any) {\n this.context.warn(`Userinfo endpoint failed, trying alternative method:`, userinfoError);\n }\n // Method 2: Decode JWT token and extract user ID, then get user details\n try {\n // Decode the JWT token to get the user ID\n const decoded = this.decodeJwtToken(token);\n if (!decoded || !decoded.sub) {\n throw new Error('Invalid token or missing user ID');\n }\n\n const userId = decoded.sub;\n this.context.log(`Extracted user ID from token: ${userId}`);\n\n // Get user details using the admin API\n await this.authenticate();\n const response = await this.axiosInstance.get(`/admin/realms/${realm}/users/${userId}`);\n \n if (response.status === 200) {\n this.context.log(`User details from admin API: ${JSON.stringify(response.data)}`);\n const userResponse: KeycloakUserResponse = response.data;\n return userResponse;\n }\n } catch (adminApiError: any) {\n this.context.warn(`Admin API method failed:`, adminApiError);\n }\n\n // Method 3: Extract user details directly from JWT token claims\n try {\n const decoded = this.decodeJwtToken(token);\n if (decoded) {\n this.context.log(`Extracting user details from JWT claims: ${JSON.stringify(decoded)}`);\n \n const userResponse: KeycloakUserResponse = {\n id: decoded.sub,\n username: decoded.preferred_username || decoded.username,\n email: decoded.email,\n firstName: decoded.given_name || decoded.first_name,\n lastName: decoded.family_name || decoded.last_name,\n emailVerified: decoded.email_verified || false,\n enabled: true,\n createdTimestamp: decoded.iat ? decoded.iat * 1000 : 0,\n totp: false,\n disableableCredentialTypes: [],\n requiredActions: [],\n notBefore: 0,\n access: {\n manage: true\n }\n // Note: Additional user attributes are available in decoded token but not in KeycloakUserResponse interface\n };\n\n return userResponse;\n }\n } catch (jwtError: any) {\n this.context.error(`JWT decoding failed:`, jwtError);\n }\n\n throw new Error('Failed to get user details from culturefy token');\n\n } catch (error: any) {\n this.context.error(\"Error in getUserByCulturefyToken\", error);\n \n if (error?.response?.data?.error === 'invalid_token') {\n throw new Error(`Invalid token`);\n } else if (error?.response?.data?.error === 'insufficient_scope') {\n throw new Error(`Token does not have required scope to access user info`);\n } else if (error?.response?.data?.error === 'invalid_request') {\n throw new Error(`Invalid request`);\n }\n \n if (error?.response?.data?.error_description) {\n throw new Error(error?.response?.data?.error_description);\n }\n \n throw new Error(`Failed to get user details from culturefy token`);\n }\n }\n\n /**\n * Decode JWT token without verification (for extracting claims)\n * This is used to extract user information from the token\n * \n * @param token - The JWT token to decode\n * @returns any - Decoded token payload\n */\n private decodeJwtToken(token: string): any {\n try {\n // Split the token and get the payload part\n const parts = token.split('.');\n if (parts.length !== 3) {\n throw new Error('Invalid JWT token format');\n }\n\n // Decode the payload (second part)\n const payload = parts[1];\n const decodedPayload = Buffer.from(payload, 'base64').toString('utf-8');\n return JSON.parse(decodedPayload);\n } catch (error) {\n this.context.error(\"Error decoding JWT token:\", error);\n throw new Error('Failed to decode JWT token');\n }\n }\n}"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
exports.__esModule = true;
|
|
4
|
+
exports.UserService = void 0;
|
|
5
|
+
var _mongoose = require("mongoose");
|
|
6
|
+
var _user = require("../models/user.model");
|
|
7
|
+
var _shared = require("@culturefy/shared");
|
|
8
|
+
var _class;
|
|
9
|
+
function _applyDecoratedDescriptor(i, e, r, n, l) { var a = {}; return Object.keys(n).forEach(function (i) { a[i] = n[i]; }), a.enumerable = !!a.enumerable, a.configurable = !!a.configurable, ("value" in a || a.initializer) && (a.writable = !0), a = r.slice().reverse().reduce(function (r, n) { return n(i, e, r) || r; }, a), l && void 0 !== a.initializer && (a.value = a.initializer ? a.initializer.call(l) : void 0, a.initializer = void 0), void 0 === a.initializer ? (Object.defineProperty(i, e, a), null) : a; }
|
|
10
|
+
let UserService = exports.UserService = (_class = class UserService extends _shared.Initializers {
|
|
11
|
+
constructor(context, dbUrl) {
|
|
12
|
+
super(context, dbUrl);
|
|
13
|
+
this.schema = _user.UserModel.schema;
|
|
14
|
+
}
|
|
15
|
+
getModel() {
|
|
16
|
+
const connection = this.getConnection();
|
|
17
|
+
if (!connection) {
|
|
18
|
+
throw new Error('Database connection not established');
|
|
19
|
+
}
|
|
20
|
+
return connection.model(_user.UserModel.modelName, this.schema);
|
|
21
|
+
}
|
|
22
|
+
async getUserById(userId) {
|
|
23
|
+
try {
|
|
24
|
+
let model = this.getModel();
|
|
25
|
+
this.context.log("UserId:", JSON.stringify(userId));
|
|
26
|
+
|
|
27
|
+
// Handle both string and SchemaObjectId inputs
|
|
28
|
+
let objectId;
|
|
29
|
+
if (typeof userId === 'string') {
|
|
30
|
+
objectId = new _mongoose.Types.ObjectId(userId);
|
|
31
|
+
} else {
|
|
32
|
+
// If it's already a SchemaObjectId, extract the string value
|
|
33
|
+
const userIdString = userId.path || userId.toString();
|
|
34
|
+
objectId = new _mongoose.Types.ObjectId(userIdString);
|
|
35
|
+
}
|
|
36
|
+
this.context.log("ObjectId:", JSON.stringify(objectId));
|
|
37
|
+
const user = await model.findById(objectId);
|
|
38
|
+
this.context.log("User:", JSON.stringify(user));
|
|
39
|
+
return user;
|
|
40
|
+
} catch (error) {
|
|
41
|
+
this.context.error("Error in getUserById", error);
|
|
42
|
+
throw error;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
async getUserByBusinessId(businessId, email) {
|
|
46
|
+
try {
|
|
47
|
+
let model = this.getModel();
|
|
48
|
+
this.context.log("BusinessId:", JSON.stringify(businessId));
|
|
49
|
+
this.context.log("Email:", JSON.stringify(email));
|
|
50
|
+
if (!businessId) return null;
|
|
51
|
+
if (!email) return null;
|
|
52
|
+
businessId = businessId.toLowerCase();
|
|
53
|
+
businessId = businessId.trim();
|
|
54
|
+
email = email.toLowerCase();
|
|
55
|
+
email = email.trim();
|
|
56
|
+
|
|
57
|
+
// Handle both string and SchemaObjectId inputs
|
|
58
|
+
let objectId;
|
|
59
|
+
if (typeof businessId === 'string') {
|
|
60
|
+
objectId = new _mongoose.Types.ObjectId(businessId);
|
|
61
|
+
} else {
|
|
62
|
+
// If it's already a SchemaObjectId, extract the string value
|
|
63
|
+
const businessIdString = businessId.path || businessId.toString();
|
|
64
|
+
objectId = new _mongoose.Types.ObjectId(businessIdString);
|
|
65
|
+
}
|
|
66
|
+
this.context.log("ObjectId:", JSON.stringify(objectId));
|
|
67
|
+
const user = await model.findOne({
|
|
68
|
+
businessId: objectId,
|
|
69
|
+
email: email
|
|
70
|
+
});
|
|
71
|
+
this.context.log("User:", JSON.stringify(user));
|
|
72
|
+
return user;
|
|
73
|
+
} catch (error) {
|
|
74
|
+
this.context.error("Error in getUserByBusinessId", error);
|
|
75
|
+
throw error;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
async getUserByEmail(email) {
|
|
79
|
+
try {
|
|
80
|
+
let model = this.getModel();
|
|
81
|
+
this.context.log("Email:", JSON.stringify(email));
|
|
82
|
+
email = email.toLowerCase();
|
|
83
|
+
email = email.trim();
|
|
84
|
+
const user = await model.findOne({
|
|
85
|
+
email: email
|
|
86
|
+
});
|
|
87
|
+
this.context.log("User:", JSON.stringify(user));
|
|
88
|
+
return user;
|
|
89
|
+
} catch (error) {
|
|
90
|
+
this.context.error("Error in getUserByEmail", error);
|
|
91
|
+
throw error;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}, _applyDecoratedDescriptor(_class.prototype, "getUserById", [_shared.WithDb], Object.getOwnPropertyDescriptor(_class.prototype, "getUserById"), _class.prototype), _applyDecoratedDescriptor(_class.prototype, "getUserByBusinessId", [_shared.WithDb], Object.getOwnPropertyDescriptor(_class.prototype, "getUserByBusinessId"), _class.prototype), _applyDecoratedDescriptor(_class.prototype, "getUserByEmail", [_shared.WithDb], Object.getOwnPropertyDescriptor(_class.prototype, "getUserByEmail"), _class.prototype), _class);
|
|
95
|
+
//# sourceMappingURL=user.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"user.service.js","names":["_mongoose","require","_user","_shared","_class","_applyDecoratedDescriptor","i","e","r","n","l","a","Object","keys","forEach","enumerable","configurable","initializer","writable","slice","reverse","reduce","value","call","defineProperty","UserService","exports","Initializers","constructor","context","dbUrl","schema","UserModel","getModel","connection","getConnection","Error","model","modelName","getUserById","userId","log","JSON","stringify","objectId","Types","ObjectId","userIdString","path","toString","user","findById","error","getUserByBusinessId","businessId","email","toLowerCase","trim","businessIdString","findOne","getUserByEmail","prototype","WithDb","getOwnPropertyDescriptor"],"sources":["../../../src/service/user.service.ts"],"sourcesContent":["import { Types } from \"mongoose\";\nimport { InvocationContext } from \"@azure/functions\";\nimport IUser, { UserModel } from \"../models/user.model\";\nimport { Initializers, WithDb } from \"@culturefy/shared\";\n\nexport class UserService extends Initializers {\n\n private readonly schema = UserModel.schema;\n constructor(context: InvocationContext, dbUrl:string) {\n super(context, dbUrl);\n }\n\n private getModel() {\n const connection = (this as any).getConnection();\n if (!connection) {\n throw new Error('Database connection not established');\n }\n return connection.model(UserModel.modelName, this.schema);\n }\n\n @WithDb\n async getUserById(userId: string): Promise<IUser | null> {\n try {\n let model = this.getModel();\n this.context.log(\"UserId:\", JSON.stringify(userId));\n \n // Handle both string and SchemaObjectId inputs\n let objectId: Types.ObjectId;\n if (typeof userId === 'string') {\n objectId = new Types.ObjectId(userId);\n } else {\n // If it's already a SchemaObjectId, extract the string value\n const userIdString = (userId as any).path || (userId as any).toString();\n objectId = new Types.ObjectId(userIdString);\n }\n \n this.context.log(\"ObjectId:\", JSON.stringify(objectId));\n const user = await model.findById(objectId);\n this.context.log(\"User:\", JSON.stringify(user));\n return user;\n } catch (error) {\n this.context.error(\"Error in getUserById\", error);\n throw error;\n }\n }\n\n @WithDb\n async getUserByBusinessId(businessId: string, email: string): Promise<IUser | null> {\n try {\n let model = this.getModel();\n this.context.log(\"BusinessId:\", JSON.stringify(businessId));\n this.context.log(\"Email:\", JSON.stringify(email));\n\n if(!businessId) return null;\n if(!email) return null;\n\n businessId = businessId.toLowerCase();\n businessId = businessId.trim();\n\n email = email.toLowerCase();\n email = email.trim();\n\n // Handle both string and SchemaObjectId inputs\n let objectId: Types.ObjectId;\n if (typeof businessId === 'string') {\n objectId = new Types.ObjectId(businessId);\n } else {\n // If it's already a SchemaObjectId, extract the string value\n const businessIdString = (businessId as any).path || (businessId as any).toString();\n objectId = new Types.ObjectId(businessIdString);\n }\n \n this.context.log(\"ObjectId:\", JSON.stringify(objectId));\n const user = await model.findOne({ businessId: objectId, email: email });\n this.context.log(\"User:\", JSON.stringify(user));\n return user;\n } catch (error) {\n this.context.error(\"Error in getUserByBusinessId\", error);\n throw error;\n }\n }\n\n @WithDb\n async getUserByEmail(email: string) {\n try {\n let model = this.getModel();\n this.context.log(\"Email:\", JSON.stringify(email));\n\n email = email.toLowerCase();\n email = email.trim();\n const user = await model.findOne({ email: email });\n this.context.log(\"User:\", JSON.stringify(user));\n return user;\n } catch (error) {\n this.context.error(\"Error in getUserByEmail\", error);\n throw error;\n }\n }\n}\n"],"mappings":";;;;AAAA,IAAAA,SAAA,GAAAC,OAAA;AAEA,IAAAC,KAAA,GAAAD,OAAA;AACA,IAAAE,OAAA,GAAAF,OAAA;AAAyD,IAAAG,MAAA;AAAA,SAAAC,0BAAAC,CAAA,EAAAC,CAAA,EAAAC,CAAA,EAAAC,CAAA,EAAAC,CAAA,QAAAC,CAAA,cAAAC,MAAA,CAAAC,IAAA,CAAAJ,CAAA,EAAAK,OAAA,WAAAR,CAAA,IAAAK,CAAA,CAAAL,CAAA,IAAAG,CAAA,CAAAH,CAAA,OAAAK,CAAA,CAAAI,UAAA,KAAAJ,CAAA,CAAAI,UAAA,EAAAJ,CAAA,CAAAK,YAAA,KAAAL,CAAA,CAAAK,YAAA,cAAAL,CAAA,IAAAA,CAAA,CAAAM,WAAA,MAAAN,CAAA,CAAAO,QAAA,QAAAP,CAAA,GAAAH,CAAA,CAAAW,KAAA,GAAAC,OAAA,GAAAC,MAAA,WAAAb,CAAA,EAAAC,CAAA,WAAAA,CAAA,CAAAH,CAAA,EAAAC,CAAA,EAAAC,CAAA,KAAAA,CAAA,KAAAG,CAAA,GAAAD,CAAA,eAAAC,CAAA,CAAAM,WAAA,KAAAN,CAAA,CAAAW,KAAA,GAAAX,CAAA,CAAAM,WAAA,GAAAN,CAAA,CAAAM,WAAA,CAAAM,IAAA,CAAAb,CAAA,YAAAC,CAAA,CAAAM,WAAA,uBAAAN,CAAA,CAAAM,WAAA,IAAAL,MAAA,CAAAY,cAAA,CAAAlB,CAAA,EAAAC,CAAA,EAAAI,CAAA,WAAAA,CAAA;AAAA,IAE5Cc,WAAW,GAAAC,OAAA,CAAAD,WAAA,IAAArB,MAAA,GAAjB,MAAMqB,WAAW,SAASE,oBAAY,CAAC;EAG1CC,WAAWA,CAACC,OAA0B,EAAEC,KAAY,EAAE;IAClD,KAAK,CAACD,OAAO,EAAEC,KAAK,CAAC;IAAC,KAFTC,MAAM,GAAGC,eAAS,CAACD,MAAM;EAG1C;EAEQE,QAAQA,CAAA,EAAG;IACjB,MAAMC,UAAU,GAAI,IAAI,CAASC,aAAa,CAAC,CAAC;IAChD,IAAI,CAACD,UAAU,EAAE;MACf,MAAM,IAAIE,KAAK,CAAC,qCAAqC,CAAC;IACxD;IACA,OAAOF,UAAU,CAACG,KAAK,CAACL,eAAS,CAACM,SAAS,EAAE,IAAI,CAACP,MAAM,CAAC;EAC3D;EAEA,MACMQ,WAAWA,CAACC,MAAc,EAAyB;IACrD,IAAI;MACA,IAAIH,KAAK,GAAG,IAAI,CAACJ,QAAQ,CAAC,CAAC;MAC3B,IAAI,CAACJ,OAAO,CAACY,GAAG,CAAC,SAAS,EAAEC,IAAI,CAACC,SAAS,CAACH,MAAM,CAAC,CAAC;;MAEnD;MACA,IAAII,QAAwB;MAC5B,IAAI,OAAOJ,MAAM,KAAK,QAAQ,EAAE;QAC5BI,QAAQ,GAAG,IAAIC,eAAK,CAACC,QAAQ,CAACN,MAAM,CAAC;MACzC,CAAC,MAAM;QACH;QACA,MAAMO,YAAY,GAAIP,MAAM,CAASQ,IAAI,IAAKR,MAAM,CAASS,QAAQ,CAAC,CAAC;QACvEL,QAAQ,GAAG,IAAIC,eAAK,CAACC,QAAQ,CAACC,YAAY,CAAC;MAC/C;MAEA,IAAI,CAAClB,OAAO,CAACY,GAAG,CAAC,WAAW,EAAEC,IAAI,CAACC,SAAS,CAACC,QAAQ,CAAC,CAAC;MACvD,MAAMM,IAAI,GAAG,MAAMb,KAAK,CAACc,QAAQ,CAACP,QAAQ,CAAC;MAC3C,IAAI,CAACf,OAAO,CAACY,GAAG,CAAC,OAAO,EAAEC,IAAI,CAACC,SAAS,CAACO,IAAI,CAAC,CAAC;MAC/C,OAAOA,IAAI;IACf,CAAC,CAAC,OAAOE,KAAK,EAAE;MACZ,IAAI,CAACvB,OAAO,CAACuB,KAAK,CAAC,sBAAsB,EAAEA,KAAK,CAAC;MACjD,MAAMA,KAAK;IACf;EACJ;EAEA,MACMC,mBAAmBA,CAACC,UAAkB,EAAEC,KAAa,EAAyB;IAChF,IAAI;MACA,IAAIlB,KAAK,GAAG,IAAI,CAACJ,QAAQ,CAAC,CAAC;MAC3B,IAAI,CAACJ,OAAO,CAACY,GAAG,CAAC,aAAa,EAAEC,IAAI,CAACC,SAAS,CAACW,UAAU,CAAC,CAAC;MAC3D,IAAI,CAACzB,OAAO,CAACY,GAAG,CAAC,QAAQ,EAAEC,IAAI,CAACC,SAAS,CAACY,KAAK,CAAC,CAAC;MAEjD,IAAG,CAACD,UAAU,EAAE,OAAO,IAAI;MAC3B,IAAG,CAACC,KAAK,EAAE,OAAO,IAAI;MAEtBD,UAAU,GAAGA,UAAU,CAACE,WAAW,CAAC,CAAC;MACrCF,UAAU,GAAGA,UAAU,CAACG,IAAI,CAAC,CAAC;MAE9BF,KAAK,GAAGA,KAAK,CAACC,WAAW,CAAC,CAAC;MAC3BD,KAAK,GAAGA,KAAK,CAACE,IAAI,CAAC,CAAC;;MAEpB;MACA,IAAIb,QAAwB;MAC5B,IAAI,OAAOU,UAAU,KAAK,QAAQ,EAAE;QAChCV,QAAQ,GAAG,IAAIC,eAAK,CAACC,QAAQ,CAACQ,UAAU,CAAC;MAC7C,CAAC,MAAM;QACH;QACA,MAAMI,gBAAgB,GAAIJ,UAAU,CAASN,IAAI,IAAKM,UAAU,CAASL,QAAQ,CAAC,CAAC;QACnFL,QAAQ,GAAG,IAAIC,eAAK,CAACC,QAAQ,CAACY,gBAAgB,CAAC;MACnD;MAEA,IAAI,CAAC7B,OAAO,CAACY,GAAG,CAAC,WAAW,EAAEC,IAAI,CAACC,SAAS,CAACC,QAAQ,CAAC,CAAC;MACvD,MAAMM,IAAI,GAAG,MAAMb,KAAK,CAACsB,OAAO,CAAC;QAAEL,UAAU,EAAEV,QAAQ;QAAEW,KAAK,EAAEA;MAAM,CAAC,CAAC;MACxE,IAAI,CAAC1B,OAAO,CAACY,GAAG,CAAC,OAAO,EAAEC,IAAI,CAACC,SAAS,CAACO,IAAI,CAAC,CAAC;MAC/C,OAAOA,IAAI;IACf,CAAC,CAAC,OAAOE,KAAK,EAAE;MACZ,IAAI,CAACvB,OAAO,CAACuB,KAAK,CAAC,8BAA8B,EAAEA,KAAK,CAAC;MACzD,MAAMA,KAAK;IACf;EACJ;EAEA,MACMQ,cAAcA,CAACL,KAAa,EAAE;IAChC,IAAI;MACA,IAAIlB,KAAK,GAAG,IAAI,CAACJ,QAAQ,CAAC,CAAC;MAC3B,IAAI,CAACJ,OAAO,CAACY,GAAG,CAAC,QAAQ,EAAEC,IAAI,CAACC,SAAS,CAACY,KAAK,CAAC,CAAC;MAEjDA,KAAK,GAAGA,KAAK,CAACC,WAAW,CAAC,CAAC;MAC3BD,KAAK,GAAGA,KAAK,CAACE,IAAI,CAAC,CAAC;MACpB,MAAMP,IAAI,GAAG,MAAMb,KAAK,CAACsB,OAAO,CAAC;QAAEJ,KAAK,EAAEA;MAAM,CAAC,CAAC;MAClD,IAAI,CAAC1B,OAAO,CAACY,GAAG,CAAC,OAAO,EAAEC,IAAI,CAACC,SAAS,CAACO,IAAI,CAAC,CAAC;MAC/C,OAAOA,IAAI;IACf,CAAC,CAAC,OAAOE,KAAK,EAAE;MACZ,IAAI,CAACvB,OAAO,CAACuB,KAAK,CAAC,yBAAyB,EAAEA,KAAK,CAAC;MACpD,MAAMA,KAAK;IACf;EACJ;AACJ,CAAC,EAAA/C,yBAAA,CAAAD,MAAA,CAAAyD,SAAA,kBA9EIC,cAAM,GAAAlD,MAAA,CAAAmD,wBAAA,CAAA3D,MAAA,CAAAyD,SAAA,kBAAAzD,MAAA,CAAAyD,SAAA,GAAAxD,yBAAA,CAAAD,MAAA,CAAAyD,SAAA,0BA0BNC,cAAM,GAAAlD,MAAA,CAAAmD,wBAAA,CAAA3D,MAAA,CAAAyD,SAAA,0BAAAzD,MAAA,CAAAyD,SAAA,GAAAxD,yBAAA,CAAAD,MAAA,CAAAyD,SAAA,qBAoCNC,cAAM,GAAAlD,MAAA,CAAAmD,wBAAA,CAAA3D,MAAA,CAAAyD,SAAA,qBAAAzD,MAAA,CAAAyD,SAAA,GAAAzD,MAAA","ignoreList":[]}
|
package/build/cjs/utils/index.js
CHANGED
|
@@ -25,4 +25,10 @@ Object.keys(_mapper).forEach(function (key) {
|
|
|
25
25
|
if (key in exports && exports[key] === _mapper[key]) return;
|
|
26
26
|
exports[key] = _mapper[key];
|
|
27
27
|
});
|
|
28
|
+
var _jwt = require("./jwt");
|
|
29
|
+
Object.keys(_jwt).forEach(function (key) {
|
|
30
|
+
if (key === "default" || key === "__esModule") return;
|
|
31
|
+
if (key in exports && exports[key] === _jwt[key]) return;
|
|
32
|
+
exports[key] = _jwt[key];
|
|
33
|
+
});
|
|
28
34
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["_secrets","require","Object","keys","forEach","key","exports","_response","_initializers","_mapper"],"sources":["../../../src/utils/index.ts"],"sourcesContent":["export * from './secrets';\nexport * from './response';\nexport * from './initializers';\nexport * from './mapper';"],"mappings":";;;AAAA,IAAAA,QAAA,GAAAC,OAAA;AAAAC,MAAA,CAAAC,IAAA,CAAAH,QAAA,EAAAI,OAAA,WAAAC,GAAA;EAAA,IAAAA,GAAA,kBAAAA,GAAA;EAAA,IAAAA,GAAA,IAAAC,OAAA,IAAAA,OAAA,CAAAD,GAAA,MAAAL,QAAA,CAAAK,GAAA;EAAAC,OAAA,CAAAD,GAAA,IAAAL,QAAA,CAAAK,GAAA;AAAA;AACA,IAAAE,SAAA,GAAAN,OAAA;AAAAC,MAAA,CAAAC,IAAA,CAAAI,SAAA,EAAAH,OAAA,WAAAC,GAAA;EAAA,IAAAA,GAAA,kBAAAA,GAAA;EAAA,IAAAA,GAAA,IAAAC,OAAA,IAAAA,OAAA,CAAAD,GAAA,MAAAE,SAAA,CAAAF,GAAA;EAAAC,OAAA,CAAAD,GAAA,IAAAE,SAAA,CAAAF,GAAA;AAAA;AACA,IAAAG,aAAA,GAAAP,OAAA;AAAAC,MAAA,CAAAC,IAAA,CAAAK,aAAA,EAAAJ,OAAA,WAAAC,GAAA;EAAA,IAAAA,GAAA,kBAAAA,GAAA;EAAA,IAAAA,GAAA,IAAAC,OAAA,IAAAA,OAAA,CAAAD,GAAA,MAAAG,aAAA,CAAAH,GAAA;EAAAC,OAAA,CAAAD,GAAA,IAAAG,aAAA,CAAAH,GAAA;AAAA;AACA,IAAAI,OAAA,GAAAR,OAAA;AAAAC,MAAA,CAAAC,IAAA,CAAAM,OAAA,EAAAL,OAAA,WAAAC,GAAA;EAAA,IAAAA,GAAA,kBAAAA,GAAA;EAAA,IAAAA,GAAA,IAAAC,OAAA,IAAAA,OAAA,CAAAD,GAAA,MAAAI,OAAA,CAAAJ,GAAA;EAAAC,OAAA,CAAAD,GAAA,IAAAI,OAAA,CAAAJ,GAAA;AAAA","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"index.js","names":["_secrets","require","Object","keys","forEach","key","exports","_response","_initializers","_mapper","_jwt"],"sources":["../../../src/utils/index.ts"],"sourcesContent":["export * from './secrets';\nexport * from './response';\nexport * from './initializers';\nexport * from './mapper';\nexport * from './jwt';"],"mappings":";;;AAAA,IAAAA,QAAA,GAAAC,OAAA;AAAAC,MAAA,CAAAC,IAAA,CAAAH,QAAA,EAAAI,OAAA,WAAAC,GAAA;EAAA,IAAAA,GAAA,kBAAAA,GAAA;EAAA,IAAAA,GAAA,IAAAC,OAAA,IAAAA,OAAA,CAAAD,GAAA,MAAAL,QAAA,CAAAK,GAAA;EAAAC,OAAA,CAAAD,GAAA,IAAAL,QAAA,CAAAK,GAAA;AAAA;AACA,IAAAE,SAAA,GAAAN,OAAA;AAAAC,MAAA,CAAAC,IAAA,CAAAI,SAAA,EAAAH,OAAA,WAAAC,GAAA;EAAA,IAAAA,GAAA,kBAAAA,GAAA;EAAA,IAAAA,GAAA,IAAAC,OAAA,IAAAA,OAAA,CAAAD,GAAA,MAAAE,SAAA,CAAAF,GAAA;EAAAC,OAAA,CAAAD,GAAA,IAAAE,SAAA,CAAAF,GAAA;AAAA;AACA,IAAAG,aAAA,GAAAP,OAAA;AAAAC,MAAA,CAAAC,IAAA,CAAAK,aAAA,EAAAJ,OAAA,WAAAC,GAAA;EAAA,IAAAA,GAAA,kBAAAA,GAAA;EAAA,IAAAA,GAAA,IAAAC,OAAA,IAAAA,OAAA,CAAAD,GAAA,MAAAG,aAAA,CAAAH,GAAA;EAAAC,OAAA,CAAAD,GAAA,IAAAG,aAAA,CAAAH,GAAA;AAAA;AACA,IAAAI,OAAA,GAAAR,OAAA;AAAAC,MAAA,CAAAC,IAAA,CAAAM,OAAA,EAAAL,OAAA,WAAAC,GAAA;EAAA,IAAAA,GAAA,kBAAAA,GAAA;EAAA,IAAAA,GAAA,IAAAC,OAAA,IAAAA,OAAA,CAAAD,GAAA,MAAAI,OAAA,CAAAJ,GAAA;EAAAC,OAAA,CAAAD,GAAA,IAAAI,OAAA,CAAAJ,GAAA;AAAA;AACA,IAAAK,IAAA,GAAAT,OAAA;AAAAC,MAAA,CAAAC,IAAA,CAAAO,IAAA,EAAAN,OAAA,WAAAC,GAAA;EAAA,IAAAA,GAAA,kBAAAA,GAAA;EAAA,IAAAA,GAAA,IAAAC,OAAA,IAAAA,OAAA,CAAAD,GAAA,MAAAK,IAAA,CAAAL,GAAA;EAAAC,OAAA,CAAAD,GAAA,IAAAK,IAAA,CAAAL,GAAA;AAAA","ignoreList":[]}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
exports.__esModule = true;
|
|
4
|
+
exports.verifyJsonWebToken = verifyJsonWebToken;
|
|
5
|
+
var _jwtDecode = require("jwt-decode");
|
|
6
|
+
function verifyJsonWebToken(token) {
|
|
7
|
+
try {
|
|
8
|
+
const decoded = (0, _jwtDecode.jwtDecode)(token);
|
|
9
|
+
return decoded;
|
|
10
|
+
} catch (error) {
|
|
11
|
+
return false;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=jwt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jwt.js","names":["_jwtDecode","require","verifyJsonWebToken","token","decoded","jwtDecode","error"],"sources":["../../../src/utils/jwt.ts"],"sourcesContent":["import { jwtDecode } from \"jwt-decode\";\n\nexport function verifyJsonWebToken(token: string): Record<string, any> | false {\n try {\n const decoded = jwtDecode(token);\n return decoded;\n } catch (error: any) {\n return false;\n }\n}"],"mappings":";;;;AAAA,IAAAA,UAAA,GAAAC,OAAA;AAEO,SAASC,kBAAkBA,CAACC,KAAa,EAA+B;EAC3E,IAAI;IACA,MAAMC,OAAO,GAAG,IAAAC,oBAAS,EAACF,KAAK,CAAC;IAChC,OAAOC,OAAO;EAClB,CAAC,CAAC,OAAOE,KAAU,EAAE;IACjB,OAAO,KAAK;EAChB;AACJ","ignoreList":[]}
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
exports.__esModule = true;
|
|
4
4
|
exports.asyncHandler = asyncHandler;
|
|
5
|
+
exports.parseCookies = parseCookies;
|
|
5
6
|
exports.sendResponse = sendResponse;
|
|
6
7
|
var StatusCode = /*#__PURE__*/function (StatusCode) {
|
|
7
8
|
StatusCode["SUCCESS"] = "10000";
|
|
@@ -67,4 +68,22 @@ function asyncHandler(handler) {
|
|
|
67
68
|
}
|
|
68
69
|
};
|
|
69
70
|
}
|
|
71
|
+
|
|
72
|
+
// Parse cookies from request headers
|
|
73
|
+
function parseCookies(req, context) {
|
|
74
|
+
// Convert Headers object to plain object for logging
|
|
75
|
+
const headersObj = {};
|
|
76
|
+
req.headers.forEach((value, key) => {
|
|
77
|
+
headersObj[key] = value;
|
|
78
|
+
});
|
|
79
|
+
context.info("Parse headers", JSON.stringify(headersObj));
|
|
80
|
+
const cookieHeader = req.headers.get("Cookie") || "";
|
|
81
|
+
context.info("Parse cookies", JSON.stringify(cookieHeader));
|
|
82
|
+
return cookieHeader.split(";").reduce((cookies, cookie) => {
|
|
83
|
+
const [name, ...rest] = cookie.split("=");
|
|
84
|
+
if (!name) return cookies;
|
|
85
|
+
cookies[name.trim()] = decodeURIComponent(rest.join("="));
|
|
86
|
+
return cookies;
|
|
87
|
+
}, {});
|
|
88
|
+
}
|
|
70
89
|
//# sourceMappingURL=response.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"response.js","names":["StatusCode","ResponseStatus","sendResponse","statusCode","data","message","headers","code","FAILURE","SUCCESS","UNAUTHORIZED","FORBIDDEN","INVALID_ACCESS_TOKEN","BAD_REQUEST","NOT_FOUND","INTERNAL_ERROR","status","body","JSON","stringify","asyncHandler","handler","request","context","log","url","response","error","console"],"sources":["../../../src/utils/response.ts"],"sourcesContent":["import { HttpRequest, HttpResponseInit, InvocationContext } from '@azure/functions';\n\nenum StatusCode {\n SUCCESS = '10000',\n FAILURE = '10001',\n RETRY = '10002',\n INVALID_ACCESS_TOKEN = '10003',\n}\n\nenum ResponseStatus {\n SUCCESS = 200,\n BAD_REQUEST = 400, // FAILURE\n UNAUTHORIZED = 401, // INVALID_ACCESS_TOKEN\n FORBIDDEN = 403, // INVALID_ACCESS_TOKEN\n NOT_FOUND = 404, // FAILURE\n INTERNAL_ERROR = 500, // FAILURE\n}\n\n// This function generates a standard response with a structured body: { status, message, data }\nexport function sendResponse(\n statusCode: number,\n data: any = null,\n message: string = '',\n headers: Record<string, string> = { 'Content-Type': 'application/json' }\n): HttpResponseInit {\n let code = StatusCode.FAILURE\n switch (statusCode) {\n case ResponseStatus.SUCCESS:\n code = StatusCode.SUCCESS\n break\n case ResponseStatus.UNAUTHORIZED:\n case ResponseStatus.FORBIDDEN:\n code = StatusCode.INVALID_ACCESS_TOKEN\n break\n case ResponseStatus.BAD_REQUEST:\n case ResponseStatus.NOT_FOUND:\n case ResponseStatus.INTERNAL_ERROR:\n code = StatusCode.FAILURE\n break\n }\n return {\n status: statusCode,\n body: JSON.stringify({\n statusCode: code,\n message: message || (statusCode >= 200 && statusCode < 300 ? 'Success' : 'Error'),\n data: data,\n }),\n headers: headers,\n };\n}\n\n// Centralized asyncHandler to catch all errors\nexport function asyncHandler(handler: Function) {\n return async (request: HttpRequest, context: InvocationContext): Promise<HttpResponseInit> => {\n try {\n context.log('Handling request:', request.url);\n const response = await handler(request, context); // Call the actual handler logic\n context.log('Response sent:', response.status);\n return response;\n } catch (error: any) {\n console.error('Error occurred:', error);\n context.error('Error occurred:', error);\n return sendResponse(500, null, error.message ? error.message : 'An unexpected error occurred');\n }\n };\n}"],"mappings":"
|
|
1
|
+
{"version":3,"file":"response.js","names":["StatusCode","ResponseStatus","sendResponse","statusCode","data","message","headers","code","FAILURE","SUCCESS","UNAUTHORIZED","FORBIDDEN","INVALID_ACCESS_TOKEN","BAD_REQUEST","NOT_FOUND","INTERNAL_ERROR","status","body","JSON","stringify","asyncHandler","handler","request","context","log","url","response","error","console","parseCookies","req","headersObj","forEach","value","key","info","cookieHeader","get","split","reduce","cookies","cookie","name","rest","trim","decodeURIComponent","join"],"sources":["../../../src/utils/response.ts"],"sourcesContent":["import { HttpRequest, HttpResponseInit, InvocationContext } from '@azure/functions';\n\nenum StatusCode {\n SUCCESS = '10000',\n FAILURE = '10001',\n RETRY = '10002',\n INVALID_ACCESS_TOKEN = '10003',\n}\n\nenum ResponseStatus {\n SUCCESS = 200,\n BAD_REQUEST = 400, // FAILURE\n UNAUTHORIZED = 401, // INVALID_ACCESS_TOKEN\n FORBIDDEN = 403, // INVALID_ACCESS_TOKEN\n NOT_FOUND = 404, // FAILURE\n INTERNAL_ERROR = 500, // FAILURE\n}\n\n// This function generates a standard response with a structured body: { status, message, data }\nexport function sendResponse(\n statusCode: number,\n data: any = null,\n message: string = '',\n headers: Record<string, string> = { 'Content-Type': 'application/json' }\n): HttpResponseInit {\n let code = StatusCode.FAILURE\n switch (statusCode) {\n case ResponseStatus.SUCCESS:\n code = StatusCode.SUCCESS\n break\n case ResponseStatus.UNAUTHORIZED:\n case ResponseStatus.FORBIDDEN:\n code = StatusCode.INVALID_ACCESS_TOKEN\n break\n case ResponseStatus.BAD_REQUEST:\n case ResponseStatus.NOT_FOUND:\n case ResponseStatus.INTERNAL_ERROR:\n code = StatusCode.FAILURE\n break\n }\n return {\n status: statusCode,\n body: JSON.stringify({\n statusCode: code,\n message: message || (statusCode >= 200 && statusCode < 300 ? 'Success' : 'Error'),\n data: data,\n }),\n headers: headers,\n };\n}\n\n// Centralized asyncHandler to catch all errors\nexport function asyncHandler(handler: Function) {\n return async (request: HttpRequest, context: InvocationContext): Promise<HttpResponseInit> => {\n try {\n context.log('Handling request:', request.url);\n const response = await handler(request, context); // Call the actual handler logic\n context.log('Response sent:', response.status);\n return response;\n } catch (error: any) {\n console.error('Error occurred:', error);\n context.error('Error occurred:', error);\n return sendResponse(500, null, error.message ? error.message : 'An unexpected error occurred');\n }\n };\n}\n\n// Parse cookies from request headers\nexport function parseCookies(req: any, context: InvocationContext): Record<string, any> {\n // Convert Headers object to plain object for logging\n const headersObj: Record<string, string> = {};\n req.headers.forEach((value: string, key: string) => {\n headersObj[key] = value;\n });\n context.info(\"Parse headers\", JSON.stringify(headersObj));\n\n const cookieHeader = req.headers.get(\"Cookie\") || \"\";\n context.info(\"Parse cookies\", JSON.stringify(cookieHeader));\n return cookieHeader.split(\";\").reduce((cookies: Record<string, any>, cookie: string) => {\n const [name, ...rest] = cookie.split(\"=\");\n if (!name) return cookies;\n cookies[name.trim()] = decodeURIComponent(rest.join(\"=\"));\n return cookies;\n }, {});\n}"],"mappings":"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","ignoreList":[]}
|
package/build/esm/dto/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
|
|
1
|
+
export * from "./location.dto";
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../../../src/dto/index.ts"],"sourcesContent":[""],"mappings":"","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../../src/dto/index.ts"],"sourcesContent":["export * from \"./location.dto\";"],"mappings":"AAAA,cAAc,gBAAgB","ignoreList":[]}
|
package/build/esm/index.js
CHANGED
package/build/esm/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../../src/index.ts"],"sourcesContent":["export * from './types';\nexport * from './enums';\nexport * from './utils';"],"mappings":"AAAA,cAAc,SAAS;AACvB,cAAc,SAAS;AACvB,cAAc,SAAS","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../src/index.ts"],"sourcesContent":["export * from './types';\nexport * from './enums';\nexport * from './utils';\nexport * from './middlewares';"],"mappings":"AAAA,cAAc,SAAS;AACvB,cAAc,SAAS;AACvB,cAAc,SAAS;AACvB,cAAc,eAAe","ignoreList":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../../src/interfaces/index.ts"],"sourcesContent":["export * from \"./keycloak\";\nexport * from \"./user\";"],"mappings":"AAAA,cAAc,YAAY;AAC1B,cAAc,QAAQ","ignoreList":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keycloak.js","names":[],"sources":["../../../src/interfaces/keycloak.ts"],"sourcesContent":["export interface CreateRealmDto {\n realm: string;\n displayName?: string;\n enabled?: boolean;\n}\n\nexport interface CreateClientDto {\n clientId: string;\n name: string;\n description: string;\n enabled: boolean;\n protocol: string;\n publicClient?: boolean;\n secret?: string;\n directAccessGrantsEnabled?: boolean;\n standardFlowEnabled?: boolean;\n implicitFlowEnabled?: boolean;\n serviceAccountsEnabled?: boolean;\n authorizationServicesEnabled?: boolean;\n redirectUris?: string[];\n webOrigins?: string[];\n bearerOnly?: boolean;\n consentRequired?: boolean;\n fullScopeAllowed?: boolean;\n attributes?: {\n tls_client_certificate_bound_access_tokens?: string;\n client_credentials_use_refresh_token?: string;\n };\n}\n\nexport interface CreateUserDto {\n username: string;\n firstName: string;\n lastName: string;\n email: string;\n password: string;\n enabled: boolean;\n emailVerified?: boolean;\n}\n\nexport interface KeycloakUserLoginResponse {\n access_token: string;\n expires_in: number;\n refresh_expires_in: number;\n refresh_token: string;\n token_type: string;\n not_before_policy: number;\n session_state: string;\n scope: string;\n}\n\nexport interface KeycloakClientLoginResponse {\n access_token: string;\n expires_in: number;\n refresh_expires_in: number;\n token_type: string;\n not_before_policy: number;\n scope: string;\n}\n\nexport interface KeycloakUserResponse {\n id: string;\n username: string;\n firstName: string;\n lastName: string;\n email: string;\n emailVerified: boolean;\n createdTimestamp: number;\n enabled: boolean;\n totp: boolean;\n disableableCredentialTypes: string[];\n requiredActions: string[];\n notBefore: number;\n access: {\n manage: boolean;\n }\n}\n\nexport interface KeycloakClientResponse {\n id: string;\n clientId: string;\n name: string;\n description: string;\n rootUrl: string;\n adminUrl: string;\n baseUrl: string;\n surrogateAuthRequired: boolean;\n enabled: boolean;\n alwaysDisplayInConsole: boolean;\n clientAuthenticatorType: string;\n secret: string;\n redirectUris: string[];\n webOrigins: string[];\n notBefore: number;\n bearerOnly: boolean;\n consentRequired: boolean;\n standardFlowEnabled: boolean;\n implicitFlowEnabled: boolean;\n directAccessGrantsEnabled: boolean;\n serviceAccountsEnabled: boolean;\n publicClient: boolean;\n frontchannelLogout: boolean;\n protocol: string;\n attributes: Record<string, string>;\n authenticationFlowBindingOverrides: Record<string, string>;\n fullScopeAllowed: boolean;\n nodeReRegistrationTimeout: number;\n defaultClientScopes: string[];\n optionalClientScopes: string[];\n access: {\n view: boolean;\n configure: boolean;\n manage: boolean;\n }\n}\n\nexport interface KeycloakClientSecretResponse {\n key: string;\n value: string;\n}\n\nexport interface KeycloakUserLoginDto {\n email: string;\n password: string;\n username?: string;\n}\n\nexport interface KeycloakRoleResponse {\n id: string;\n name: string;\n description: string;\n composite: boolean;\n clientRole: boolean;\n containerId: string;\n}\n\nexport interface KeycloakIntrospectTokenResponse {\n exp: number;\n iat: number;\n jti: string;\n iss: string;\n aud: string;\n sub: string;\n typ: string;\n azp: string;\n sid: string;\n acr: string;\n realm_access: Record<string, any>;\n resource_access: Record<string, any>;\n scope: string;\n email_verified: boolean;\n name: string;\n preferred_username: string;\n given_name: string;\n family_name: string;\n email: string;\n client_id: string;\n username: string;\n token_type: string;\n active: boolean;\n}"],"mappings":"","ignoreList":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"user.js","names":[],"sources":["../../../src/interfaces/user.ts"],"sourcesContent":["export interface ICreateUser {\n userId: string;\n email: string;\n businessId: string;\n}"],"mappings":"","ignoreList":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../../src/middlewares/index.ts"],"sourcesContent":["export * from './token-validation';"],"mappings":"AAAA,cAAc,oBAAoB","ignoreList":[]}
|