@memberjunction/server 2.1.2 → 2.1.3
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/dist/apolloServer/TransactionPlugin.d.ts +4 -0
- package/dist/apolloServer/TransactionPlugin.d.ts.map +1 -0
- package/dist/apolloServer/TransactionPlugin.js +46 -0
- package/dist/apolloServer/TransactionPlugin.js.map +1 -0
- package/dist/apolloServer/index.d.ts +11 -0
- package/dist/apolloServer/index.d.ts.map +1 -0
- package/dist/apolloServer/index.js +25 -0
- package/dist/apolloServer/index.js.map +1 -0
- package/dist/auth/exampleNewUserSubClass.d.ts +6 -0
- package/dist/auth/exampleNewUserSubClass.d.ts.map +1 -0
- package/dist/auth/exampleNewUserSubClass.js +49 -0
- package/dist/auth/exampleNewUserSubClass.js.map +1 -0
- package/dist/auth/index.d.ts +30 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +121 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/auth/newUsers.d.ts +5 -0
- package/dist/auth/newUsers.d.ts.map +1 -0
- package/{src/auth/newUsers.ts → dist/auth/newUsers.js} +20 -14
- package/dist/auth/newUsers.js.map +1 -0
- package/dist/auth/tokenExpiredError.d.ts +5 -0
- package/dist/auth/tokenExpiredError.d.ts.map +1 -0
- package/dist/auth/tokenExpiredError.js +12 -0
- package/dist/auth/tokenExpiredError.js.map +1 -0
- package/dist/cache.d.ts +3 -0
- package/dist/cache.d.ts.map +1 -0
- package/{src/cache.ts → dist/cache.js} +4 -6
- package/dist/cache.js.map +1 -0
- package/dist/config.d.ts +196 -0
- package/dist/config.d.ts.map +1 -0
- package/{src/config.ts → dist/config.js} +25 -49
- package/dist/config.js.map +1 -0
- package/dist/context.d.ts +17 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +84 -0
- package/dist/context.js.map +1 -0
- package/dist/directives/Public.d.ts +4 -0
- package/dist/directives/Public.d.ts.map +1 -0
- package/dist/directives/Public.js +30 -0
- package/dist/directives/Public.js.map +1 -0
- package/dist/directives/index.d.ts +2 -0
- package/dist/directives/index.d.ts.map +1 -0
- package/dist/directives/index.js +2 -0
- package/dist/directives/index.js.map +1 -0
- package/dist/entitySubclasses/DuplicateRunEntity.server.d.ts +6 -0
- package/dist/entitySubclasses/DuplicateRunEntity.server.d.ts.map +1 -0
- package/dist/entitySubclasses/DuplicateRunEntity.server.js +33 -0
- package/dist/entitySubclasses/DuplicateRunEntity.server.js.map +1 -0
- package/dist/entitySubclasses/entityPermissions.server.d.ts +23 -0
- package/dist/entitySubclasses/entityPermissions.server.d.ts.map +1 -0
- package/dist/entitySubclasses/entityPermissions.server.js +93 -0
- package/dist/entitySubclasses/entityPermissions.server.js.map +1 -0
- package/dist/entitySubclasses/userViewEntity.server.d.ts +13 -0
- package/dist/entitySubclasses/userViewEntity.server.d.ts.map +1 -0
- package/dist/entitySubclasses/userViewEntity.server.js +161 -0
- package/dist/entitySubclasses/userViewEntity.server.js.map +1 -0
- package/dist/generated/generated.d.ts +6679 -0
- package/dist/generated/generated.d.ts.map +1 -0
- package/dist/generated/generated.js +40786 -0
- package/dist/generated/generated.js.map +1 -0
- package/dist/generic/DeleteOptionsInput.d.ts +5 -0
- package/dist/generic/DeleteOptionsInput.d.ts.map +1 -0
- package/dist/generic/DeleteOptionsInput.js +27 -0
- package/dist/generic/DeleteOptionsInput.js.map +1 -0
- package/dist/generic/KeyInputOutputTypes.d.ts +16 -0
- package/dist/generic/KeyInputOutputTypes.d.ts.map +1 -0
- package/dist/generic/KeyInputOutputTypes.js +65 -0
- package/dist/generic/KeyInputOutputTypes.js.map +1 -0
- package/dist/generic/KeyValuePairInput.d.ts +5 -0
- package/dist/generic/KeyValuePairInput.d.ts.map +1 -0
- package/dist/generic/KeyValuePairInput.js +27 -0
- package/dist/generic/KeyValuePairInput.js.map +1 -0
- package/dist/generic/PushStatusResolver.d.ts +14 -0
- package/dist/generic/PushStatusResolver.d.ts.map +1 -0
- package/dist/generic/PushStatusResolver.js +58 -0
- package/dist/generic/PushStatusResolver.js.map +1 -0
- package/dist/generic/ResolverBase.d.ts +39 -0
- package/dist/generic/ResolverBase.d.ts.map +1 -0
- package/dist/generic/ResolverBase.js +573 -0
- package/dist/generic/ResolverBase.js.map +1 -0
- package/dist/generic/RunViewResolver.d.ts +123 -0
- package/dist/generic/RunViewResolver.d.ts.map +1 -0
- package/dist/generic/RunViewResolver.js +728 -0
- package/dist/generic/RunViewResolver.js.map +1 -0
- package/dist/index.d.ts +26 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +108 -0
- package/dist/index.js.map +1 -0
- package/dist/orm.d.ts +4 -0
- package/dist/orm.d.ts.map +1 -0
- package/dist/orm.js +32 -0
- package/dist/orm.js.map +1 -0
- package/dist/resolvers/AskSkipResolver.d.ts +54 -0
- package/dist/resolvers/AskSkipResolver.d.ts.map +1 -0
- package/dist/resolvers/AskSkipResolver.js +805 -0
- package/dist/resolvers/AskSkipResolver.js.map +1 -0
- package/dist/resolvers/ColorResolver.d.ts +23 -0
- package/dist/resolvers/ColorResolver.d.ts.map +1 -0
- package/dist/resolvers/ColorResolver.js +97 -0
- package/dist/resolvers/ColorResolver.js.map +1 -0
- package/dist/resolvers/DatasetResolver.d.ts +42 -0
- package/dist/resolvers/DatasetResolver.d.ts.map +1 -0
- package/dist/resolvers/DatasetResolver.js +179 -0
- package/dist/resolvers/DatasetResolver.js.map +1 -0
- package/dist/resolvers/EntityCommunicationsResolver.d.ts +50 -0
- package/dist/resolvers/EntityCommunicationsResolver.d.ts.map +1 -0
- package/dist/resolvers/EntityCommunicationsResolver.js +280 -0
- package/dist/resolvers/EntityCommunicationsResolver.js.map +1 -0
- package/dist/resolvers/EntityRecordNameResolver.d.ts +21 -0
- package/dist/resolvers/EntityRecordNameResolver.d.ts.map +1 -0
- package/dist/resolvers/EntityRecordNameResolver.js +117 -0
- package/dist/resolvers/EntityRecordNameResolver.js.map +1 -0
- package/dist/resolvers/EntityResolver.d.ts +6 -0
- package/dist/resolvers/EntityResolver.d.ts.map +1 -0
- package/dist/resolvers/EntityResolver.js +57 -0
- package/dist/resolvers/EntityResolver.js.map +1 -0
- package/dist/resolvers/FileCategoryResolver.d.ts +6 -0
- package/dist/resolvers/FileCategoryResolver.d.ts.map +1 -0
- package/dist/resolvers/FileCategoryResolver.js +61 -0
- package/dist/resolvers/FileCategoryResolver.js.map +1 -0
- package/dist/resolvers/FileResolver.d.ts +24 -0
- package/dist/resolvers/FileResolver.d.ts.map +1 -0
- package/dist/resolvers/FileResolver.js +166 -0
- package/dist/resolvers/FileResolver.js.map +1 -0
- package/dist/resolvers/MergeRecordsResolver.d.ts +59 -0
- package/dist/resolvers/MergeRecordsResolver.d.ts.map +1 -0
- package/dist/resolvers/MergeRecordsResolver.js +282 -0
- package/dist/resolvers/MergeRecordsResolver.js.map +1 -0
- package/dist/resolvers/PotentialDuplicateRecordResolver.d.ts +29 -0
- package/dist/resolvers/PotentialDuplicateRecordResolver.d.ts.map +1 -0
- package/dist/resolvers/PotentialDuplicateRecordResolver.js +125 -0
- package/dist/resolvers/PotentialDuplicateRecordResolver.js.map +1 -0
- package/dist/resolvers/QueryResolver.d.ts +13 -0
- package/dist/resolvers/QueryResolver.d.ts.map +1 -0
- package/dist/resolvers/QueryResolver.js +77 -0
- package/dist/resolvers/QueryResolver.js.map +1 -0
- package/dist/resolvers/ReportResolver.d.ts +20 -0
- package/dist/resolvers/ReportResolver.d.ts.map +1 -0
- package/dist/resolvers/ReportResolver.js +182 -0
- package/dist/resolvers/ReportResolver.js.map +1 -0
- package/dist/resolvers/UserFavoriteResolver.d.ts +42 -0
- package/dist/resolvers/UserFavoriteResolver.d.ts.map +1 -0
- package/dist/resolvers/UserFavoriteResolver.js +230 -0
- package/dist/resolvers/UserFavoriteResolver.js.map +1 -0
- package/dist/resolvers/UserResolver.d.ts +10 -0
- package/dist/resolvers/UserResolver.d.ts.map +1 -0
- package/dist/resolvers/UserResolver.js +71 -0
- package/dist/resolvers/UserResolver.js.map +1 -0
- package/dist/resolvers/UserViewResolver.d.ts +13 -0
- package/dist/resolvers/UserViewResolver.d.ts.map +1 -0
- package/dist/resolvers/UserViewResolver.js +99 -0
- package/dist/resolvers/UserViewResolver.js.map +1 -0
- package/dist/types.d.ts +37 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/util.d.ts +4 -0
- package/dist/util.d.ts.map +1 -0
- package/dist/util.js +85 -0
- package/dist/util.js.map +1 -0
- package/package.json +25 -21
- package/CHANGELOG.json +0 -3389
- package/CHANGELOG.md +0 -739
- package/src/apolloServer/TransactionPlugin.ts +0 -57
- package/src/apolloServer/index.ts +0 -33
- package/src/auth/exampleNewUserSubClass.ts +0 -74
- package/src/auth/index.ts +0 -151
- package/src/auth/tokenExpiredError.ts +0 -12
- package/src/context.ts +0 -111
- package/src/directives/Public.ts +0 -42
- package/src/directives/index.ts +0 -1
- package/src/entitySubclasses/DuplicateRunEntity.server.ts +0 -29
- package/src/entitySubclasses/entityPermissions.server.ts +0 -111
- package/src/entitySubclasses/userViewEntity.server.ts +0 -187
- package/src/generated/generated.ts +0 -25369
- package/src/generic/DeleteOptionsInput.ts +0 -13
- package/src/generic/KeyInputOutputTypes.ts +0 -35
- package/src/generic/KeyValuePairInput.ts +0 -14
- package/src/generic/PushStatusResolver.ts +0 -40
- package/src/generic/ResolverBase.ts +0 -767
- package/src/generic/RunViewResolver.ts +0 -582
- package/src/index.ts +0 -161
- package/src/orm.ts +0 -36
- package/src/resolvers/AskSkipResolver.ts +0 -926
- package/src/resolvers/ColorResolver.ts +0 -61
- package/src/resolvers/DatasetResolver.ts +0 -115
- package/src/resolvers/EntityCommunicationsResolver.ts +0 -216
- package/src/resolvers/EntityRecordNameResolver.ts +0 -78
- package/src/resolvers/EntityResolver.ts +0 -37
- package/src/resolvers/FileCategoryResolver.ts +0 -62
- package/src/resolvers/FileResolver.ts +0 -147
- package/src/resolvers/MergeRecordsResolver.ts +0 -182
- package/src/resolvers/PotentialDuplicateRecordResolver.ts +0 -91
- package/src/resolvers/QueryResolver.ts +0 -42
- package/src/resolvers/ReportResolver.ts +0 -147
- package/src/resolvers/UserFavoriteResolver.ts +0 -166
- package/src/resolvers/UserResolver.ts +0 -33
- package/src/resolvers/UserViewResolver.ts +0 -64
- package/src/types.ts +0 -40
- package/src/util.ts +0 -106
- package/tsconfig.json +0 -30
- package/typedoc.json +0 -4
|
@@ -1,147 +0,0 @@
|
|
|
1
|
-
import { EntityPermissionType, Metadata } from '@memberjunction/core';
|
|
2
|
-
import { FileEntity, FileStorageProviderEntity } from '@memberjunction/core-entities';
|
|
3
|
-
import {
|
|
4
|
-
AppContext,
|
|
5
|
-
Arg,
|
|
6
|
-
Ctx,
|
|
7
|
-
DeleteOptionsInput,
|
|
8
|
-
Field,
|
|
9
|
-
FieldResolver,
|
|
10
|
-
InputType,
|
|
11
|
-
Int,
|
|
12
|
-
Mutation,
|
|
13
|
-
ObjectType,
|
|
14
|
-
PubSub,
|
|
15
|
-
PubSubEngine,
|
|
16
|
-
Resolver,
|
|
17
|
-
Root,
|
|
18
|
-
} from '@memberjunction/server';
|
|
19
|
-
import { createDownloadUrl, createUploadUrl, deleteObject, moveObject } from '@memberjunction/storage';
|
|
20
|
-
import { CreateFileInput, FileResolver as FileResolverBase, File_, UpdateFileInput } from '../generated/generated';
|
|
21
|
-
import { FieldMapper } from '@memberjunction/graphql-dataprovider';
|
|
22
|
-
|
|
23
|
-
@InputType()
|
|
24
|
-
export class CreateUploadURLInput {
|
|
25
|
-
@Field(() => String)
|
|
26
|
-
FileID: string;
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
@ObjectType()
|
|
30
|
-
export class CreateFilePayload {
|
|
31
|
-
@Field(() => File_)
|
|
32
|
-
File: File_;
|
|
33
|
-
@Field(() => String)
|
|
34
|
-
UploadUrl: string;
|
|
35
|
-
@Field(() => Boolean)
|
|
36
|
-
NameExists: boolean;
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
@ObjectType()
|
|
40
|
-
export class FileExt extends File_ {
|
|
41
|
-
@Field(() => String)
|
|
42
|
-
DownloadUrl: string;
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
@Resolver(File_)
|
|
46
|
-
export class FileResolver extends FileResolverBase {
|
|
47
|
-
@Mutation(() => CreateFilePayload)
|
|
48
|
-
async CreateFile(
|
|
49
|
-
@Arg('input', () => CreateFileInput) input: CreateFileInput,
|
|
50
|
-
@Ctx() { dataSource, userPayload }: AppContext,
|
|
51
|
-
@PubSub() pubSub: PubSubEngine
|
|
52
|
-
) {
|
|
53
|
-
const md = new Metadata();
|
|
54
|
-
const user = this.GetUserFromPayload(userPayload);
|
|
55
|
-
const fileEntity = await md.GetEntityObject<FileEntity>('Files', user);
|
|
56
|
-
const providerEntity = await md.GetEntityObject<FileStorageProviderEntity>('File Storage Providers', user);
|
|
57
|
-
fileEntity.CheckPermissions(EntityPermissionType.Create, true);
|
|
58
|
-
|
|
59
|
-
// Check to see if there's already an object with that name
|
|
60
|
-
const [sameName] = await this.findBy(dataSource, 'Files', { Name: input.Name, ProviderID: input.ProviderID });
|
|
61
|
-
const NameExists = Boolean(sameName);
|
|
62
|
-
|
|
63
|
-
const fileRecord = (await super.CreateFile({ ...input, Status: 'Pending' }, { dataSource, userPayload }, pubSub)) as File_;
|
|
64
|
-
|
|
65
|
-
// If there's a problem creating the file record, the base resolver will return null
|
|
66
|
-
if (!fileRecord) {
|
|
67
|
-
return null;
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
// Create the upload URL and get the record updates (provider key, content type, etc)
|
|
71
|
-
const { updatedInput, UploadUrl } = await createUploadUrl(providerEntity, fileRecord);
|
|
72
|
-
|
|
73
|
-
// Save the file record with the updated input
|
|
74
|
-
const mapper = new FieldMapper();
|
|
75
|
-
fileEntity.LoadFromData(mapper.ReverseMapFields({ ...input }));
|
|
76
|
-
fileEntity.SetMany(updatedInput);
|
|
77
|
-
await fileEntity.Save();
|
|
78
|
-
const File = fileEntity.GetAll();
|
|
79
|
-
|
|
80
|
-
return { File, UploadUrl, NameExists };
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
@FieldResolver(() => String)
|
|
84
|
-
async DownloadUrl(@Root() file: File_, @Ctx() { userPayload }: AppContext) {
|
|
85
|
-
const md = new Metadata();
|
|
86
|
-
const user = this.GetUserFromPayload(userPayload);
|
|
87
|
-
const fileEntity = await md.GetEntityObject<FileEntity>('Files', user);
|
|
88
|
-
fileEntity.CheckPermissions(EntityPermissionType.Read, true);
|
|
89
|
-
|
|
90
|
-
const providerEntity = await md.GetEntityObject<FileStorageProviderEntity>('File Storage Providers', user);
|
|
91
|
-
await providerEntity.Load(file.ProviderID);
|
|
92
|
-
|
|
93
|
-
const url = await createDownloadUrl(providerEntity, file.ProviderKey ?? file.Name);
|
|
94
|
-
|
|
95
|
-
return url;
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
@Mutation(() => File_)
|
|
99
|
-
async UpdateFile(
|
|
100
|
-
@Arg('input', () => UpdateFileInput) input: UpdateFileInput,
|
|
101
|
-
@Ctx() { dataSource, userPayload }: AppContext,
|
|
102
|
-
@PubSub() pubSub: PubSubEngine
|
|
103
|
-
) {
|
|
104
|
-
// if the name is changing, rename the target object as well
|
|
105
|
-
const md = new Metadata();
|
|
106
|
-
const user = this.GetUserFromPayload(userPayload);
|
|
107
|
-
const fileEntity = await md.GetEntityObject<FileEntity>('Files', user);
|
|
108
|
-
fileEntity.CheckPermissions(EntityPermissionType.Update, true);
|
|
109
|
-
|
|
110
|
-
await fileEntity.Load(input.ID);
|
|
111
|
-
|
|
112
|
-
if (fileEntity.Name !== input.Name) {
|
|
113
|
-
const providerEntity = await md.GetEntityObject<FileStorageProviderEntity>('File Storage Providers', user);
|
|
114
|
-
await providerEntity.Load(fileEntity.ProviderID);
|
|
115
|
-
|
|
116
|
-
const success = await moveObject(providerEntity, fileEntity.Name, input.Name);
|
|
117
|
-
if (!success) {
|
|
118
|
-
throw new Error('Error updating object name');
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
const updatedFile = await super.UpdateFile(input, { dataSource, userPayload }, pubSub);
|
|
123
|
-
return updatedFile;
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
@Mutation(() => File_)
|
|
127
|
-
async DeleteFile(@Arg('ID', () => String) ID: string, @Arg('options___', () => DeleteOptionsInput) options: DeleteOptionsInput, @Ctx() { dataSource, userPayload }: AppContext, @PubSub() pubSub: PubSubEngine) {
|
|
128
|
-
const md = new Metadata();
|
|
129
|
-
const userInfo = this.GetUserFromPayload(userPayload);
|
|
130
|
-
|
|
131
|
-
const fileEntity = await md.GetEntityObject<FileEntity>('Files', userInfo);
|
|
132
|
-
await fileEntity.Load(ID);
|
|
133
|
-
if (!fileEntity) {
|
|
134
|
-
return null;
|
|
135
|
-
}
|
|
136
|
-
fileEntity.CheckPermissions(EntityPermissionType.Delete, true);
|
|
137
|
-
|
|
138
|
-
// Only delete the object from the provider if it's actually been uploaded
|
|
139
|
-
if (fileEntity.Status === 'Uploaded') {
|
|
140
|
-
const providerEntity = await md.GetEntityObject<FileStorageProviderEntity>('File Storage Providers', userInfo);
|
|
141
|
-
await providerEntity.Load(fileEntity.ProviderID);
|
|
142
|
-
await deleteObject(providerEntity, fileEntity.ProviderKey ?? fileEntity.Name);
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
return super.DeleteFile(ID, options, { dataSource, userPayload }, pubSub);
|
|
146
|
-
}
|
|
147
|
-
}
|
|
@@ -1,182 +0,0 @@
|
|
|
1
|
-
import { LogError, Metadata, CompositeKey } from '@memberjunction/core';
|
|
2
|
-
import { Arg, Ctx, Field, InputType, Int, Mutation, ObjectType, PubSub, PubSubEngine, Query, Resolver } from 'type-graphql';
|
|
3
|
-
import { AppContext } from '../types';
|
|
4
|
-
import { CompositeKeyInputType, CompositeKeyOutputType } from '../generic/KeyInputOutputTypes';
|
|
5
|
-
|
|
6
|
-
@ObjectType()
|
|
7
|
-
export class EntityDependencyResult {
|
|
8
|
-
@Field(() => String)
|
|
9
|
-
EntityName: string; // required
|
|
10
|
-
|
|
11
|
-
@Field(() => String)
|
|
12
|
-
RelatedEntityName: string; // required
|
|
13
|
-
|
|
14
|
-
@Field(() => String)
|
|
15
|
-
FieldName: string; // required
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
@Resolver(EntityDependencyResult)
|
|
19
|
-
export class EntityDependencyResolver {
|
|
20
|
-
@Query(() => [EntityDependencyResult])
|
|
21
|
-
async GetEntityDependencies(
|
|
22
|
-
@Arg('entityName', () => String) entityName: string,
|
|
23
|
-
@Ctx() { dataSource, userPayload }: AppContext,
|
|
24
|
-
@PubSub() pubSub: PubSubEngine
|
|
25
|
-
) {
|
|
26
|
-
try {
|
|
27
|
-
const md = new Metadata();
|
|
28
|
-
return md.GetEntityDependencies(entityName);
|
|
29
|
-
}
|
|
30
|
-
catch (err) {
|
|
31
|
-
LogError(err);
|
|
32
|
-
throw new Error(err.message);
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
@ObjectType()
|
|
40
|
-
export class RecordDependencyResult {
|
|
41
|
-
@Field(() => String)
|
|
42
|
-
EntityName: string; // required
|
|
43
|
-
|
|
44
|
-
@Field(() => String)
|
|
45
|
-
RelatedEntityName: string; // required
|
|
46
|
-
|
|
47
|
-
@Field(() => String)
|
|
48
|
-
FieldName: string; // required
|
|
49
|
-
|
|
50
|
-
@Field(() => CompositeKeyOutputType)
|
|
51
|
-
CompositeKey: CompositeKey;
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
@Resolver(RecordDependencyResult)
|
|
58
|
-
export class RecordDependencyResolver {
|
|
59
|
-
@Query(() => [RecordDependencyResult])
|
|
60
|
-
async GetRecordDependencies(
|
|
61
|
-
@Arg('entityName', () => String) entityName: string,
|
|
62
|
-
@Arg('CompositeKey', () => CompositeKeyInputType) ckInput: CompositeKeyInputType,
|
|
63
|
-
@Ctx() { dataSource, userPayload }: AppContext,
|
|
64
|
-
@PubSub() pubSub: PubSubEngine
|
|
65
|
-
) {
|
|
66
|
-
try {
|
|
67
|
-
const md = new Metadata();
|
|
68
|
-
const ck = new CompositeKey(ckInput.KeyValuePairs);
|
|
69
|
-
const result = await md.GetRecordDependencies(entityName, ck);
|
|
70
|
-
return result;
|
|
71
|
-
}
|
|
72
|
-
catch (e) {
|
|
73
|
-
LogError(e);
|
|
74
|
-
throw e;
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
@InputType()
|
|
80
|
-
class FieldMapping {
|
|
81
|
-
@Field(() => String)
|
|
82
|
-
FieldName: string;
|
|
83
|
-
|
|
84
|
-
@Field(() => String)
|
|
85
|
-
Value: string;
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
@ObjectType()
|
|
89
|
-
class FieldMappingOutput {
|
|
90
|
-
@Field(() => String)
|
|
91
|
-
FieldName: string;
|
|
92
|
-
|
|
93
|
-
@Field(() => String)
|
|
94
|
-
Value: string;
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
@InputType()
|
|
98
|
-
export class RecordMergeRequest {
|
|
99
|
-
@Field(() => String)
|
|
100
|
-
EntityName: string;
|
|
101
|
-
|
|
102
|
-
@Field(() => CompositeKeyInputType)
|
|
103
|
-
SurvivingRecordCompositeKey: CompositeKey;
|
|
104
|
-
|
|
105
|
-
@Field(() => [CompositeKeyInputType])
|
|
106
|
-
RecordsToMerge: CompositeKey[];
|
|
107
|
-
|
|
108
|
-
@Field(() => [FieldMapping], { nullable: true })
|
|
109
|
-
FieldMap?: FieldMapping[];
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
@ObjectType()
|
|
113
|
-
export class RecordMergeRequestOutput {
|
|
114
|
-
@Field(() => String)
|
|
115
|
-
EntityName: string;
|
|
116
|
-
|
|
117
|
-
@Field(() => Int)
|
|
118
|
-
SurvivingRecordID: number;
|
|
119
|
-
|
|
120
|
-
@Field(() => [Int])
|
|
121
|
-
RecordsToMerge: number[];
|
|
122
|
-
|
|
123
|
-
@Field(() => [FieldMappingOutput], { nullable: true })
|
|
124
|
-
FieldMap?: FieldMappingOutput[];
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
@ObjectType()
|
|
129
|
-
export class RecordMergeDetailResult {
|
|
130
|
-
@Field(() => CompositeKeyOutputType)
|
|
131
|
-
CompositeKey: CompositeKeyOutputType;
|
|
132
|
-
|
|
133
|
-
@Field(() => Boolean)
|
|
134
|
-
Success: boolean;
|
|
135
|
-
|
|
136
|
-
@Field(() => Int, {nullable: true})
|
|
137
|
-
RecordMergeDeletionLogID?: number;
|
|
138
|
-
|
|
139
|
-
@Field(() => String, {nullable: true})
|
|
140
|
-
Message?: string;
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
@ObjectType()
|
|
144
|
-
export class RecordMergeResult {
|
|
145
|
-
@Field(() => Boolean)
|
|
146
|
-
Success: boolean;
|
|
147
|
-
|
|
148
|
-
@Field(() => String, {nullable: true})
|
|
149
|
-
OverallStatus: string;
|
|
150
|
-
|
|
151
|
-
@Field(() => Int, {nullable: true})
|
|
152
|
-
RecordMergeLogID: number;
|
|
153
|
-
|
|
154
|
-
@Field(() => [RecordMergeDetailResult])
|
|
155
|
-
RecordStatus: RecordMergeDetailResult[];
|
|
156
|
-
|
|
157
|
-
@Field(() => RecordMergeRequestOutput)
|
|
158
|
-
Request: RecordMergeRequestOutput;
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
@Resolver(RecordMergeResult)
|
|
162
|
-
export class RecordMergeResolver {
|
|
163
|
-
@Mutation(() => RecordMergeResult)
|
|
164
|
-
async MergeRecords(
|
|
165
|
-
@Arg('request', () => RecordMergeRequest) request: RecordMergeRequest,
|
|
166
|
-
@Ctx() { dataSource, userPayload }: AppContext,
|
|
167
|
-
@PubSub() pubSub: PubSubEngine
|
|
168
|
-
) {
|
|
169
|
-
try {
|
|
170
|
-
const md = new Metadata();
|
|
171
|
-
const result = await md.MergeRecords(request, userPayload.userRecord);
|
|
172
|
-
return result;
|
|
173
|
-
}
|
|
174
|
-
catch (e) {
|
|
175
|
-
LogError(e);
|
|
176
|
-
throw e;
|
|
177
|
-
}
|
|
178
|
-
}
|
|
179
|
-
}
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
export default EntityDependencyResolver;
|
|
@@ -1,91 +0,0 @@
|
|
|
1
|
-
import { Arg, Ctx, Field, Float, InputType, Int, ObjectType, Query, Resolver } from 'type-graphql';
|
|
2
|
-
import {
|
|
3
|
-
PotentialDuplicateRequest,
|
|
4
|
-
PotentialDuplicateResponse,
|
|
5
|
-
PotentialDuplicate,
|
|
6
|
-
Metadata,
|
|
7
|
-
CompositeKey,
|
|
8
|
-
PotentialDuplicateResult,
|
|
9
|
-
} from '@memberjunction/core';
|
|
10
|
-
import { AppContext } from '../types';
|
|
11
|
-
import { UserCache } from '@memberjunction/sqlserver-dataprovider';
|
|
12
|
-
|
|
13
|
-
//load the default vectorDB and embedding model
|
|
14
|
-
import { LoadMistralEmbedding } from '@memberjunction/ai-mistral';
|
|
15
|
-
import { LoadPineconeVectorDB } from '@memberjunction/ai-vectors-pinecone';
|
|
16
|
-
import { CompositeKeyInputType, CompositeKeyOutputType, KeyValuePairOutputType } from '../generic/KeyInputOutputTypes';
|
|
17
|
-
LoadMistralEmbedding();
|
|
18
|
-
LoadPineconeVectorDB();
|
|
19
|
-
|
|
20
|
-
@InputType()
|
|
21
|
-
export class PotentialDuplicateRequestType extends PotentialDuplicateRequest {
|
|
22
|
-
@Field(() => String)
|
|
23
|
-
declare EntityID: string;
|
|
24
|
-
|
|
25
|
-
@Field(() => [CompositeKeyInputType])
|
|
26
|
-
declare RecordIDs: CompositeKey[];
|
|
27
|
-
|
|
28
|
-
@Field(() => String, { nullable: true })
|
|
29
|
-
declare EntityDocumentID: string;
|
|
30
|
-
|
|
31
|
-
@Field(() => Int, { nullable: true })
|
|
32
|
-
declare ProbabilityScore: number;
|
|
33
|
-
|
|
34
|
-
@Field(() => String)
|
|
35
|
-
declare ListID: string;
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
@ObjectType()
|
|
39
|
-
export class PotentialDuplicateType extends PotentialDuplicate {
|
|
40
|
-
@Field(() => Float)
|
|
41
|
-
declare ProbabilityScore: number;
|
|
42
|
-
|
|
43
|
-
@Field(() => [KeyValuePairOutputType])
|
|
44
|
-
declare KeyValuePairs: KeyValuePairOutputType[];
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
@ObjectType()
|
|
48
|
-
export class PotentialDuplicateResultType extends PotentialDuplicateResult {
|
|
49
|
-
@Field(() => String, { nullable: true })
|
|
50
|
-
declare EntityID: string;
|
|
51
|
-
|
|
52
|
-
@Field(() => [PotentialDuplicateType])
|
|
53
|
-
declare Duplicates: PotentialDuplicateType[];
|
|
54
|
-
|
|
55
|
-
@Field(() => CompositeKeyOutputType)
|
|
56
|
-
RecordPrimaryKeys: CompositeKey;
|
|
57
|
-
|
|
58
|
-
@Field(() => [String])
|
|
59
|
-
declare DuplicateRunDetailMatchRecordIDs: string[];
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
@ObjectType()
|
|
63
|
-
export class PotentialDuplicateResponseType extends PotentialDuplicateResponse {
|
|
64
|
-
@Field(() => String)
|
|
65
|
-
declare Status: 'Inprogress' | 'Success' | 'Error';
|
|
66
|
-
|
|
67
|
-
@Field(() => String, { nullable: true })
|
|
68
|
-
declare ErrorMessage?: string;
|
|
69
|
-
|
|
70
|
-
@Field(() => [PotentialDuplicateResultType])
|
|
71
|
-
declare PotentialDuplicateResult: PotentialDuplicateResult[];
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
@Resolver(PotentialDuplicateResponseType)
|
|
75
|
-
export class DuplicateRecordResolver {
|
|
76
|
-
@Query(() => PotentialDuplicateResponseType)
|
|
77
|
-
async GetRecordDuplicates(
|
|
78
|
-
@Ctx() { dataSource, userPayload }: AppContext,
|
|
79
|
-
@Arg('params') params: PotentialDuplicateRequestType
|
|
80
|
-
): Promise<PotentialDuplicateResponseType> {
|
|
81
|
-
const md = new Metadata();
|
|
82
|
-
|
|
83
|
-
const user = UserCache.Instance.Users.find((u) => u.Email.trim().toLowerCase() === userPayload.email.trim().toLowerCase());
|
|
84
|
-
if (!user) {
|
|
85
|
-
throw new Error(`User ${userPayload.email} not found in UserCache`);
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
const result = await md.GetRecordDuplicates(params, user);
|
|
89
|
-
return result;
|
|
90
|
-
}
|
|
91
|
-
}
|
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
// Queries are MemberJunction primitive operations that are used to retrieve data from the server from any stored query
|
|
2
|
-
import { RunQuery } from '@memberjunction/core';
|
|
3
|
-
import { Arg, Ctx, Field, Int, ObjectType, Query, Resolver } from 'type-graphql';
|
|
4
|
-
import { AppContext } from '../types';
|
|
5
|
-
|
|
6
|
-
@ObjectType()
|
|
7
|
-
export class RunQueryResultType {
|
|
8
|
-
@Field()
|
|
9
|
-
QueryID: string;
|
|
10
|
-
|
|
11
|
-
@Field()
|
|
12
|
-
Success: boolean;
|
|
13
|
-
|
|
14
|
-
@Field()
|
|
15
|
-
Results: string;
|
|
16
|
-
|
|
17
|
-
@Field()
|
|
18
|
-
RowCount: number;
|
|
19
|
-
|
|
20
|
-
@Field()
|
|
21
|
-
ExecutionTime: number;
|
|
22
|
-
|
|
23
|
-
@Field()
|
|
24
|
-
ErrorMessage: string;
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
@Resolver(RunQueryResultType)
|
|
28
|
-
export class ReportResolver {
|
|
29
|
-
@Query(() => RunQueryResultType)
|
|
30
|
-
async GetQueryData(@Arg('QueryID', () => String) QueryID: string, @Ctx() {}: AppContext): Promise<RunQueryResultType> {
|
|
31
|
-
const runQuery = new RunQuery();
|
|
32
|
-
const result = await runQuery.RunQuery({ QueryID: QueryID });
|
|
33
|
-
return {
|
|
34
|
-
QueryID: QueryID,
|
|
35
|
-
Success: result.Success,
|
|
36
|
-
Results: JSON.stringify(result.Results),
|
|
37
|
-
RowCount: result.RowCount,
|
|
38
|
-
ExecutionTime: result.ExecutionTime,
|
|
39
|
-
ErrorMessage: result.ErrorMessage,
|
|
40
|
-
};
|
|
41
|
-
}
|
|
42
|
-
}
|
|
@@ -1,147 +0,0 @@
|
|
|
1
|
-
import { Metadata, RunReport } from '@memberjunction/core';
|
|
2
|
-
import { Arg, Ctx, Field, Int, Mutation, ObjectType, Query, Resolver } from 'type-graphql';
|
|
3
|
-
import { AppContext } from '../types';
|
|
4
|
-
import { ConversationDetailEntity, ReportEntity } from '@memberjunction/core-entities';
|
|
5
|
-
import { SkipAPIAnalysisCompleteResponse } from '@memberjunction/skip-types';
|
|
6
|
-
import { DataContext } from '@memberjunction/data-context';
|
|
7
|
-
import { UserCache } from '@memberjunction/sqlserver-dataprovider';
|
|
8
|
-
|
|
9
|
-
@ObjectType()
|
|
10
|
-
export class RunReportResultType {
|
|
11
|
-
@Field()
|
|
12
|
-
ReportID: string;
|
|
13
|
-
|
|
14
|
-
@Field()
|
|
15
|
-
Success: boolean;
|
|
16
|
-
|
|
17
|
-
@Field()
|
|
18
|
-
Results: string;
|
|
19
|
-
|
|
20
|
-
@Field()
|
|
21
|
-
RowCount: number;
|
|
22
|
-
|
|
23
|
-
@Field()
|
|
24
|
-
ExecutionTime: number;
|
|
25
|
-
|
|
26
|
-
@Field()
|
|
27
|
-
ErrorMessage: string;
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
@ObjectType()
|
|
31
|
-
export class CreateReportResultType {
|
|
32
|
-
@Field()
|
|
33
|
-
ReportID: string;
|
|
34
|
-
|
|
35
|
-
@Field()
|
|
36
|
-
ReportName: string;
|
|
37
|
-
|
|
38
|
-
@Field()
|
|
39
|
-
Success: boolean;
|
|
40
|
-
|
|
41
|
-
@Field()
|
|
42
|
-
ErrorMessage: string;
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
@Resolver(RunReportResultType)
|
|
46
|
-
export class ReportResolverExtended {
|
|
47
|
-
@Query(() => RunReportResultType)
|
|
48
|
-
async GetReportData(@Arg('ReportID', () => String) ReportID: string, @Ctx() {}: AppContext): Promise<RunReportResultType> {
|
|
49
|
-
const runReport = new RunReport();
|
|
50
|
-
const result = await runReport.RunReport({ ReportID: ReportID });
|
|
51
|
-
return {
|
|
52
|
-
ReportID: ReportID,
|
|
53
|
-
Success: result.Success,
|
|
54
|
-
Results: JSON.stringify(result.Results),
|
|
55
|
-
RowCount: result.RowCount,
|
|
56
|
-
ExecutionTime: result.ExecutionTime,
|
|
57
|
-
ErrorMessage: result.ErrorMessage,
|
|
58
|
-
};
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
/**
|
|
62
|
-
* This mutation will create a new report from a conversation detail ID
|
|
63
|
-
*/
|
|
64
|
-
@Mutation(() => CreateReportResultType)
|
|
65
|
-
async CreateReportFromConversationDetailID(@Arg('ConversationDetailID', () => String) ConversationDetailID: string,
|
|
66
|
-
@Ctx() {dataSource, userPayload}: AppContext): Promise<CreateReportResultType> {
|
|
67
|
-
try {
|
|
68
|
-
const md = new Metadata();
|
|
69
|
-
|
|
70
|
-
const u = UserCache.Users.find(u => u.Email?.trim().toLowerCase() === userPayload?.email?.trim().toLowerCase());
|
|
71
|
-
if (!u)
|
|
72
|
-
throw new Error('Unable to find user')
|
|
73
|
-
|
|
74
|
-
const cde = md.Entities.find(e => e.Name === 'Conversation Details')
|
|
75
|
-
if (!cde)
|
|
76
|
-
throw new Error('Unable to find Conversation Details Entity metadata')
|
|
77
|
-
|
|
78
|
-
const cd = md.Entities.find(e => e.Name === 'Conversations')
|
|
79
|
-
if (!cd)
|
|
80
|
-
throw new Error('Unable to find Conversations Entity metadata')
|
|
81
|
-
|
|
82
|
-
const sql = `SELECT
|
|
83
|
-
cd.Message, cd.ConversationID, c.DataContextID
|
|
84
|
-
FROM
|
|
85
|
-
${cde.SchemaName}.${cde.BaseView} cd
|
|
86
|
-
INNER JOIN
|
|
87
|
-
${cd.SchemaName}.${cd.BaseView} c
|
|
88
|
-
ON
|
|
89
|
-
cd.ConversationID = c.ID
|
|
90
|
-
WHERE
|
|
91
|
-
cd.ID=${ConversationDetailID}`
|
|
92
|
-
|
|
93
|
-
const result = await dataSource.query(sql);
|
|
94
|
-
if (!result || result.length === 0)
|
|
95
|
-
throw new Error('Unable to retrieve converation details')
|
|
96
|
-
const skipData = <SkipAPIAnalysisCompleteResponse>JSON.parse(result[0].Message);
|
|
97
|
-
|
|
98
|
-
const report = await md.GetEntityObject<ReportEntity>('Reports', u);
|
|
99
|
-
report.NewRecord();
|
|
100
|
-
report.Name = skipData.reportTitle ? skipData.reportTitle : 'Untitled Report';
|
|
101
|
-
report.Description = skipData.userExplanation ? skipData.userExplanation : '';
|
|
102
|
-
report.ConversationID = result[0].ConversationID;
|
|
103
|
-
report.ConversationDetailID = ConversationDetailID;
|
|
104
|
-
|
|
105
|
-
const dc: DataContext = new DataContext();
|
|
106
|
-
await dc.LoadMetadata(result[0].DataContextID, u);
|
|
107
|
-
const newDataContext = await DataContext.Clone(dc, false, u);
|
|
108
|
-
if (!newDataContext)
|
|
109
|
-
throw new Error('Error cloning data context')
|
|
110
|
-
report.DataContextID = newDataContext.ID;
|
|
111
|
-
|
|
112
|
-
// next, strip out the messags from the SkipData object to put them into our Report Configuration as we dont need to store that information as we have a
|
|
113
|
-
// link back to the conversation and conversation detail
|
|
114
|
-
const newSkipData : SkipAPIAnalysisCompleteResponse = JSON.parse(JSON.stringify(skipData));
|
|
115
|
-
newSkipData.messages = [];
|
|
116
|
-
report.Configuration = JSON.stringify(newSkipData)
|
|
117
|
-
|
|
118
|
-
report.SharingScope = 'None'
|
|
119
|
-
report.UserID = u.ID;
|
|
120
|
-
|
|
121
|
-
if (await report.Save()) {
|
|
122
|
-
return {
|
|
123
|
-
ReportID: report.ID,
|
|
124
|
-
ReportName: report.Name,
|
|
125
|
-
Success: true,
|
|
126
|
-
ErrorMessage: ''
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
|
-
else {
|
|
130
|
-
return {
|
|
131
|
-
ReportID: "",
|
|
132
|
-
ReportName: '',
|
|
133
|
-
Success: false,
|
|
134
|
-
ErrorMessage: 'Unable to save new report'
|
|
135
|
-
}
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
catch (ex) {
|
|
139
|
-
return {
|
|
140
|
-
ReportID: "",
|
|
141
|
-
ReportName: '',
|
|
142
|
-
Success: false,
|
|
143
|
-
ErrorMessage: 'Unable to create new report: ' + ex.message
|
|
144
|
-
}
|
|
145
|
-
}
|
|
146
|
-
}
|
|
147
|
-
}
|