@accounts/oauth
Version:
108 lines • 4.15 kB
JavaScript
;
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