UNPKG

@accounts/oauth

Version:

108 lines 4.15 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.AccountsOauth = void 0; const tslib_1 = require("tslib"); const server_1 = require("@accounts/server"); const graphql_modules_1 = require("graphql-modules"); const OAuthProviders_symbol_1 = require("./types/OAuthProviders.symbol"); const getRegistrationPayloadDefault = async (oauthUser) => { return { email: oauthUser.email, }; }; let AccountsOauth = class AccountsOauth { oauthProviders; context; server; serviceName = 'oauth'; db; // private dbSessions!: DatabaseInterfaceSessions; constructor(oauthProviders, db, server) { this.oauthProviders = oauthProviders; if (db) { this.db = db; // this.dbSessions = dbSessions ?? (db as DatabaseInterfaceSessions); } if (server) { this.server = server; } } getOAuthProvider(providerName) { const instanceOrCtor = this.oauthProviders[providerName]; // If it's a constructor we use dependency injection (GraphQL), otherwise we already have an instance (REST) const provider = typeof instanceOrCtor === 'function' ? this.context.injector.get(instanceOrCtor) : instanceOrCtor; if (!provider) { throw new Error(`No OAuth provider with the name ${providerName} was registered.`); } return provider; } getOAuthProviders() { return this.oauthProviders; } setUserStore(store) { this.db = store; } setSessionsStore() { // Empty } async authenticate(params) { if (!params.provider) { throw new Error('Invalid provider'); } const userProvider = this.getOAuthProvider(params.provider); if (typeof userProvider.authenticate !== 'function') { throw new Error('Invalid provider'); } const oauthUser = await userProvider.authenticate(params); let user = await this.db.findUserByServiceId(params.provider, oauthUser.id); if (!user && oauthUser.email) { user = await this.db.findUserByEmail(oauthUser.email); } if (!user) { try { const userData = await (userProvider.getRegistrationPayload || getRegistrationPayloadDefault)(oauthUser); const userId = await this.db.createUser(userData); user = await this.db.findUserById(userId); if (user == null) { throw new Error(`Cannot find user ${userId}`); } if (this.server) { await this.server.getHooks().emit(server_1.ServerHooks.CreateUserSuccess, user); } } catch (e) { if (this.server) { await this.server.getHooks().emit(server_1.ServerHooks.CreateUserError, user); } throw e; } } await this.db.setService(user.id, params.provider, oauthUser); return user; } async unlink(userId, provider) { if (!provider) { throw new Error('Invalid provider'); } // Check whether the service has been provided, throws if not this.getOAuthProvider(provider); await this.db.setService(userId, provider, null); } }; exports.AccountsOauth = AccountsOauth; tslib_1.__decorate([ (0, graphql_modules_1.ExecutionContext)(), tslib_1.__metadata("design:type", Object) ], AccountsOauth.prototype, "context", void 0); exports.AccountsOauth = AccountsOauth = tslib_1.__decorate([ (0, graphql_modules_1.Injectable)({ global: true, }), tslib_1.__param(0, (0, graphql_modules_1.Inject)(OAuthProviders_symbol_1.OAuthProvidersToken)), tslib_1.__param(1, (0, graphql_modules_1.Inject)(server_1.DatabaseInterfaceUserToken)), tslib_1.__param(2, (0, graphql_modules_1.Inject)(server_1.AccountsServer)), tslib_1.__metadata("design:paramtypes", [Object, Object, server_1.AccountsServer]) ], AccountsOauth); //# sourceMappingURL=accounts-oauth.js.map