@krypton-org/krypton-auth
Version:
Express authentication middleware, using GraphQL and JSON Web Tokens.
191 lines • 7.76 kB
JavaScript
;
/**
* Module returning the GraphQL schema for the user management API.
* @module graphql/Schema
*/
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
result["default"] = mod;
return result;
};
Object.defineProperty(exports, "__esModule", { value: true });
const graphql_compose_1 = require("graphql-compose");
const graphql_compose_mongoose_1 = require("graphql-compose-mongoose");
const mongoose_1 = __importDefault(require("mongoose"));
const config_1 = __importDefault(require("../config"));
const UserController = __importStar(require("../controller/UserController"));
const UserModel_1 = __importDefault(require("../model/UserModel"));
const UserSchema_1 = require("../model/UserSchema");
const MongooseSchema = mongoose_1.default.Schema;
// Getting converted GraphQL public user fields from Mongoose schema
const UserPublicInfoTC = graphql_compose_mongoose_1.composeWithMongoose(UserModel_1.default, {
fields: {
remove: [...UserSchema_1.internalFields, ...UserSchema_1.privateFields],
},
name: 'UserPublicInfo',
});
// Adding public queries - accessible publicly
graphql_compose_1.schemaComposer.Query.addFields({
userById: UserPublicInfoTC.getResolver('findById'),
userByIds: UserPublicInfoTC.getResolver('findByIds'),
userCount: UserPublicInfoTC.getResolver('count'),
userMany: UserPublicInfoTC.getResolver('findMany'),
userOne: UserPublicInfoTC.getResolver('findOne'),
userPagination: UserPublicInfoTC.getResolver('pagination'),
});
// Getting converted GraphQL public user fields without the internal ones from Mongoose schema
const convertedPrivateFields = graphql_compose_mongoose_1.composeWithMongoose(mongoose_1.default.model('mock', new MongooseSchema(UserSchema_1.UserSchema)), {
fields: {
remove: [...UserSchema_1.internalFields],
},
}).getFields();
// User GraphQL Type with public and private fields - accessible by logged in user.
const UserTC = UserPublicInfoTC.clone('User');
UserTC.addFields(convertedPrivateFields);
/***** Types for queries and mutation *****/
const UserRegisterInputTC = graphql_compose_1.schemaComposer.createInputTC('UserRegisterInput');
// @ts-ignore
UserRegisterInputTC.addFields(UserTC.getFields());
UserRegisterInputTC.addFields({
password: 'String!',
});
UserRegisterInputTC.removeField([...UserSchema_1.uneditableFields, '_id']);
const UserUpdateInputTC = graphql_compose_1.schemaComposer.createInputTC('UserUpdateInput');
// @ts-ignore
UserUpdateInputTC.addFields(UserTC.getFields());
UserUpdateInputTC.addFields({
password: 'String',
previousPassword: 'String',
});
UserUpdateInputTC.removeField([...UserSchema_1.uneditableFields, '_id']);
const UserAndTokenTC = graphql_compose_1.schemaComposer.createObjectTC({
fields: {
expiryDate: 'Date!',
token: 'String!',
user: UserTC,
},
name: 'UserAndToken',
});
const TokenTC = graphql_compose_1.schemaComposer.createObjectTC({
fields: {
expiryDate: 'Date!',
token: 'String!',
},
name: 'Token',
});
const NotificationTypeTC = graphql_compose_1.schemaComposer.createEnumTC({
name: 'NotificationType',
values: {
ERROR: { value: 'error' },
INFO: { value: 'info' },
SUCCESS: { value: 'success' },
WARNING: { value: 'warning' },
},
});
const NotificationTC = graphql_compose_1.schemaComposer.createObjectTC({
fields: {
message: 'String!',
type: 'NotificationType!',
},
name: 'Notification',
});
const NotificationsTC = graphql_compose_1.schemaComposer.createObjectTC({
fields: {
notifications: '[Notification]',
},
name: 'Notifications',
});
// Composing GraphQL Schema
graphql_compose_1.schemaComposer.Query.addFields({
emailAvailable: {
args: {
email: 'String!',
},
resolve: (_, { email }) => __awaiter(void 0, void 0, void 0, function* () { return yield UserController.checkEmailAvailable(email); }),
type: 'Boolean',
},
me: {
resolve: (_, {}, { req, res }) => __awaiter(void 0, void 0, void 0, function* () { return yield UserController.getUser(req, res); }),
type: UserTC,
},
publicKey: {
resolve: () => {
return config_1.default.publicKey;
},
type: 'String',
},
sendPasswordRecoveryEmail: {
args: {
email: 'String!',
},
resolve: (_, { email }, { req }) => UserController.sendPasswordRecoveryEmail(email, req),
type: 'Boolean',
},
sendVerificationEmail: {
resolve: (_, {}, { req }) => __awaiter(void 0, void 0, void 0, function* () { return UserController.resendConfirmationEmail(req); }),
type: 'Boolean',
},
});
graphql_compose_1.schemaComposer.Mutation.addFields({
deleteMe: {
args: {
password: 'String!',
},
resolve: (_, { password }, { req }) => __awaiter(void 0, void 0, void 0, function* () { return UserController.deleteUser(password, req); }),
type: 'Boolean',
},
login: {
args: {
email: 'String!',
password: 'String!',
},
resolve: (_, { email, password }, { req, res }) => __awaiter(void 0, void 0, void 0, function* () { return yield UserController.login(email, password, req, res); }),
type: UserAndTokenTC,
},
logout: {
resolve: (_, {}, { req }) => __awaiter(void 0, void 0, void 0, function* () { return yield UserController.logout(req); }),
type: 'Boolean',
},
refreshToken: {
resolve: (_, {}, { req, res }) => __awaiter(void 0, void 0, void 0, function* () { return yield UserController.refreshTokens(req, res); }),
type: TokenTC,
},
register: {
args: {
fields: 'UserRegisterInput!',
},
resolve: (_, { fields }, { req }) => __awaiter(void 0, void 0, void 0, function* () { return yield UserController.createUser(fields, req); }),
type: 'Boolean',
},
resetMyPassword: {
args: {
password: 'String!',
passwordRecoveryToken: 'String!',
},
resolve: (_, { password, passwordRecoveryToken }) => __awaiter(void 0, void 0, void 0, function* () { return UserController.recoverPassword(password, passwordRecoveryToken); }),
type: NotificationsTC,
},
updateMe: {
args: {
fields: 'UserUpdateInput!',
},
resolve: (_, { fields }, { req, res }) => __awaiter(void 0, void 0, void 0, function* () { return UserController.updateUser(fields, req, res); }),
type: UserAndTokenTC,
},
});
exports.default = graphql_compose_1.schemaComposer.buildSchema();
//# sourceMappingURL=Schema.js.map