From 74889a71fe687dda74f2a687653122327807af36 Mon Sep 17 00:00:00 2001 From: Chocobozzz Date: Fri, 16 Jun 2017 09:45:46 +0200 Subject: Reorganize model files --- server/models/oauth/index.ts | 2 + server/models/oauth/oauth-client-interface.ts | 32 ++++++ server/models/oauth/oauth-client.ts | 87 ++++++++++++++ server/models/oauth/oauth-token-interface.ts | 48 ++++++++ server/models/oauth/oauth-token.ts | 160 ++++++++++++++++++++++++++ 5 files changed, 329 insertions(+) create mode 100644 server/models/oauth/index.ts create mode 100644 server/models/oauth/oauth-client-interface.ts create mode 100644 server/models/oauth/oauth-client.ts create mode 100644 server/models/oauth/oauth-token-interface.ts create mode 100644 server/models/oauth/oauth-token.ts (limited to 'server/models/oauth') diff --git a/server/models/oauth/index.ts b/server/models/oauth/index.ts new file mode 100644 index 000000000..a20d3a56a --- /dev/null +++ b/server/models/oauth/index.ts @@ -0,0 +1,2 @@ +export * from './oauth-client-interface' +export * from './oauth-token-interface' diff --git a/server/models/oauth/oauth-client-interface.ts b/server/models/oauth/oauth-client-interface.ts new file mode 100644 index 000000000..3b4325740 --- /dev/null +++ b/server/models/oauth/oauth-client-interface.ts @@ -0,0 +1,32 @@ +import * as Sequelize from 'sequelize' + +export namespace OAuthClientMethods { + export type CountTotalCallback = (err: Error, total: number) => void + export type CountTotal = (callback: CountTotalCallback) => void + + export type LoadFirstClientCallback = (err: Error, client: OAuthClientInstance) => void + export type LoadFirstClient = (callback: LoadFirstClientCallback) => void + + export type GetByIdAndSecret = (clientId, clientSecret) => void +} + +export interface OAuthClientClass { + countTotal: OAuthClientMethods.CountTotal + loadFirstClient: OAuthClientMethods.LoadFirstClient + getByIdAndSecret: OAuthClientMethods.GetByIdAndSecret +} + +export interface OAuthClientAttributes { + clientId: string + clientSecret: string + grants: string[] + redirectUris: string[] +} + +export interface OAuthClientInstance extends OAuthClientClass, OAuthClientAttributes, Sequelize.Instance { + id: number + createdAt: Date + updatedAt: Date +} + +export interface OAuthClientModel extends OAuthClientClass, Sequelize.Model {} diff --git a/server/models/oauth/oauth-client.ts b/server/models/oauth/oauth-client.ts new file mode 100644 index 000000000..fbc2a3393 --- /dev/null +++ b/server/models/oauth/oauth-client.ts @@ -0,0 +1,87 @@ +import * as Sequelize from 'sequelize' + +import { addMethodsToModel } from '../utils' +import { + OAuthClientClass, + OAuthClientInstance, + OAuthClientAttributes, + + OAuthClientMethods +} from './oauth-client-interface' + +let OAuthClient: Sequelize.Model +let countTotal: OAuthClientMethods.CountTotal +let loadFirstClient: OAuthClientMethods.LoadFirstClient +let getByIdAndSecret: OAuthClientMethods.GetByIdAndSecret + +export default function (sequelize: Sequelize.Sequelize, DataTypes: Sequelize.DataTypes) { + OAuthClient = sequelize.define('OAuthClient', + { + clientId: { + type: DataTypes.STRING, + allowNull: false + }, + clientSecret: { + type: DataTypes.STRING, + allowNull: false + }, + grants: { + type: DataTypes.ARRAY(DataTypes.STRING) + }, + redirectUris: { + type: DataTypes.ARRAY(DataTypes.STRING) + } + }, + { + indexes: [ + { + fields: [ 'clientId' ], + unique: true + }, + { + fields: [ 'clientId', 'clientSecret' ], + unique: true + } + ] + } + ) + + const classMethods = [ + associate, + + countTotal, + getByIdAndSecret, + loadFirstClient + ] + addMethodsToModel(OAuthClient, classMethods) + + return OAuthClient +} + +// --------------------------------------------------------------------------- + +function associate (models) { + OAuthClient.hasMany(models.OAuthToken, { + foreignKey: 'oAuthClientId', + onDelete: 'cascade' + }) +} + +countTotal = function (callback: OAuthClientMethods.CountTotalCallback) { + return OAuthClient.count().asCallback(callback) +} + +loadFirstClient = function (callback: OAuthClientMethods.LoadFirstClientCallback) { + return OAuthClient.findOne().asCallback(callback) +} + +getByIdAndSecret = function (clientId: string, clientSecret: string) { + const query = { + where: { + clientId: clientId, + clientSecret: clientSecret + } + } + + return OAuthClient.findOne(query) +} diff --git a/server/models/oauth/oauth-token-interface.ts b/server/models/oauth/oauth-token-interface.ts new file mode 100644 index 000000000..815ad5eef --- /dev/null +++ b/server/models/oauth/oauth-token-interface.ts @@ -0,0 +1,48 @@ +import * as Sequelize from 'sequelize' +import * as Bluebird from 'bluebird' + +import { UserModel } from '../user' + +export type OAuthTokenInfo = { + refreshToken: string + refreshTokenExpiresAt: Date, + client: { + id: number + }, + user: { + id: number + } +} + +export namespace OAuthTokenMethods { + export type GetByRefreshTokenAndPopulateClient = (refreshToken: string) => Bluebird + export type GetByTokenAndPopulateUser = (bearerToken: string) => Bluebird + export type GetByRefreshTokenAndPopulateUser = (refreshToken: string) => Bluebird + + export type RemoveByUserIdCallback = (err: Error) => void + export type RemoveByUserId = (userId, callback) => void +} + +export interface OAuthTokenClass { + getByRefreshTokenAndPopulateClient: OAuthTokenMethods.GetByRefreshTokenAndPopulateClient + getByTokenAndPopulateUser: OAuthTokenMethods.GetByTokenAndPopulateUser + getByRefreshTokenAndPopulateUser: OAuthTokenMethods.GetByRefreshTokenAndPopulateUser + removeByUserId: OAuthTokenMethods.RemoveByUserId +} + +export interface OAuthTokenAttributes { + accessToken: string + accessTokenExpiresAt: Date + refreshToken: string + refreshTokenExpiresAt: Date + + User?: UserModel +} + +export interface OAuthTokenInstance extends OAuthTokenClass, OAuthTokenAttributes, Sequelize.Instance { + id: number + createdAt: Date + updatedAt: Date +} + +export interface OAuthTokenModel extends OAuthTokenClass, Sequelize.Model {} diff --git a/server/models/oauth/oauth-token.ts b/server/models/oauth/oauth-token.ts new file mode 100644 index 000000000..eab9cf858 --- /dev/null +++ b/server/models/oauth/oauth-token.ts @@ -0,0 +1,160 @@ +import * as Sequelize from 'sequelize' + +import { logger } from '../../helpers' + +import { addMethodsToModel } from '../utils' +import { + OAuthTokenClass, + OAuthTokenInstance, + OAuthTokenAttributes, + + OAuthTokenMethods, + OAuthTokenInfo +} from './oauth-token-interface' + +let OAuthToken: Sequelize.Model +let getByRefreshTokenAndPopulateClient: OAuthTokenMethods.GetByRefreshTokenAndPopulateClient +let getByTokenAndPopulateUser: OAuthTokenMethods.GetByTokenAndPopulateUser +let getByRefreshTokenAndPopulateUser: OAuthTokenMethods.GetByRefreshTokenAndPopulateUser +let removeByUserId: OAuthTokenMethods.RemoveByUserId + +export default function (sequelize: Sequelize.Sequelize, DataTypes: Sequelize.DataTypes) { + OAuthToken = sequelize.define('OAuthToken', + { + accessToken: { + type: DataTypes.STRING, + allowNull: false + }, + accessTokenExpiresAt: { + type: DataTypes.DATE, + allowNull: false + }, + refreshToken: { + type: DataTypes.STRING, + allowNull: false + }, + refreshTokenExpiresAt: { + type: DataTypes.DATE, + allowNull: false + } + }, + { + indexes: [ + { + fields: [ 'refreshToken' ], + unique: true + }, + { + fields: [ 'accessToken' ], + unique: true + }, + { + fields: [ 'userId' ] + }, + { + fields: [ 'oAuthClientId' ] + } + ] + } + ) + + const classMethods = [ + associate, + + getByRefreshTokenAndPopulateClient, + getByTokenAndPopulateUser, + getByRefreshTokenAndPopulateUser, + removeByUserId + ] + addMethodsToModel(OAuthToken, classMethods) + + return OAuthToken +} + +// --------------------------------------------------------------------------- + +function associate (models) { + OAuthToken.belongsTo(models.User, { + foreignKey: { + name: 'userId', + allowNull: false + }, + onDelete: 'cascade' + }) + + OAuthToken.belongsTo(models.OAuthClient, { + foreignKey: { + name: 'oAuthClientId', + allowNull: false + }, + onDelete: 'cascade' + }) +} + +getByRefreshTokenAndPopulateClient = function (refreshToken: string) { + const query = { + where: { + refreshToken: refreshToken + }, + include: [ OAuthToken['sequelize'].models.OAuthClient ] + } + + return OAuthToken.findOne(query).then(function (token) { + if (!token) return null + + const tokenInfos: OAuthTokenInfo = { + refreshToken: token.refreshToken, + refreshTokenExpiresAt: token.refreshTokenExpiresAt, + client: { + id: token['client'].id + }, + user: { + id: token['user'] + } + } + + return tokenInfos + }).catch(function (err) { + logger.info('getRefreshToken error.', { error: err }) + }) +} + +getByTokenAndPopulateUser = function (bearerToken: string) { + const query = { + where: { + accessToken: bearerToken + }, + include: [ OAuthToken['sequelize'].models.User ] + } + + return OAuthToken.findOne(query).then(function (token) { + if (token) token['user'] = token.User + + return token + }) +} + +getByRefreshTokenAndPopulateUser = function (refreshToken: string) { + const query = { + where: { + refreshToken: refreshToken + }, + include: [ OAuthToken['sequelize'].models.User ] + } + + return OAuthToken.findOne(query).then(function (token) { + token['user'] = token.User + + return token + }) +} + +removeByUserId = function (userId, callback) { + const query = { + where: { + userId: userId + } + } + + return OAuthToken.destroy(query).asCallback(callback) +} -- cgit v1.2.3