Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- interface SequelizeRequest {
- request: (t: Transaction, params: any, thenRequest: SequelizeRequest[], data?: any) => Promise<any>;
- thenRequest?: SequelizeRequest[];
- catchCallback?: (err: Error) => Promise<any> | never;
- }
- export abstract class AbstractModel {
- private readonly sequelize: Sequelize;
- constructor(sequelize: Sequelize) {
- this.sequelize = sequelize;
- }
- start(params: any): Promise<any> {
- const requestRoot: SequelizeRequest = this.getAllSequelizeRequests();
- return this.sequelize.transaction((t: Transaction) => requestRoot
- .request(t, params, requestRoot.thenRequest || [])
- .catch(requestRoot.catchCallback || ((err: Error) => {
- throw new Error(); //ROOLBACK
- }))
- );
- }
- protected abstract getAllSequelizeRequests(): SequelizeRequest;
- }
- export class InscriptionModel extends AbstractModel {
- protected getAllSequelizeRequests(): SequelizeRequest {
- return {
- request: this.checkUsername,
- thenRequest: [
- {
- request: this.checkEmail,
- thenRequest: [
- //etc...
- ]
- }
- ]
- };
- }
- protected checkUsername(t: Transaction, params: any, thenRequest: SequelizeRequest[]): Promise<any> {
- return User.findOne({
- where: {username: params.username},
- transaction: t
- })
- .then((data: any) => {
- if (data) {
- throw new Error(); //Provoque un ROLLBACK
- }
- return Promise.all(
- thenRequest.map(r => r.request(t, params, r.thenRequest || [], data))
- );
- });
- }
- protected checkEmail(t: Transaction, params: any, thenRequest: SequelizeRequest[]): Promise<any> {
- return User.findOne({
- where: {email: params.email},
- transaction: t
- })
- .then((data: any) => {
- if (data) {
- throw new Error(); //Provoque un ROLLBACK
- }
- return Promise.all(
- thenRequest.map(r => r.request(t, params, r.thenRequest || [], data))
- );
- });
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement