@glissandoo/lib 1.59.2 → 1.61.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/functions/auth.js +1 -2
- package/functions/communication.js +1 -2
- package/functions/communicationComment.js +1 -2
- package/functions/customer.js +1 -2
- package/functions/customerGroup.js +1 -2
- package/functions/event.js +2 -5
- package/functions/eventPlayer.js +2 -5
- package/functions/eventRepertory.js +1 -2
- package/functions/federation.js +1 -2
- package/functions/federationPartnership.js +1 -2
- package/functions/group.js +1 -2
- package/functions/groupPlayer.js +1 -2
- package/functions/groupRepertory.js +1 -2
- package/functions/index.js +2 -5
- package/functions/jwt.js +1 -2
- package/functions/misc.js +1 -2
- package/functions/notification.js +1 -2
- package/functions/partner.js +1 -2
- package/functions/partnership.js +1 -2
- package/functions/partnershipGroup.js +1 -2
- package/functions/partnershipPlan.js +1 -2
- package/functions/regions.js +124 -128
- package/functions/subscription.js +1 -2
- package/functions/user.js +1 -2
- package/helpers/appScenes.js +2 -5
- package/helpers/audios.js +5 -9
- package/helpers/auth.js +5 -9
- package/helpers/badges.js +10 -19
- package/helpers/collections.js +2 -5
- package/helpers/countries.js +1 -4
- package/helpers/dlinks.js +2 -5
- package/helpers/errors.js +2 -5
- package/helpers/fileSections/index.js +5 -8
- package/helpers/fileSections/orders.js +11 -16
- package/helpers/glissandooAdmin.js +2 -6
- package/helpers/instruments/index.js +3 -6
- package/helpers/instruments/lists.js +11 -19
- package/helpers/musicStyles/index.js +29 -36
- package/helpers/musicStyles/orders.js +174 -179
- package/helpers/notifications/index.js +119 -122
- package/helpers/notifications/placeholders.js +18 -26
- package/helpers/objects.js +15 -23
- package/helpers/payments.js +5 -8
- package/helpers/plans.js +6 -9
- package/helpers/rates.js +2 -6
- package/helpers/reasons.js +17 -21
- package/helpers/slate.js +5 -12
- package/helpers/styles.js +1 -4
- package/helpers/ts-extras/array-includes.js +1 -5
- package/helpers/ts-extras/as-mutable.js +1 -5
- package/helpers/ts-extras/assert-error.js +1 -5
- package/helpers/ts-extras/index.js +15 -33
- package/helpers/ts-extras/is-defined.js +1 -5
- package/helpers/ts-extras/is-empty.js +1 -5
- package/helpers/ts-extras/is-finite.js +1 -4
- package/helpers/ts-extras/is-infinite.js +1 -5
- package/helpers/ts-extras/is-integer.js +1 -4
- package/helpers/ts-extras/is-present.js +1 -5
- package/helpers/ts-extras/is-safe-integer.js +1 -4
- package/helpers/ts-extras/object-entries.js +1 -4
- package/helpers/ts-extras/object-from-entries.js +1 -4
- package/helpers/ts-extras/object-has-own.js +1 -5
- package/helpers/ts-extras/object-keys.js +1 -4
- package/helpers/ts-extras/set-has.js +1 -5
- package/helpers/types.js +2 -5
- package/helpers/utils.js +8 -16
- package/lang/index.js +42 -51
- package/models/Communication/Comment/index.d.ts +4 -4
- package/models/Communication/Comment/index.js +5 -12
- package/models/Communication/Comment/types.d.ts +1 -1
- package/models/Communication/Comment/types.js +1 -2
- package/models/Communication/index.d.ts +6 -5
- package/models/Communication/index.js +15 -21
- package/models/Communication/types.d.ts +1 -1
- package/models/Communication/types.js +4 -7
- package/models/Counters/Group/Analytics/index.d.ts +3 -4
- package/models/Counters/Group/Analytics/index.js +5 -12
- package/models/Counters/Group/Analytics/types.d.ts +1 -1
- package/models/Counters/Group/Analytics/types.js +2 -5
- package/models/Counters/Group/index.d.ts +3 -4
- package/models/Counters/Group/index.js +2 -8
- package/models/Counters/Group/types.d.ts +1 -1
- package/models/Counters/Group/types.js +1 -2
- package/models/Counters/event.d.ts +2 -2
- package/models/Counters/event.js +2 -8
- package/models/Counters/index.d.ts +2 -3
- package/models/Counters/index.js +2 -8
- package/models/Counters/types.js +1 -2
- package/models/Customer/Group/index.d.ts +6 -6
- package/models/Customer/Group/index.js +7 -14
- package/models/Customer/Group/types.d.ts +1 -1
- package/models/Customer/Group/types.js +1 -2
- package/models/Customer/basic.d.ts +2 -3
- package/models/Customer/basic.js +4 -10
- package/models/Customer/index.d.ts +3 -3
- package/models/Customer/index.js +5 -11
- package/models/Customer/types.d.ts +1 -1
- package/models/Customer/types.js +2 -5
- package/models/Evento/Player/basic.js +10 -11
- package/models/Evento/Player/index.d.ts +4 -4
- package/models/Evento/Player/index.js +12 -18
- package/models/Evento/Player/types.d.ts +1 -1
- package/models/Evento/Player/types.js +4 -7
- package/models/Evento/Repertory/index.d.ts +3 -3
- package/models/Evento/Repertory/index.js +3 -10
- package/models/Evento/Repertory/types.d.ts +1 -1
- package/models/Evento/Repertory/types.js +1 -2
- package/models/Evento/basic.d.ts +5 -5
- package/models/Evento/basic.js +12 -18
- package/models/Evento/index.d.ts +11 -10
- package/models/Evento/index.js +32 -38
- package/models/Evento/promoter.d.ts +3 -2
- package/models/Evento/promoter.js +2 -8
- package/models/Evento/tiny.d.ts +1 -1
- package/models/Evento/tiny.js +9 -9
- package/models/Evento/types.d.ts +1 -1
- package/models/Evento/types.js +14 -17
- package/models/Federation/Partnership/index.d.ts +4 -4
- package/models/Federation/Partnership/index.js +3 -10
- package/models/Federation/Partnership/types.d.ts +1 -1
- package/models/Federation/Partnership/types.js +1 -2
- package/models/Federation/index.d.ts +5 -6
- package/models/Federation/index.js +7 -13
- package/models/Federation/types.d.ts +1 -1
- package/models/Federation/types.js +1 -2
- package/models/Group/Analytics/index.d.ts +3 -4
- package/models/Group/Analytics/index.js +5 -12
- package/models/Group/Analytics/types.d.ts +1 -1
- package/models/Group/Analytics/types.js +2 -5
- package/models/Group/Event/index.d.ts +3 -3
- package/models/Group/Event/index.js +6 -12
- package/models/Group/Event/types.d.ts +1 -1
- package/models/Group/Event/types.js +1 -2
- package/models/Group/Player/Event/index.d.ts +3 -3
- package/models/Group/Player/Event/index.js +11 -18
- package/models/Group/Player/Event/types.d.ts +1 -1
- package/models/Group/Player/Event/types.js +1 -2
- package/models/Group/Player/Log/index.d.ts +3 -4
- package/models/Group/Player/Log/index.js +2 -8
- package/models/Group/Player/Log/types.d.ts +1 -1
- package/models/Group/Player/Log/types.js +1 -2
- package/models/Group/Player/index.d.ts +5 -5
- package/models/Group/Player/index.js +18 -24
- package/models/Group/Player/types.d.ts +1 -1
- package/models/Group/Player/types.js +2 -5
- package/models/Group/Repertory/File/Section/index.js +12 -16
- package/models/Group/Repertory/File/Section/types.js +2 -5
- package/models/Group/Repertory/File/index.js +11 -12
- package/models/Group/Repertory/File/types.js +1 -2
- package/models/Group/Repertory/FilePath/index.js +12 -15
- package/models/Group/Repertory/index.d.ts +8 -8
- package/models/Group/Repertory/index.js +25 -32
- package/models/Group/Repertory/types.d.ts +1 -1
- package/models/Group/Repertory/types.js +2 -5
- package/models/Group/StageTemplate/index.d.ts +4 -5
- package/models/Group/StageTemplate/index.js +2 -8
- package/models/Group/StageTemplate/types.d.ts +1 -1
- package/models/Group/StageTemplate/types.js +1 -2
- package/models/Group/basic.d.ts +3 -3
- package/models/Group/basic.js +5 -11
- package/models/Group/index.d.ts +7 -6
- package/models/Group/index.js +41 -47
- package/models/Group/types.d.ts +1 -1
- package/models/Group/types.js +14 -17
- package/models/Instrument/group.js +6 -11
- package/models/Instrument/index.js +8 -9
- package/models/Metrics/index.d.ts +4 -5
- package/models/Metrics/index.js +10 -16
- package/models/Metrics/types.d.ts +1 -1
- package/models/Metrics/types.js +1 -2
- package/models/Model/index.d.ts +16 -4
- package/models/Model/index.js +8 -7
- package/models/Model/lang.d.ts +2 -3
- package/models/Model/lang.js +5 -10
- package/models/MusicStyle/index.js +9 -10
- package/models/Notification/index.d.ts +4 -5
- package/models/Notification/index.js +2 -8
- package/models/Notification/types.d.ts +1 -1
- package/models/Notification/types.js +2 -5
- package/models/Partner/basic.d.ts +5 -5
- package/models/Partner/basic.js +6 -12
- package/models/Partner/index.d.ts +3 -3
- package/models/Partner/index.js +4 -10
- package/models/Partner/tiny.d.ts +2 -3
- package/models/Partner/tiny.js +2 -8
- package/models/Partner/types.d.ts +1 -1
- package/models/Partner/types.js +2 -5
- package/models/Partnership/Group/index.d.ts +4 -4
- package/models/Partnership/Group/index.js +5 -12
- package/models/Partnership/Group/types.d.ts +1 -1
- package/models/Partnership/Group/types.js +1 -2
- package/models/Partnership/Partner/Subscription/index.d.ts +6 -6
- package/models/Partnership/Partner/Subscription/index.js +8 -15
- package/models/Partnership/Partner/Subscription/types.d.ts +1 -1
- package/models/Partnership/Partner/Subscription/types.js +2 -5
- package/models/Partnership/Partner/index.d.ts +2 -2
- package/models/Partnership/Partner/index.js +3 -10
- package/models/Partnership/Partner/types.js +1 -2
- package/models/Partnership/Payment/index.d.ts +2 -2
- package/models/Partnership/Payment/index.js +2 -8
- package/models/Partnership/Payment/types.js +1 -2
- package/models/Partnership/Plan/basic.d.ts +2 -3
- package/models/Partnership/Plan/basic.js +12 -18
- package/models/Partnership/Plan/index.d.ts +4 -4
- package/models/Partnership/Plan/index.js +3 -10
- package/models/Partnership/Plan/types.d.ts +1 -1
- package/models/Partnership/Plan/types.js +2 -5
- package/models/Partnership/basic.d.ts +2 -3
- package/models/Partnership/basic.js +4 -10
- package/models/Partnership/index.d.ts +5 -5
- package/models/Partnership/index.js +5 -11
- package/models/Partnership/types.d.ts +1 -1
- package/models/Partnership/types.js +4 -7
- package/models/Payment/basic.d.ts +3 -4
- package/models/Payment/basic.js +7 -13
- package/models/Payment/index.d.ts +2 -2
- package/models/Payment/index.js +2 -8
- package/models/Payment/types.d.ts +1 -1
- package/models/Payment/types.js +4 -7
- package/models/Player/basic.d.ts +2 -2
- package/models/Player/basic.js +4 -10
- package/models/Player/types.js +1 -2
- package/models/Repertory/basic.d.ts +2 -3
- package/models/Repertory/basic.js +2 -8
- package/models/Repertory/types.js +1 -2
- package/models/User/Group/index.d.ts +3 -3
- package/models/User/Group/index.js +8 -15
- package/models/User/Group/types.d.ts +1 -1
- package/models/User/Group/types.js +1 -2
- package/models/User/Notification/index.d.ts +6 -6
- package/models/User/Notification/index.js +18 -20
- package/models/User/Notification/types.d.ts +1 -1
- package/models/User/Notification/types.js +1 -2
- package/models/User/basic.d.ts +2 -2
- package/models/User/basic.js +4 -10
- package/models/User/index.d.ts +8 -8
- package/models/User/index.js +18 -24
- package/models/User/types.d.ts +1 -1
- package/models/User/types.js +12 -15
- package/models/WebhookEvent/index.d.ts +3 -4
- package/models/WebhookEvent/index.js +2 -8
- package/models/WebhookEvent/types.d.ts +1 -1
- package/models/WebhookEvent/types.js +2 -5
- package/package.json +2 -1
- package/types/firestore.js +2 -5
- package/types/messagebirdChatWidget.js +1 -2
|
@@ -1,28 +1,22 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
const basic_1 = __importDefault(require("../../Repertory/basic"));
|
|
16
|
-
const types_1 = require("./File/Section/types");
|
|
17
|
-
const types_2 = require("./types");
|
|
18
|
-
class GroupRepertory extends basic_1.default {
|
|
19
|
-
constructor(doc, lang = lang_1.defaultLocale) {
|
|
1
|
+
import endOfDay from 'date-fns/endOfDay';
|
|
2
|
+
import isFuture from 'date-fns/isFuture';
|
|
3
|
+
import { uniq } from 'lodash';
|
|
4
|
+
import orderBy from 'lodash/orderBy';
|
|
5
|
+
import { mapToArray } from '../../../helpers/objects';
|
|
6
|
+
import { objectEntries } from '../../../helpers/ts-extras';
|
|
7
|
+
import { defaultLocale } from '../../../lang';
|
|
8
|
+
import EventoTiny from '../../Evento/tiny';
|
|
9
|
+
import Theme from '../../Repertory/basic';
|
|
10
|
+
import { FileSectionIdReserved } from './File/Section/types';
|
|
11
|
+
import { GroupRepertoireVisibility } from './types';
|
|
12
|
+
export default class GroupRepertory extends Theme {
|
|
13
|
+
lang = defaultLocale;
|
|
14
|
+
constructor(doc, lang = defaultLocale) {
|
|
20
15
|
super(doc);
|
|
21
|
-
this.lang = lang_1.defaultLocale;
|
|
22
16
|
this.lang = lang;
|
|
23
17
|
}
|
|
24
18
|
get groupId() {
|
|
25
|
-
return
|
|
19
|
+
return this.ref.path.split('/').at(-3);
|
|
26
20
|
}
|
|
27
21
|
get tagsAlgolia() {
|
|
28
22
|
return this.data.tagsAlgolia || [];
|
|
@@ -39,10 +33,10 @@ class GroupRepertory extends basic_1.default {
|
|
|
39
33
|
return this.data.files || {};
|
|
40
34
|
}
|
|
41
35
|
get fileList() {
|
|
42
|
-
return
|
|
36
|
+
return mapToArray(this.files);
|
|
43
37
|
}
|
|
44
38
|
get sectionIds() {
|
|
45
|
-
return
|
|
39
|
+
return uniq(this.fileList.map((file) => Object.keys(file.sections)).flat());
|
|
46
40
|
}
|
|
47
41
|
get filesPath() {
|
|
48
42
|
return this.data.filesPath || {};
|
|
@@ -57,7 +51,7 @@ class GroupRepertory extends basic_1.default {
|
|
|
57
51
|
return this.data.mainFilePath;
|
|
58
52
|
}
|
|
59
53
|
get visibility() {
|
|
60
|
-
return this.data.visibility ||
|
|
54
|
+
return this.data.visibility || GroupRepertoireVisibility.ByEvent;
|
|
61
55
|
}
|
|
62
56
|
get votes() {
|
|
63
57
|
return this.data.votes || {};
|
|
@@ -81,11 +75,11 @@ class GroupRepertory extends basic_1.default {
|
|
|
81
75
|
return this.data.eventsTL || {};
|
|
82
76
|
}
|
|
83
77
|
get eventsList() {
|
|
84
|
-
return Object.keys(this.eventsTL).map((id) => new
|
|
78
|
+
return Object.keys(this.eventsTL).map((id) => new EventoTiny(id, this.eventsTL[id], this.lang));
|
|
85
79
|
}
|
|
86
80
|
/** @deprecated use getNextEvents */
|
|
87
81
|
get nextEvents() {
|
|
88
|
-
return this.getEventsByOrder().filter((ev) => (
|
|
82
|
+
return this.getEventsByOrder().filter((ev) => isFuture(ev.datetime.toDate()));
|
|
89
83
|
}
|
|
90
84
|
/** @deprecated use getNextEvent */
|
|
91
85
|
get nextEvent() {
|
|
@@ -132,8 +126,8 @@ class GroupRepertory extends basic_1.default {
|
|
|
132
126
|
return this.data.claims || {};
|
|
133
127
|
}
|
|
134
128
|
get claimsList() {
|
|
135
|
-
return
|
|
136
|
-
.map(([iId, users]) =>
|
|
129
|
+
return objectEntries(this.claims)
|
|
130
|
+
.map(([iId, users]) => objectEntries(users || {}).map(([userId, claim]) => ({
|
|
137
131
|
userId,
|
|
138
132
|
instrumentId: iId,
|
|
139
133
|
hasFile: this.hasInstrumentAFile(iId),
|
|
@@ -142,7 +136,7 @@ class GroupRepertory extends basic_1.default {
|
|
|
142
136
|
.flat();
|
|
143
137
|
}
|
|
144
138
|
hasInstrumentAFile(instrumentId) {
|
|
145
|
-
return (this.sectionIds.includes(
|
|
139
|
+
return (this.sectionIds.includes(FileSectionIdReserved.All) ||
|
|
146
140
|
this.sectionIds.includes(instrumentId));
|
|
147
141
|
}
|
|
148
142
|
claimsByInstrument(instrumentId) {
|
|
@@ -172,10 +166,10 @@ class GroupRepertory extends basic_1.default {
|
|
|
172
166
|
return this.instruments.find((i) => i.id === id);
|
|
173
167
|
}
|
|
174
168
|
getEventsByOrder(order = 'desc') {
|
|
175
|
-
return (
|
|
169
|
+
return orderBy(this.eventsList, (e) => e.datetime.toDate(), [order]);
|
|
176
170
|
}
|
|
177
171
|
getNextEvents(endDay = false) {
|
|
178
|
-
return this.getEventsByOrder().filter((ev) => endDay ? (
|
|
172
|
+
return this.getEventsByOrder().filter((ev) => endDay ? isFuture(endOfDay(ev.datetime.toDate())) : isFuture(ev.datetime.toDate()));
|
|
179
173
|
}
|
|
180
174
|
getNextEvent(endDay = false) {
|
|
181
175
|
const events = this.getNextEvents(endDay);
|
|
@@ -185,4 +179,3 @@ class GroupRepertory extends basic_1.default {
|
|
|
185
179
|
return events[events.length - 1];
|
|
186
180
|
}
|
|
187
181
|
}
|
|
188
|
-
exports.default = GroupRepertory;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
+
import { DocumentReference, Timestamp } from '@google-cloud/firestore';
|
|
1
2
|
import { InstrumentId } from '../../../helpers/instruments';
|
|
2
|
-
import { DocumentReference, Timestamp } from '../../../types/firestore';
|
|
3
3
|
import { EventTinyData } from '../../Evento/types';
|
|
4
4
|
import { ThemeBasicData } from '../../Repertory/types';
|
|
5
5
|
import { FileSectionId } from './File/Section/types';
|
|
@@ -1,8 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.GroupRepertoireVisibility = void 0;
|
|
4
|
-
var GroupRepertoireVisibility;
|
|
1
|
+
export var GroupRepertoireVisibility;
|
|
5
2
|
(function (GroupRepertoireVisibility) {
|
|
6
3
|
GroupRepertoireVisibility["Always"] = "always";
|
|
7
4
|
GroupRepertoireVisibility["ByEvent"] = "byEvent";
|
|
8
|
-
})(GroupRepertoireVisibility
|
|
5
|
+
})(GroupRepertoireVisibility || (GroupRepertoireVisibility = {}));
|
|
@@ -1,13 +1,12 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import Model from '../../Model';
|
|
1
|
+
import Model, { DocumentModel } from '../../Model';
|
|
3
2
|
import { StageTemplateData } from './types';
|
|
4
3
|
export default class GroupStageTemplate extends Model<StageTemplateData> {
|
|
5
|
-
constructor(doc:
|
|
4
|
+
constructor(doc: DocumentModel);
|
|
6
5
|
get title(): string;
|
|
7
6
|
get boardMap(): Record<string, import("./types").BoardCoordinates>;
|
|
8
7
|
get boardSettings(): import("./types").BoardSettings;
|
|
9
8
|
get updatedBy(): string;
|
|
10
|
-
get updatedAt():
|
|
9
|
+
get updatedAt(): FirebaseFirestore.Timestamp;
|
|
11
10
|
get createdBy(): string;
|
|
12
|
-
get createdAt():
|
|
11
|
+
get createdAt(): FirebaseFirestore.Timestamp;
|
|
13
12
|
}
|
|
@@ -1,10 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
const Model_1 = __importDefault(require("../../Model"));
|
|
7
|
-
class GroupStageTemplate extends Model_1.default {
|
|
1
|
+
import Model from '../../Model';
|
|
2
|
+
export default class GroupStageTemplate extends Model {
|
|
8
3
|
constructor(doc) {
|
|
9
4
|
super(doc);
|
|
10
5
|
}
|
|
@@ -30,4 +25,3 @@ class GroupStageTemplate extends Model_1.default {
|
|
|
30
25
|
return this.data.createdAt;
|
|
31
26
|
}
|
|
32
27
|
}
|
|
33
|
-
exports.default = GroupStageTemplate;
|
|
@@ -1,2 +1 @@
|
|
|
1
|
-
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
1
|
+
export {};
|
package/models/Group/basic.d.ts
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
import { LanguagesTypes } from '../../lang';
|
|
2
|
-
import {
|
|
2
|
+
import { DocumentModel } from '../Model';
|
|
3
3
|
import ModelWithLang from '../Model/lang';
|
|
4
4
|
import { GroupBasicData, GroupTinyData } from './types';
|
|
5
5
|
export default class GroupBasic<D> extends ModelWithLang<D & GroupBasicData> {
|
|
6
|
-
constructor(doc:
|
|
6
|
+
constructor(doc: DocumentModel, lang?: LanguagesTypes);
|
|
7
7
|
get tinyInfo(): GroupTinyData;
|
|
8
8
|
get basicInfo(): GroupBasicData;
|
|
9
9
|
get displayName(): string;
|
|
10
10
|
get photoURL(): string;
|
|
11
11
|
get locality(): string;
|
|
12
|
-
get location():
|
|
12
|
+
get location(): FirebaseFirestore.GeoPoint;
|
|
13
13
|
get username(): string;
|
|
14
14
|
get musicStyle(): string;
|
|
15
15
|
get musicStyleString(): string;
|
package/models/Group/basic.js
CHANGED
|
@@ -1,12 +1,7 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
const lang_1 = require("../../lang");
|
|
7
|
-
const lang_2 = __importDefault(require("../Model/lang"));
|
|
8
|
-
class GroupBasic extends lang_2.default {
|
|
9
|
-
constructor(doc, lang = lang_1.defaultLocale) {
|
|
1
|
+
import { defaultLocale, getTranslation } from '../../lang';
|
|
2
|
+
import ModelWithLang from '../Model/lang';
|
|
3
|
+
export default class GroupBasic extends ModelWithLang {
|
|
4
|
+
constructor(doc, lang = defaultLocale) {
|
|
10
5
|
super(doc, lang);
|
|
11
6
|
}
|
|
12
7
|
get tinyInfo() {
|
|
@@ -44,8 +39,7 @@ class GroupBasic extends lang_2.default {
|
|
|
44
39
|
return this.data.musicStyle;
|
|
45
40
|
}
|
|
46
41
|
get musicStyleString() {
|
|
47
|
-
const translation =
|
|
42
|
+
const translation = getTranslation(`musicStyles.${this.musicStyle}`, this.lang);
|
|
48
43
|
return translation || this.musicStyle;
|
|
49
44
|
}
|
|
50
45
|
}
|
|
51
|
-
exports.default = GroupBasic;
|
package/models/Group/index.d.ts
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
|
+
import { DocumentReference } from '@google-cloud/firestore';
|
|
1
2
|
import { PlansGroup } from '../../helpers/plans';
|
|
2
3
|
import { LanguagesTypes } from '../../lang';
|
|
3
|
-
import {
|
|
4
|
+
import { DocumentModel } from '../Model';
|
|
4
5
|
import GroupBasic from './basic';
|
|
5
6
|
import { GroupConfigShowAttendanceToMembers, GroupData, GroupStatus, SocialNetwork } from './types';
|
|
6
7
|
export default class Group extends GroupBasic<GroupData> {
|
|
7
|
-
constructor(doc:
|
|
8
|
+
constructor(doc: DocumentModel, lang?: LanguagesTypes);
|
|
8
9
|
get owner(): DocumentReference;
|
|
9
10
|
get playerIds(): string[];
|
|
10
11
|
get players(): Record<string, import("../Player/types").PlayerBasicData>;
|
|
@@ -17,8 +18,8 @@ export default class Group extends GroupBasic<GroupData> {
|
|
|
17
18
|
get invitationEmails(): string[];
|
|
18
19
|
get shortDynamicLink(): string;
|
|
19
20
|
get admins(): string[];
|
|
20
|
-
get createdAt():
|
|
21
|
-
get deletedAt():
|
|
21
|
+
get createdAt(): FirebaseFirestore.Timestamp;
|
|
22
|
+
get deletedAt(): FirebaseFirestore.Timestamp | null;
|
|
22
23
|
get repertoryCount(): number;
|
|
23
24
|
get eventCount(): Record<import("../Evento/types").EventType, number>;
|
|
24
25
|
get performanceCount(): number;
|
|
@@ -60,7 +61,7 @@ export default class Group extends GroupBasic<GroupData> {
|
|
|
60
61
|
isAdmin: (userId: string) => boolean;
|
|
61
62
|
isPlayer: (userId: string) => boolean;
|
|
62
63
|
get isExpiredTrial(): boolean;
|
|
63
|
-
get firstAnswerAt():
|
|
64
|
+
get firstAnswerAt(): FirebaseFirestore.Timestamp | null;
|
|
64
65
|
get repertoireTags(): Record<string, import("./types").GroupRepertoireTag>;
|
|
65
66
|
get repertoireTagsList(): (import("./types").GroupRepertoireTag & {
|
|
66
67
|
id: string;
|
|
@@ -76,6 +77,6 @@ export default class Group extends GroupBasic<GroupData> {
|
|
|
76
77
|
id: import("../../helpers/instruments").DefaultInstrumentId | `customInstrument-${string}`;
|
|
77
78
|
}), "id">[];
|
|
78
79
|
get instrumentsIds(): (import("../../helpers/instruments").DefaultInstrumentId | `customInstrument-${string}`)[];
|
|
79
|
-
get visitedDashboardAt(): Record<string,
|
|
80
|
+
get visitedDashboardAt(): Record<string, FirebaseFirestore.Timestamp>;
|
|
80
81
|
get onboardingMessages(): import("./types").GroupOnboardingMessage[];
|
|
81
82
|
}
|
package/models/Group/index.js
CHANGED
|
@@ -1,30 +1,16 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
};
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
const lang_1 = require("../../lang");
|
|
14
|
-
const basic_1 = __importDefault(require("./basic"));
|
|
15
|
-
const types_1 = require("./types");
|
|
16
|
-
class Group extends basic_1.default {
|
|
17
|
-
constructor(doc, lang = lang_1.defaultLocale) {
|
|
1
|
+
import { addMonths, isPast } from 'date-fns';
|
|
2
|
+
import { isNull } from 'lodash';
|
|
3
|
+
import { CollectionNames } from '../../helpers/collections';
|
|
4
|
+
import { getGlissandooAdminEntityURL } from '../../helpers/glissandooAdmin';
|
|
5
|
+
import { orderByMusicStyle } from '../../helpers/musicStyles/orders';
|
|
6
|
+
import { mapToArray, orderedMapToArray } from '../../helpers/objects';
|
|
7
|
+
import { PlansGroup, membersPerPlan } from '../../helpers/plans';
|
|
8
|
+
import { defaultLocale, getTranslation } from '../../lang';
|
|
9
|
+
import GroupBasic from './basic';
|
|
10
|
+
import { GroupConfigKey, GroupConfigShowAttendanceToMembers, GroupStatus, SocialNetwork, } from './types';
|
|
11
|
+
export default class Group extends GroupBasic {
|
|
12
|
+
constructor(doc, lang = defaultLocale) {
|
|
18
13
|
super(doc, lang);
|
|
19
|
-
this.getPlayer = (userId) => {
|
|
20
|
-
return userId in this.players ? this.players[userId] : null;
|
|
21
|
-
};
|
|
22
|
-
this.isAdmin = (userId) => {
|
|
23
|
-
return this.admins.includes(userId);
|
|
24
|
-
};
|
|
25
|
-
this.isPlayer = (userId) => {
|
|
26
|
-
return this.playerIds.includes(userId);
|
|
27
|
-
};
|
|
28
14
|
}
|
|
29
15
|
get owner() {
|
|
30
16
|
return this.data.owner;
|
|
@@ -97,13 +83,13 @@ class Group extends basic_1.default {
|
|
|
97
83
|
...this.players[playerId],
|
|
98
84
|
id: playerId,
|
|
99
85
|
}));
|
|
100
|
-
return
|
|
86
|
+
return orderByMusicStyle(players, 'mainInstrument', this.musicStyle);
|
|
101
87
|
}
|
|
102
88
|
get isActive() {
|
|
103
89
|
return this.exists && !this.deletedAt;
|
|
104
90
|
}
|
|
105
91
|
get isDeleted() {
|
|
106
|
-
return !this.exists || !
|
|
92
|
+
return !this.exists || !isNull(this.deletedAt);
|
|
107
93
|
}
|
|
108
94
|
get intercomId() {
|
|
109
95
|
return this.data.intercom_id || null;
|
|
@@ -119,10 +105,10 @@ class Group extends basic_1.default {
|
|
|
119
105
|
return this.data.socialNetworks;
|
|
120
106
|
}
|
|
121
107
|
return {
|
|
122
|
-
[
|
|
123
|
-
[
|
|
124
|
-
[
|
|
125
|
-
[
|
|
108
|
+
[SocialNetwork.Facebook]: null,
|
|
109
|
+
[SocialNetwork.Twitter]: null,
|
|
110
|
+
[SocialNetwork.Instagram]: null,
|
|
111
|
+
[SocialNetwork.YouTube]: null,
|
|
126
112
|
};
|
|
127
113
|
}
|
|
128
114
|
getSocialNetworkUrl(id) {
|
|
@@ -133,12 +119,12 @@ class Group extends basic_1.default {
|
|
|
133
119
|
}
|
|
134
120
|
get config() {
|
|
135
121
|
return {
|
|
136
|
-
[
|
|
137
|
-
? this.data.config[
|
|
122
|
+
[GroupConfigKey.IncludesMembersToEventsWhenJoined]: GroupConfigKey.IncludesMembersToEventsWhenJoined in this.data.config
|
|
123
|
+
? this.data.config[GroupConfigKey.IncludesMembersToEventsWhenJoined]
|
|
138
124
|
: true,
|
|
139
|
-
[
|
|
140
|
-
? this.data.config[
|
|
141
|
-
:
|
|
125
|
+
[GroupConfigKey.ShowAttendanceToMembers]: GroupConfigKey.ShowAttendanceToMembers in this.data.config
|
|
126
|
+
? this.data.config[GroupConfigKey.ShowAttendanceToMembers]
|
|
127
|
+
: GroupConfigShowAttendanceToMembers.None,
|
|
142
128
|
};
|
|
143
129
|
}
|
|
144
130
|
get status() {
|
|
@@ -151,7 +137,7 @@ class Group extends basic_1.default {
|
|
|
151
137
|
return this.data.templates || {};
|
|
152
138
|
}
|
|
153
139
|
get templatesList() {
|
|
154
|
-
return
|
|
140
|
+
return mapToArray(this.templates);
|
|
155
141
|
}
|
|
156
142
|
get satisfactionIndex() {
|
|
157
143
|
return this.data.satisfactionIndex || { current: 0, last: 0 };
|
|
@@ -159,11 +145,20 @@ class Group extends basic_1.default {
|
|
|
159
145
|
get metadata() {
|
|
160
146
|
return this.data.metadata || {};
|
|
161
147
|
}
|
|
148
|
+
getPlayer = (userId) => {
|
|
149
|
+
return userId in this.players ? this.players[userId] : null;
|
|
150
|
+
};
|
|
151
|
+
isAdmin = (userId) => {
|
|
152
|
+
return this.admins.includes(userId);
|
|
153
|
+
};
|
|
154
|
+
isPlayer = (userId) => {
|
|
155
|
+
return this.playerIds.includes(userId);
|
|
156
|
+
};
|
|
162
157
|
get isExpiredTrial() {
|
|
163
|
-
const isOutDateTrial =
|
|
158
|
+
const isOutDateTrial = isPast(this.trialEndAt);
|
|
164
159
|
const members = this.activePlayers.length;
|
|
165
|
-
const isAboveMembersLimitPlanFree = members >
|
|
166
|
-
return this.status !==
|
|
160
|
+
const isAboveMembersLimitPlanFree = members > membersPerPlan[PlansGroup.Piano];
|
|
161
|
+
return this.status !== GroupStatus.Premium && isOutDateTrial && isAboveMembersLimitPlanFree;
|
|
167
162
|
}
|
|
168
163
|
get firstAnswerAt() {
|
|
169
164
|
return this.data.firstAnswerAt || null;
|
|
@@ -172,22 +167,22 @@ class Group extends basic_1.default {
|
|
|
172
167
|
return this.data.repertoireTags || {};
|
|
173
168
|
}
|
|
174
169
|
get repertoireTagsList() {
|
|
175
|
-
return
|
|
170
|
+
return mapToArray(this.repertoireTags);
|
|
176
171
|
}
|
|
177
172
|
getRepertoireTagName(id) {
|
|
178
173
|
if (!(id in this.repertoireTags))
|
|
179
174
|
return null;
|
|
180
175
|
const tag = this.repertoireTags[id];
|
|
181
|
-
return tag.default ?
|
|
176
|
+
return tag.default ? getTranslation(tag.title, this.lang) : tag.title;
|
|
182
177
|
}
|
|
183
178
|
get trialEndAt() {
|
|
184
179
|
if (this.data.trialEndAt) {
|
|
185
180
|
return this.data.trialEndAt.toDate();
|
|
186
181
|
}
|
|
187
|
-
return
|
|
182
|
+
return addMonths(this.createdAt.toDate(), 1);
|
|
188
183
|
}
|
|
189
184
|
get glissandooAdminUrl() {
|
|
190
|
-
return
|
|
185
|
+
return getGlissandooAdminEntityURL(CollectionNames.Group, this.id);
|
|
191
186
|
}
|
|
192
187
|
get createdOn() {
|
|
193
188
|
return this.data.createdOn;
|
|
@@ -196,7 +191,7 @@ class Group extends basic_1.default {
|
|
|
196
191
|
return this.data.instruments || {};
|
|
197
192
|
}
|
|
198
193
|
get instrumentsList() {
|
|
199
|
-
return
|
|
194
|
+
return orderedMapToArray(this.instruments);
|
|
200
195
|
}
|
|
201
196
|
get instrumentsIds() {
|
|
202
197
|
return this.instrumentsList.map(({ id }) => id);
|
|
@@ -208,4 +203,3 @@ class Group extends basic_1.default {
|
|
|
208
203
|
return this.data.onboardingMessages || [];
|
|
209
204
|
}
|
|
210
205
|
}
|
|
211
|
-
exports.default = Group;
|
package/models/Group/types.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
+
import { DocumentReference, GeoPoint, Timestamp } from '@google-cloud/firestore';
|
|
1
2
|
import { CustomInstrumentId, DefaultInstrumentId } from '../../helpers/instruments';
|
|
2
3
|
import { MusicStyleType } from '../../helpers/musicStyles';
|
|
3
4
|
import { PlansGroup } from '../../helpers/plans';
|
|
4
|
-
import { DocumentReference, GeoPoint, Timestamp } from '../../types/firestore';
|
|
5
5
|
import { EventType } from '../Evento/types';
|
|
6
6
|
import { PlayerBasicData } from '../Player/types';
|
|
7
7
|
export interface GroupOnboardingMessage {
|
package/models/Group/types.js
CHANGED
|
@@ -1,47 +1,44 @@
|
|
|
1
|
-
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.GroupRepertoireTagDefault = exports.GroupRepertoireTagReserved = exports.SocialNetwork = exports.GroupStatus = exports.GroupConfigShowAttendanceToMembers = exports.GroupConfigKey = exports.GroupCreatedOn = void 0;
|
|
4
|
-
var GroupCreatedOn;
|
|
1
|
+
export var GroupCreatedOn;
|
|
5
2
|
(function (GroupCreatedOn) {
|
|
6
3
|
GroupCreatedOn["Web"] = "web";
|
|
7
4
|
GroupCreatedOn["App"] = "app";
|
|
8
5
|
GroupCreatedOn["Dashboard"] = "dashboard";
|
|
9
|
-
})(GroupCreatedOn
|
|
10
|
-
var GroupConfigKey;
|
|
6
|
+
})(GroupCreatedOn || (GroupCreatedOn = {}));
|
|
7
|
+
export var GroupConfigKey;
|
|
11
8
|
(function (GroupConfigKey) {
|
|
12
9
|
GroupConfigKey["IncludesMembersToEventsWhenJoined"] = "includesMembersToEventsWhenJoined";
|
|
13
10
|
GroupConfigKey["ShowAttendanceToMembers"] = "showAttendanceToMembers";
|
|
14
|
-
})(GroupConfigKey
|
|
15
|
-
var GroupConfigShowAttendanceToMembers;
|
|
11
|
+
})(GroupConfigKey || (GroupConfigKey = {}));
|
|
12
|
+
export var GroupConfigShowAttendanceToMembers;
|
|
16
13
|
(function (GroupConfigShowAttendanceToMembers) {
|
|
17
14
|
GroupConfigShowAttendanceToMembers["None"] = "none";
|
|
18
15
|
GroupConfigShowAttendanceToMembers["OnlyConfirmed"] = "onlyConfirmed";
|
|
19
16
|
GroupConfigShowAttendanceToMembers["OnlyToSection"] = "onlyToSection";
|
|
20
17
|
GroupConfigShowAttendanceToMembers["All"] = "all";
|
|
21
|
-
})(GroupConfigShowAttendanceToMembers
|
|
22
|
-
var GroupStatus;
|
|
18
|
+
})(GroupConfigShowAttendanceToMembers || (GroupConfigShowAttendanceToMembers = {}));
|
|
19
|
+
export var GroupStatus;
|
|
23
20
|
(function (GroupStatus) {
|
|
24
21
|
GroupStatus["Premium"] = "premium";
|
|
25
22
|
GroupStatus["Trial"] = "trial";
|
|
26
23
|
GroupStatus["Inactive"] = "inactive";
|
|
27
24
|
GroupStatus["Deleted"] = "deleted";
|
|
28
|
-
})(GroupStatus
|
|
29
|
-
var SocialNetwork;
|
|
25
|
+
})(GroupStatus || (GroupStatus = {}));
|
|
26
|
+
export var SocialNetwork;
|
|
30
27
|
(function (SocialNetwork) {
|
|
31
28
|
SocialNetwork["Facebook"] = "facebook";
|
|
32
29
|
SocialNetwork["Twitter"] = "twitter";
|
|
33
30
|
SocialNetwork["Instagram"] = "instagram";
|
|
34
31
|
SocialNetwork["YouTube"] = "youtube";
|
|
35
|
-
})(SocialNetwork
|
|
36
|
-
var GroupRepertoireTagReserved;
|
|
32
|
+
})(SocialNetwork || (SocialNetwork = {}));
|
|
33
|
+
export var GroupRepertoireTagReserved;
|
|
37
34
|
(function (GroupRepertoireTagReserved) {
|
|
38
35
|
GroupRepertoireTagReserved["NoTag"] = "$noTag";
|
|
39
|
-
})(GroupRepertoireTagReserved
|
|
40
|
-
var GroupRepertoireTagDefault;
|
|
36
|
+
})(GroupRepertoireTagReserved || (GroupRepertoireTagReserved = {}));
|
|
37
|
+
export var GroupRepertoireTagDefault;
|
|
41
38
|
(function (GroupRepertoireTagDefault) {
|
|
42
39
|
GroupRepertoireTagDefault["First"] = "repertoireTags.1";
|
|
43
40
|
GroupRepertoireTagDefault["Second"] = "repertoireTags.2";
|
|
44
41
|
GroupRepertoireTagDefault["Third"] = "repertoireTags.3";
|
|
45
42
|
GroupRepertoireTagDefault["Fourth"] = "repertoireTags.4";
|
|
46
43
|
GroupRepertoireTagDefault["Principal"] = "repertoireTags.principal";
|
|
47
|
-
})(GroupRepertoireTagDefault
|
|
44
|
+
})(GroupRepertoireTagDefault || (GroupRepertoireTagDefault = {}));
|
|
@@ -1,12 +1,8 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
const _1 = __importDefault(require("."));
|
|
7
|
-
const lang_1 = require("../../lang");
|
|
8
|
-
class GroupInstrument extends _1.default {
|
|
9
|
-
constructor(id, lang = lang_1.defaultLocale, groupInstruments) {
|
|
1
|
+
import Instrument from '.';
|
|
2
|
+
import { defaultLocale, getTranslation } from '../../lang';
|
|
3
|
+
export default class GroupInstrument extends Instrument {
|
|
4
|
+
groupInstruments;
|
|
5
|
+
constructor(id, lang = defaultLocale, groupInstruments) {
|
|
10
6
|
super(id, lang);
|
|
11
7
|
this.groupInstruments = groupInstruments;
|
|
12
8
|
}
|
|
@@ -22,7 +18,7 @@ class GroupInstrument extends _1.default {
|
|
|
22
18
|
if (this.id in this.groupInstruments) {
|
|
23
19
|
return this.groupInstruments[this.id].name;
|
|
24
20
|
}
|
|
25
|
-
return
|
|
21
|
+
return getTranslation('instruments.unknown', this.lang) || this.id;
|
|
26
22
|
}
|
|
27
23
|
get icon() {
|
|
28
24
|
return GroupInstrument.isCustom(this.id) && this.id in this.groupInstruments
|
|
@@ -30,4 +26,3 @@ class GroupInstrument extends _1.default {
|
|
|
30
26
|
: super.icon;
|
|
31
27
|
}
|
|
32
28
|
}
|
|
33
|
-
exports.default = GroupInstrument;
|
|
@@ -1,18 +1,17 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
constructor(id, lang =
|
|
1
|
+
import { InstrumentIcons } from '../../helpers/instruments';
|
|
2
|
+
import { defaultLocale, getTranslation } from '../../lang';
|
|
3
|
+
export default class Instrument {
|
|
4
|
+
id;
|
|
5
|
+
lang;
|
|
6
|
+
constructor(id, lang = defaultLocale) {
|
|
7
7
|
this.id = id;
|
|
8
8
|
this.lang = lang;
|
|
9
9
|
}
|
|
10
10
|
get name() {
|
|
11
|
-
const translation =
|
|
11
|
+
const translation = getTranslation(`instruments.${this.id}`, this.lang);
|
|
12
12
|
return translation || this.id;
|
|
13
13
|
}
|
|
14
14
|
get icon() {
|
|
15
|
-
return
|
|
15
|
+
return InstrumentIcons[this.id] || 'warning';
|
|
16
16
|
}
|
|
17
17
|
}
|
|
18
|
-
exports.default = Instrument;
|
|
@@ -1,9 +1,8 @@
|
|
|
1
|
-
import
|
|
2
|
-
import Model from '../Model';
|
|
1
|
+
import Model, { DocumentModel } from '../Model';
|
|
3
2
|
import { AllowCollections, EntityTypes, MetricsData } from './types';
|
|
4
3
|
export default class Metrics extends Model<MetricsData> {
|
|
5
4
|
private defaultEntity;
|
|
6
|
-
constructor(doc:
|
|
5
|
+
constructor(doc: DocumentModel);
|
|
7
6
|
getEntity: (entity: AllowCollections) => EntityTypes;
|
|
8
7
|
get users(): EntityTypes;
|
|
9
8
|
get groups(): EntityTypes;
|
|
@@ -12,6 +11,6 @@ export default class Metrics extends Model<MetricsData> {
|
|
|
12
11
|
get repertory(): EntityTypes;
|
|
13
12
|
get partnerships(): EntityTypes;
|
|
14
13
|
get partners(): EntityTypes;
|
|
15
|
-
get date():
|
|
16
|
-
get createdAt():
|
|
14
|
+
get date(): FirebaseFirestore.Timestamp;
|
|
15
|
+
get createdAt(): FirebaseFirestore.Timestamp;
|
|
17
16
|
}
|
package/models/Metrics/index.js
CHANGED
|
@@ -1,21 +1,16 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
1
|
+
import Model from '../Model';
|
|
2
|
+
export default class Metrics extends Model {
|
|
3
|
+
defaultEntity = {
|
|
4
|
+
acc: 0,
|
|
5
|
+
count: 0,
|
|
6
|
+
total: 0,
|
|
7
|
+
};
|
|
8
8
|
constructor(doc) {
|
|
9
9
|
super(doc);
|
|
10
|
-
this.defaultEntity = {
|
|
11
|
-
acc: 0,
|
|
12
|
-
count: 0,
|
|
13
|
-
total: 0,
|
|
14
|
-
};
|
|
15
|
-
this.getEntity = (entity) => {
|
|
16
|
-
return this.data[entity] || this.defaultEntity;
|
|
17
|
-
};
|
|
18
10
|
}
|
|
11
|
+
getEntity = (entity) => {
|
|
12
|
+
return this.data[entity] || this.defaultEntity;
|
|
13
|
+
};
|
|
19
14
|
get users() {
|
|
20
15
|
return this.data.user || this.defaultEntity;
|
|
21
16
|
}
|
|
@@ -44,4 +39,3 @@ class Metrics extends Model_1.default {
|
|
|
44
39
|
return this.data.createdAt;
|
|
45
40
|
}
|
|
46
41
|
}
|
|
47
|
-
exports.default = Metrics;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
+
import { Timestamp } from '@google-cloud/firestore';
|
|
1
2
|
import { CollectionNames } from '../../helpers/collections';
|
|
2
|
-
import { Timestamp } from '../../types/firestore';
|
|
3
3
|
export type AllowCollections = CollectionNames.User | CollectionNames.Group | CollectionNames.Event | CollectionNames.Communication | CollectionNames.GroupRepertory | CollectionNames.Partner | CollectionNames.Partnership | CollectionNames.Customer;
|
|
4
4
|
export interface EntityTypes {
|
|
5
5
|
total: number;
|