1 |
|
2 | import {Repo} from "./Repo"
|
3 | import {NoReflectionMetataError} from './Errors'
|
4 | import {IModel, IModelType} from "./ModelTypes"
|
5 | import {IIndexOptions,IPlugin} from "./PluginTypes";
|
6 | import {isNumber} from './Util'
|
7 |
|
8 |
|
9 | export * from './ModelTypes'
|
10 | export * from './PluginTypes'
|
11 |
|
12 |
|
13 | export enum ModelPersistenceEventType {
|
14 | Save = 1,
|
15 | Remove
|
16 | }
|
17 |
|
18 | export type ModelPersistenceEventCallback<M> = (type:ModelPersistenceEventType,...models:M[]) => void
|
19 |
|
20 |
|
21 |
|
22 |
|
23 | export interface IRepoOptions {
|
24 | indexes?:Array<IIndexOptions>
|
25 | }
|
26 |
|
27 |
|
28 |
|
29 |
|
30 | export interface IFinderOptions {
|
31 | optional?:boolean
|
32 | single?:boolean
|
33 | }
|
34 |
|
35 |
|
36 |
|
37 |
|
38 |
|
39 |
|
40 | export class FinderRequest {
|
41 | extra:any
|
42 | limit:number = -1
|
43 | offset:number = 0
|
44 | sort:string[]
|
45 | sortDirection:'desc'|'asc'
|
46 | includeModels:boolean = null
|
47 |
|
48 | constructor(obj:any)
|
49 | constructor(limit:number,offset:number,includeModels?:boolean,sort?:string[],sortDirection?:'asc'|'desc',extra?:any)
|
50 | constructor(limitOrObject,offset = 0,includeModels:boolean = null,sort:string[] = null,sortDirection:'asc'|'desc' = 'asc',extra:any = null) {
|
51 | if (typeof limitOrObject === 'number') {
|
52 | Object.assign(this,{
|
53 | limit:limitOrObject,
|
54 | offset,
|
55 | includeModels,
|
56 | sort,
|
57 | sortDirection,
|
58 | extra
|
59 | })
|
60 | } else {
|
61 | Object.assign(this,limitOrObject)
|
62 | }
|
63 | }
|
64 | }
|
65 |
|
66 | export interface IFinderItemMetadata {
|
67 | score?:number
|
68 | finderName?:string
|
69 | }
|
70 |
|
71 |
|
72 |
|
73 |
|
74 | export class FinderResultArray<T> extends Array<T> {
|
75 |
|
76 | pageNumber:number = -1
|
77 | pageCount:number = -1
|
78 |
|
79 | constructor(
|
80 | items:T[],
|
81 | public total:number,
|
82 | public request:FinderRequest = null,
|
83 | public itemMetadata:IFinderItemMetadata[] = null
|
84 | ) {
|
85 | super(items.length)
|
86 | items.forEach((item,index) => this[index] = item)
|
87 |
|
88 | if (request) {
|
89 | this.pageCount = Math.ceil(total / request.limit)
|
90 | this.pageNumber = isNumber(request.offset) ?
|
91 | Math.floor(request.offset / request.limit) :
|
92 | -1
|
93 | }
|
94 | }
|
95 | }
|
96 |
|
97 |
|
98 |
|
99 |
|
100 |
|
101 | export class DefaultModel implements IModel {
|
102 | get clazzType() {
|
103 | const type = Reflect.getOwnMetadata('design:type',this)
|
104 | if (!type)
|
105 | throw new NoReflectionMetataError('Unable to reflect type information')
|
106 |
|
107 | return type.name
|
108 | }
|
109 |
|
110 | }
|
111 |
|
112 |
|
113 |
|
114 |
|
115 | export enum SyncStrategy {
|
116 | Overwrite,
|
117 | Update,
|
118 | None
|
119 | }
|
120 |
|
121 | export namespace SyncStrategy {
|
122 | export const toString = (strategy:SyncStrategy):string => {
|
123 | return SyncStrategy[strategy]
|
124 | }
|
125 | }
|
126 |
|
127 |
|
128 |
|
129 |
|
130 |
|
131 | export interface ICoordinatorOptions {
|
132 | immutable?:boolean
|
133 | syncStrategy?: SyncStrategy
|
134 | autoRegisterModels?: boolean
|
135 | }
|
136 |
|
137 |
|
138 |
|
139 |
|
140 | export class CoordinatorOptions implements ICoordinatorOptions {
|
141 |
|
142 | |
143 |
|
144 |
|
145 |
|
146 |
|
147 | static Defaults = {
|
148 | autoRegisterModules:true,
|
149 | syncStrategy: SyncStrategy.None,
|
150 | immutable: false
|
151 | }
|
152 |
|
153 | constructor(opts = {}) {
|
154 | Object.assign(this,opts,CoordinatorOptions.Defaults)
|
155 | }
|
156 | }
|
157 |
|
158 |
|
159 | export interface IModelMapperDecorator<M> {
|
160 | (json:any,model:M):M
|
161 | }
|
162 |
|
163 |
|
164 |
|
165 |
|
166 | export interface IModelMapper<M extends IModel> {
|
167 | toObject(o:M):Object
|
168 | toJson(o:M):string
|
169 | fromObject(json:Object,decorator?:IModelMapperDecorator<M>):M
|
170 | fromJson(json:string,decorator?:IModelMapperDecorator<M>):M
|
171 | }
|
172 |
|
173 |
|
174 |
|
175 |
|
176 | export interface IPredicate {
|
177 | (val:any):boolean
|
178 | }
|
179 |
|
180 |
|
181 |
|
182 |
|
183 | export interface IPredicateFactory {
|
184 | (...args:any[]):IPredicate
|
185 | }
|
186 |
|
187 |
|
188 |
|
189 |
|
190 | export interface ITypedPredicate<T> {
|
191 | (val:T):boolean
|
192 | }
|
193 |
|
194 |
|
195 |
|
196 |
|
197 | export interface ITypedPredicateFactory<T> {
|
198 | (type:{new():T},...args:any[]):ITypedPredicate<T>
|
199 | }
|
200 |
|
201 |
|
202 |
|
203 |
|
204 |
|
205 |
|
206 |
|
207 |
|
208 | export interface ICoordinator {
|
209 | getOptions():ICoordinatorOptions
|
210 | getModels():IModelType[]
|
211 | getModel(clazz:any):IModelType
|
212 | getModelByName(name:string)
|
213 | start(...models):Promise<ICoordinator>
|
214 | init(opts:ICoordinatorOptions, ...plugins:IPlugin[]):Promise<ICoordinator>
|
215 | reset():Promise<ICoordinator>
|
216 | getRepo<T extends Repo<M>,M extends IModel>(clazz:{new(): T; }):T
|
217 | }
|
218 |
|
219 |
|