|
| 1 | +import { ModelStatic } from 'sequelize' |
| 2 | +import { |
| 3 | + CreateAfterHook, |
| 4 | + CreateBeforeHook, |
| 5 | + CreateFieldDeclarationType, |
| 6 | + DeleteAfterHook, |
| 7 | + DeleteBeforeHook, |
| 8 | + DeleteFieldDeclarationType, |
| 9 | + GraphqlSchemaDeclarationType, |
| 10 | + QueryAfterHook, |
| 11 | + QueryBeforeHook, |
| 12 | + UpdateAfterHook, |
| 13 | + UpdateBeforeHook, |
| 14 | + UpdateFieldDeclarationType, |
| 15 | +} from './types/types' |
| 16 | + |
| 17 | +// Injects a function that will be called with the model and the hooks |
| 18 | +// The function can return a new list of hooks to be used instead of the original ones |
| 19 | +export function injectHooks({ |
| 20 | + graphqlSchemaDeclaration, |
| 21 | + injectFunctions, |
| 22 | +}: { |
| 23 | + graphqlSchemaDeclaration: GraphqlSchemaDeclarationType<any> |
| 24 | + injectFunctions: { |
| 25 | + listBefore?: ( |
| 26 | + model: ModelStatic<any>, |
| 27 | + hooks: QueryBeforeHook<any>[] |
| 28 | + ) => QueryBeforeHook<any>[] |
| 29 | + listAfter?: ( |
| 30 | + model: ModelStatic<any>, |
| 31 | + hooks: QueryAfterHook<any>[] |
| 32 | + ) => QueryAfterHook<any>[] |
| 33 | + updateBefore?: ( |
| 34 | + model: ModelStatic<any>, |
| 35 | + hooks: UpdateBeforeHook<any>[] |
| 36 | + ) => UpdateBeforeHook<any>[] |
| 37 | + updateAfter?: ( |
| 38 | + model: ModelStatic<any>, |
| 39 | + hooks: UpdateAfterHook<any>[] |
| 40 | + ) => UpdateAfterHook<any>[] |
| 41 | + createBefore?: ( |
| 42 | + model: ModelStatic<any>, |
| 43 | + hooks: CreateBeforeHook<any>[] |
| 44 | + ) => CreateBeforeHook<any>[] |
| 45 | + createAfter?: ( |
| 46 | + model: ModelStatic<any>, |
| 47 | + hooks: CreateAfterHook<any>[] |
| 48 | + ) => CreateAfterHook<any>[] |
| 49 | + deleteBefore?: ( |
| 50 | + model: ModelStatic<any>, |
| 51 | + hooks: DeleteBeforeHook<any>[] |
| 52 | + ) => DeleteBeforeHook<any>[] |
| 53 | + deleteAfter?: ( |
| 54 | + model: ModelStatic<any>, |
| 55 | + hooks: DeleteAfterHook<any>[] |
| 56 | + ) => DeleteAfterHook<any>[] |
| 57 | + } |
| 58 | +}): GraphqlSchemaDeclarationType<any> { |
| 59 | + for (const key in graphqlSchemaDeclaration) { |
| 60 | + const declaration = graphqlSchemaDeclaration[key] |
| 61 | + |
| 62 | + if ('model' in declaration) { |
| 63 | + if (!declaration.list) { |
| 64 | + declaration.list = {} |
| 65 | + } |
| 66 | + |
| 67 | + const beforeList: QueryBeforeHook<any>[] = Array.isArray( |
| 68 | + declaration.list.before |
| 69 | + ) |
| 70 | + ? declaration.list.before |
| 71 | + : declaration.list.before |
| 72 | + ? [declaration.list.before as QueryBeforeHook<any>] |
| 73 | + : [] |
| 74 | + |
| 75 | + declaration.list.before = injectFunctions.listBefore |
| 76 | + ? injectFunctions.listBefore(declaration.model, beforeList) |
| 77 | + : beforeList |
| 78 | + |
| 79 | + const afterList: QueryAfterHook<any>[] = Array.isArray( |
| 80 | + declaration.list.after |
| 81 | + ) |
| 82 | + ? declaration.list.after |
| 83 | + : declaration.list.after |
| 84 | + ? [declaration.list.after as QueryAfterHook<any>] |
| 85 | + : [] |
| 86 | + |
| 87 | + declaration.list.after = injectFunctions.listAfter |
| 88 | + ? injectFunctions.listAfter(declaration.model, afterList) |
| 89 | + : afterList |
| 90 | + |
| 91 | + // Initialize update configuration if it's in actions |
| 92 | + if (declaration.actions?.includes('update')) { |
| 93 | + if (!declaration.update || 'type' in declaration.update) { |
| 94 | + declaration.update = {} as UpdateFieldDeclarationType<any> |
| 95 | + } |
| 96 | + |
| 97 | + const beforeUpdate: UpdateBeforeHook<any>[] = Array.isArray( |
| 98 | + declaration.update.before |
| 99 | + ) |
| 100 | + ? declaration.update.before |
| 101 | + : declaration.update.before |
| 102 | + ? [declaration.update.before as UpdateBeforeHook<any>] |
| 103 | + : [] |
| 104 | + |
| 105 | + declaration.update.before = injectFunctions.updateBefore |
| 106 | + ? injectFunctions.updateBefore(declaration.model, beforeUpdate) |
| 107 | + : beforeUpdate |
| 108 | + |
| 109 | + const afterUpdate: UpdateAfterHook<any>[] = Array.isArray( |
| 110 | + declaration.update.after |
| 111 | + ) |
| 112 | + ? declaration.update.after |
| 113 | + : declaration.update.after |
| 114 | + ? [declaration.update.after as UpdateAfterHook<any>] |
| 115 | + : [] |
| 116 | + |
| 117 | + declaration.update.after = injectFunctions.updateAfter |
| 118 | + ? injectFunctions.updateAfter(declaration.model, afterUpdate) |
| 119 | + : afterUpdate |
| 120 | + } |
| 121 | + |
| 122 | + // Initialize create configuration if it's in actions |
| 123 | + if (declaration.actions?.includes('create')) { |
| 124 | + if (!declaration.create || 'type' in declaration.create) { |
| 125 | + declaration.create = {} as CreateFieldDeclarationType<any> |
| 126 | + } |
| 127 | + |
| 128 | + const beforeCreate: CreateBeforeHook<any>[] = Array.isArray( |
| 129 | + declaration.create.before |
| 130 | + ) |
| 131 | + ? declaration.create.before |
| 132 | + : declaration.create.before |
| 133 | + ? [declaration.create.before as CreateBeforeHook<any>] |
| 134 | + : [] |
| 135 | + |
| 136 | + declaration.create.before = injectFunctions.createBefore |
| 137 | + ? injectFunctions.createBefore(declaration.model, beforeCreate) |
| 138 | + : beforeCreate |
| 139 | + |
| 140 | + const afterCreate: CreateAfterHook<any>[] = Array.isArray( |
| 141 | + declaration.create.after |
| 142 | + ) |
| 143 | + ? declaration.create.after |
| 144 | + : declaration.create.after |
| 145 | + ? [declaration.create.after as CreateAfterHook<any>] |
| 146 | + : [] |
| 147 | + |
| 148 | + declaration.create.after = injectFunctions.createAfter |
| 149 | + ? injectFunctions.createAfter(declaration.model, afterCreate) |
| 150 | + : afterCreate |
| 151 | + } |
| 152 | + |
| 153 | + // Initialize delete configuration if it's in actions |
| 154 | + if (declaration.actions?.includes('delete')) { |
| 155 | + if (!declaration.delete || 'type' in declaration.delete) { |
| 156 | + declaration.delete = {} as DeleteFieldDeclarationType<any> |
| 157 | + } |
| 158 | + |
| 159 | + const beforeDelete: DeleteBeforeHook<any>[] = Array.isArray( |
| 160 | + declaration.delete.before |
| 161 | + ) |
| 162 | + ? declaration.delete.before |
| 163 | + : declaration.delete.before |
| 164 | + ? [declaration.delete.before as DeleteBeforeHook<any>] |
| 165 | + : [] |
| 166 | + |
| 167 | + declaration.delete.before = injectFunctions.deleteBefore |
| 168 | + ? injectFunctions.deleteBefore(declaration.model, beforeDelete) |
| 169 | + : beforeDelete |
| 170 | + |
| 171 | + const afterDelete: DeleteAfterHook<any>[] = Array.isArray( |
| 172 | + declaration.delete.after |
| 173 | + ) |
| 174 | + ? declaration.delete.after |
| 175 | + : declaration.delete.after |
| 176 | + ? [declaration.delete.after as DeleteAfterHook<any>] |
| 177 | + : [] |
| 178 | + |
| 179 | + declaration.delete.after = injectFunctions.deleteAfter |
| 180 | + ? injectFunctions.deleteAfter(declaration.model, afterDelete) |
| 181 | + : afterDelete |
| 182 | + } |
| 183 | + } |
| 184 | + } |
| 185 | + |
| 186 | + return graphqlSchemaDeclaration |
| 187 | +} |
0 commit comments