@roadmanjs/chat 0.0.63 → 0.0.64

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.
Files changed (45) hide show
  1. package/dist/chat/methods/ChatMessageResolver.methods.js +4 -3
  2. package/dist/chat/methods/ChatMessageResolver.methods.js.map +1 -1
  3. package/package.json +2 -1
  4. package/src/chat/fragments/README.md +1 -0
  5. package/src/chat/fragments/chatAttachment.fragment.ts +15 -0
  6. package/src/chat/fragments/chatConvo.fragment.ts +29 -0
  7. package/src/chat/fragments/chatMessage.fragment.ts +35 -0
  8. package/src/chat/fragments/chatUser.fragment.ts +23 -0
  9. package/src/chat/fragments/index.ts +5 -0
  10. package/src/chat/fragments/resType.ts +15 -0
  11. package/src/chat/index-client.ts +7 -0
  12. package/src/chat/index.ts +5 -0
  13. package/src/chat/methods/ChatConvo.methods.ts +336 -0
  14. package/src/chat/methods/ChatConvo.test.ts +122 -0
  15. package/src/chat/methods/ChatConvoResolver.methods.ts +243 -0
  16. package/src/chat/methods/ChatMessageResolver.methods.ts +218 -0
  17. package/src/chat/methods/index.ts +3 -0
  18. package/src/chat/models/ChatAttachment.model.ts +43 -0
  19. package/src/chat/models/ChatConvo.model.ts +108 -0
  20. package/src/chat/models/ChatMessage.model.ts +102 -0
  21. package/src/chat/models/ChatUser.model.ts +67 -0
  22. package/src/chat/models/chat.txt +17 -0
  23. package/src/chat/models/index.ts +3 -0
  24. package/src/chat/mutations/chatConvo.mutation.ts +20 -0
  25. package/src/chat/mutations/chatMessage.mutation.ts +11 -0
  26. package/src/chat/mutations/index.ts +2 -0
  27. package/src/chat/query/README.md +1 -0
  28. package/src/chat/query/chatConvo.query.ts +33 -0
  29. package/src/chat/query/chatMessage.query.ts +21 -0
  30. package/src/chat/query/index.ts +2 -0
  31. package/src/chat/resolvers/ChatConvo.public.resolver.ts +15 -0
  32. package/src/chat/resolvers/ChatConvo.resolver.ts +71 -0
  33. package/src/chat/resolvers/ChatMessage.resolver.ts +62 -0
  34. package/src/chat/resolvers/index.ts +2 -0
  35. package/src/chat/subscriptions/README.md +1 -0
  36. package/src/chat/subscriptions/chatConvo.subscription.ts +19 -0
  37. package/src/chat/subscriptions/chatMessage.subscription.ts +13 -0
  38. package/src/chat/subscriptions/index.ts +2 -0
  39. package/src/example.ts +16 -0
  40. package/src/index.ts +2 -0
  41. package/src/roadman.ts +25 -0
  42. package/src/scripts/copyClient.ts +64 -0
  43. package/src/scripts/createPackageJsonForClient.ts +32 -0
  44. package/src/shared/ContextType.ts +67 -0
  45. package/src/shared/pubsub.utils.ts +93 -0
@@ -0,0 +1,67 @@
1
+ import {Field, ObjectType} from 'couchset';
2
+
3
+ /**
4
+ * GraphQL Types start
5
+ */
6
+
7
+ @ObjectType('ChatUserType')
8
+ export class ChatUserType {
9
+ @Field(() => String, {nullable: true})
10
+ id?: string;
11
+
12
+ @Field(() => String, {nullable: true})
13
+ email?: string;
14
+
15
+ @Field(() => String, {nullable: true})
16
+ username?: string;
17
+
18
+ @Field(() => String, {nullable: true})
19
+ fullname?: string;
20
+
21
+ @Field(() => String, {nullable: true})
22
+ firstname?: string;
23
+
24
+ @Field(() => String, {nullable: true})
25
+ lastname?: string;
26
+
27
+ @Field(() => String, {nullable: true})
28
+ phone?: string;
29
+
30
+ @Field(() => String, {nullable: true})
31
+ website?: string;
32
+
33
+ @Field(() => String, {nullable: true})
34
+ address?: string;
35
+
36
+ @Field(() => String, {nullable: true})
37
+ country?: string;
38
+
39
+ @Field(() => String, {nullable: true})
40
+ bio?: string;
41
+
42
+ @Field(() => String, {nullable: true})
43
+ avatar?: string;
44
+
45
+ // Wallet here
46
+ @Field(() => String, {nullable: true})
47
+ currency?: string;
48
+
49
+ @Field(() => Number, {nullable: true})
50
+ balance?: number;
51
+
52
+ @Field(() => Boolean, {nullable: true})
53
+ admin?: boolean;
54
+
55
+ @Field(() => [String], {nullable: true})
56
+ plans?: string[];
57
+
58
+ // Revoke accessToken
59
+ @Field(() => Number, {nullable: true})
60
+ tokenVersion?: number;
61
+
62
+ @Field(() => Date, {nullable: true})
63
+ createdAt?: Date;
64
+
65
+ @Field(() => Date, {nullable: true})
66
+ updatedAt?: Date;
67
+ }
@@ -0,0 +1,17 @@
1
+ SELECT *
2
+ FROM `dev` convo
3
+ INNER NEST `dev` members
4
+ ON KEYS convo.members
5
+ INNER NEST `dev` owner
6
+ ON KEYS convo.owner
7
+ WHERE convo._type = "ChatConvo"
8
+ LIMIT 1;
9
+
10
+ SELECT *
11
+ FROM `dev` convo
12
+ INNER NEST `dev` chatConvo
13
+ ON KEYS convo.chatConvoId
14
+ INNER NEST `dev` owner
15
+ ON KEYS convo.owner
16
+ WHERE convo._type = "ChatConvoUser"
17
+ LIMIT 1;
@@ -0,0 +1,3 @@
1
+ export * from './ChatAttachment.model';
2
+ export * from './ChatConvo.model';
3
+ export * from './ChatMessage.model';
@@ -0,0 +1,20 @@
1
+ import {ChatResTypeFragment} from '../fragments/resType';
2
+ import gql from 'graphql-tag';
3
+
4
+ export const CREATE_CHAT_CONVO_MUTATION = gql`
5
+ mutation CreateChatConvo($args: ChatConvoInput!) {
6
+ data: createChatConvo(args: $args) {
7
+ ...ChatResTypeFragment
8
+ }
9
+ }
10
+ ${ChatResTypeFragment}
11
+ `;
12
+
13
+ export const START_CHAT_CONVO_MUTATIONS = gql`
14
+ mutation StartChatConvo($args: ChatConvoInput!) {
15
+ data: startConvo(args: $args) {
16
+ ...ChatResTypeFragment
17
+ }
18
+ }
19
+ ${ChatResTypeFragment}
20
+ `;
@@ -0,0 +1,11 @@
1
+ import {ChatResTypeFragment} from '../fragments/resType';
2
+ import gql from 'graphql-tag';
3
+
4
+ export const CREATE_CHAT_MESSAGE_MUTATION = gql`
5
+ mutation CreateChatMessage($args: ChatMessageInput!) {
6
+ data: createChatMessage(args: $args) {
7
+ ...ChatResTypeFragment
8
+ }
9
+ }
10
+ ${ChatResTypeFragment}
11
+ `;
@@ -0,0 +1,2 @@
1
+ export * from './chatConvo.mutation';
2
+ export * from './chatMessage.mutation';
@@ -0,0 +1 @@
1
+ # Only for client query graphql-tagss
@@ -0,0 +1,33 @@
1
+ import {ChatConvoFragment} from '../fragments/chatConvo.fragment';
2
+ import gql from 'graphql-tag';
3
+
4
+ export const GET_CHAT_CONVO = gql`
5
+ query GetChatConvo($owner: String!, $before: DateTime, $after: DateTime, $limit: Float) {
6
+ data: chatConvo(owner: $owner, before: $before, after: $after, limit: $limit) {
7
+ items {
8
+ ...ChatConvoFragment
9
+ }
10
+ hasNext
11
+ params
12
+ }
13
+ }
14
+ ${ChatConvoFragment}
15
+ `;
16
+
17
+ export const GET_CHAT_CONVO_BY_ID = gql`
18
+ query GetChatConvoById($id: String!) {
19
+ data: chatConvoById(id: $id) {
20
+ ...ChatConvoFragment
21
+ }
22
+ }
23
+ ${ChatConvoFragment}
24
+ `;
25
+
26
+ export const GET_CHAT_CONVO_PUBLIC_BY_ID = gql`
27
+ query GetChatConvoPublicById($id: String!) {
28
+ data: chatConvoPublicById(id: $id) {
29
+ ...ChatConvoFragment
30
+ }
31
+ }
32
+ ${ChatConvoFragment}
33
+ `;
@@ -0,0 +1,21 @@
1
+ import {ChatMessageFragment} from '../fragments/chatMessage.fragment';
2
+ import gql from 'graphql-tag';
3
+
4
+ export const CHAT_TYPING = gql`
5
+ query ChatTyping($convoId: String!, $time: DateTime) {
6
+ data: chatTyping(convoId: $convoId, time: $time)
7
+ }
8
+ `;
9
+
10
+ export const GET_CHAT_MESSAGE = gql`
11
+ query GetChatMessage($convoId: String!, $before: DateTime, $after: DateTime, $limit: Float) {
12
+ data: chatMessage(convoId: $convoId, before: $before, after: $after, limit: $limit) {
13
+ items {
14
+ ...ChatMessageFragment
15
+ }
16
+ hasNext
17
+ params
18
+ }
19
+ }
20
+ ${ChatMessageFragment}
21
+ `;
@@ -0,0 +1,2 @@
1
+ export * from './chatConvo.query';
2
+ export * from './chatMessage.query';
@@ -0,0 +1,15 @@
1
+ import {Resolver, Arg, Query} from 'type-graphql';
2
+ import {ChatConvo} from '../models/ChatConvo.model';
3
+ import {startPublicConvo} from '../methods/ChatConvoResolver.methods';
4
+
5
+ @Resolver()
6
+ export class ChatConvoPublicResolver {
7
+ @Query(() => ChatConvo)
8
+ async chatConvoPublicById(
9
+ @Arg('id', () => String, {nullable: false}) id: string
10
+ ): Promise<ChatConvo> {
11
+ return startPublicConvo(id);
12
+ }
13
+ }
14
+
15
+ export default ChatConvoPublicResolver;
@@ -0,0 +1,71 @@
1
+ import {Resolver, Mutation, Ctx, Arg, Query, Subscription, Root, UseMiddleware} from 'type-graphql';
2
+ import {ChatConvo, ChatConvoType} from '../models/ChatConvo.model';
3
+ import {
4
+ chatConvo,
5
+ chatConvoById,
6
+ createChatConvo,
7
+ startConvo,
8
+ } from '../methods/ChatConvoResolver.methods';
9
+ import {isAuth} from '@roadmanjs/auth';
10
+ import {ChatResType, getPagination, ContextType} from '../../shared/ContextType';
11
+ import {OnChatMessage} from '../models';
12
+ import _get from 'lodash/get';
13
+
14
+ const ConvoPagination = getPagination(ChatConvo);
15
+
16
+ @Resolver()
17
+ export class ChatConvoResolver {
18
+ // TODO auth middleware
19
+ @Subscription(() => OnChatMessage, {
20
+ topics: ChatConvo.name,
21
+ filter: ({payload, args}) => args.owner === payload.owner,
22
+ })
23
+ onConvos(
24
+ @Root() data: OnChatMessage,
25
+ @Arg('owner', () => String, {nullable: false}) owner: string,
26
+ @Arg('time', () => Date, {nullable: true}) time: Date // just to make the client HOT
27
+ ): OnChatMessage {
28
+ return {time, owner, ...data};
29
+ }
30
+
31
+ @Query(() => ChatConvo)
32
+ @UseMiddleware(isAuth)
33
+ async chatConvoById(
34
+ @Ctx() ctx: ContextType,
35
+ @Arg('id', () => String, {nullable: false}) id: string
36
+ ): Promise<ChatConvo> {
37
+ const owner = _get(ctx, 'payload.userId', ''); // loggedIn user
38
+
39
+ return chatConvoById(id, owner);
40
+ }
41
+
42
+ @Query(() => ConvoPagination)
43
+ @UseMiddleware(isAuth)
44
+ async chatConvo(
45
+ @Arg('owner', () => String, {nullable: false}) owner: string,
46
+ // @Arg('sort', () => String, {nullable: true}) sortArg?: string,
47
+ @Arg('before', () => Date, {nullable: true}) before: Date,
48
+ @Arg('after', () => Date, {nullable: true}) after: Date,
49
+ @Arg('limit', () => Number, {nullable: true}) limit
50
+ ): Promise<{items: ChatConvo[]; hasNext: boolean; params: any}> {
51
+ return chatConvo({owner, before, after, limit});
52
+ }
53
+
54
+ @Mutation(() => ChatResType)
55
+ @UseMiddleware(isAuth)
56
+ async createChatConvo(
57
+ @Arg('args', () => ChatConvoType, {nullable: true}) args: ChatConvoType
58
+ ): Promise<ChatResType> {
59
+ return createChatConvo(args);
60
+ }
61
+
62
+ @Mutation(() => ChatResType)
63
+ @UseMiddleware(isAuth)
64
+ async startConvo(
65
+ @Arg('args', () => ChatConvoType, {nullable: true}) args: ChatConvoType
66
+ ): Promise<ChatResType> {
67
+ return startConvo(args);
68
+ }
69
+ }
70
+
71
+ export default ChatConvoResolver;
@@ -0,0 +1,62 @@
1
+ import {Resolver, Query, Mutation, Arg, UseMiddleware, Ctx, Subscription, Root} from 'couchset';
2
+ import {ContextType, ChatResType, getPagination} from '../../shared/ContextType';
3
+ import {isAuth} from '@roadmanjs/auth';
4
+ import {ChatMessage, ChatMessageType, OnChatMessage} from '../models/ChatMessage.model';
5
+ import {chatTyping, chatMessage, createChatMessage} from '../methods/ChatMessageResolver.methods';
6
+
7
+ const ChatPagination = getPagination(ChatMessage);
8
+
9
+ @Resolver()
10
+ export class ChatMessageResolver {
11
+ // TODO subscriptions and auth middleware
12
+ @Subscription(() => OnChatMessage, {
13
+ topics: ChatMessage.name,
14
+ filter: ({payload, args}) =>
15
+ args.convoId === payload.convoId && args.owner !== payload.owner,
16
+ })
17
+ onChatMessage(
18
+ @Root() data: OnChatMessage,
19
+ @Arg('owner', () => String, {nullable: true}) owner: string,
20
+ @Arg('convoId', () => String, {nullable: false}) convoId: string,
21
+ @Arg('time', () => Date, {nullable: true}) time: Date
22
+ ): OnChatMessage {
23
+ return {convoId, time, owner, ...data};
24
+ }
25
+
26
+ @Query(() => Boolean)
27
+ @UseMiddleware(isAuth)
28
+ async chatTyping(
29
+ @Ctx() ctx: ContextType,
30
+ @Arg('convoId', () => String, {nullable: false}) convoId: string,
31
+ @Arg('time', () => Date, {nullable: true}) time: Date // just to make the client HOT
32
+ ): Promise<boolean> {
33
+ return chatTyping(ctx, convoId, time);
34
+ }
35
+
36
+ @Query(() => ChatPagination)
37
+ async chatMessage(
38
+ @Ctx() ctx: ContextType,
39
+ @Arg('convoId', () => String, {nullable: false}) convoId: string,
40
+ // @Arg('sort', () => String, {nullable: true}) sortArg?: string,
41
+ @Arg('before', () => Date, {nullable: true}) before: Date,
42
+ @Arg('after', () => Date, {nullable: true}) after: Date,
43
+ @Arg('limit', () => Number, {nullable: true}) limit
44
+ ): Promise<{
45
+ items: ChatMessage[];
46
+ hasNext: boolean;
47
+ params: any;
48
+ }> {
49
+ return chatMessage({ctx, convoId, before, after, limit});
50
+ }
51
+
52
+ @Mutation(() => ChatResType)
53
+ @UseMiddleware(isAuth)
54
+ async createChatMessage(
55
+ @Ctx() ctx: ContextType,
56
+ @Arg('args', () => ChatMessageType, {nullable: false}) args: ChatMessageType
57
+ ): Promise<ChatResType> {
58
+ return createChatMessage(ctx, args);
59
+ }
60
+ }
61
+
62
+ export default ChatMessageResolver;
@@ -0,0 +1,2 @@
1
+ export * from './ChatConvo.resolver';
2
+ export * from './ChatMessage.resolver';
@@ -0,0 +1 @@
1
+ # Only for client query graphql-tags
@@ -0,0 +1,19 @@
1
+ import gql from 'graphql-tag';
2
+
3
+ export const ON_CHAT_CONVO_SUBSCRIPTION = gql`
4
+ subscription onChatConvo($convoId: String!) {
5
+ data: onChatConvo(convoId: $convoId)
6
+ }
7
+ `;
8
+
9
+ export const ON_CONVOS_SUBSCRIPTION = gql`
10
+ subscription OnConvos($owner: String!, $time: DateTime) {
11
+ data: onConvos(owner: $owner, time: $time) {
12
+ convoId
13
+ typing
14
+ message
15
+ time
16
+ owner
17
+ }
18
+ }
19
+ `;
@@ -0,0 +1,13 @@
1
+ import gql from 'graphql-tag';
2
+
3
+ export const ON_CHAT_MESSAGE_SUBSCRIPTION = gql`
4
+ subscription OnChatMessage($owner: String, $convoId: String!, $time: DateTime) {
5
+ data: onChatMessage(owner: $owner, convoId: $convoId, time: $time) {
6
+ convoId
7
+ typing
8
+ message
9
+ time
10
+ owner
11
+ }
12
+ }
13
+ `;
@@ -0,0 +1,2 @@
1
+ export * from './chatConvo.subscription';
2
+ export * from './chatMessage.subscription';
package/src/example.ts ADDED
@@ -0,0 +1,16 @@
1
+ import 'reflect-metadata';
2
+
3
+ import {couchsetRoadman} from '@roadmanjs/couchset';
4
+ import {getChatResolvers} from '.';
5
+ import {roadman} from 'roadman';
6
+
7
+ roadman({
8
+ resolvers: [...getChatResolvers()],
9
+ roadmen: [couchsetRoadman as any],
10
+ })
11
+ .then(() => {
12
+ console.log('roadman started');
13
+ })
14
+ .catch((error) => {
15
+ console.error(error);
16
+ });
package/src/index.ts ADDED
@@ -0,0 +1,2 @@
1
+ export * from './chat';
2
+ export * from './roadman';
package/src/roadman.ts ADDED
@@ -0,0 +1,25 @@
1
+ import 'reflect-metadata';
2
+ import 'dotenv/config';
3
+
4
+ import {ChatConvoResolver, ChatMessageResolver} from './chat/resolvers';
5
+ import {RoadMan, RoadmanBuild} from '@roadmanjs/core';
6
+
7
+ // import {configureFirebase} from '@roadmanjs/firebase-admin';
8
+ import ChatConvoPublicResolver from './chat/resolvers/ChatConvo.public.resolver';
9
+
10
+ /**
11
+ * A roadman for chat and groups, using UserType from 'auth'
12
+ * @param RoadmanBuild
13
+ */
14
+ export const chatRoadman: RoadMan = async (args: RoadmanBuild): Promise<RoadmanBuild> => {
15
+ // await configureFirebase();
16
+ return args;
17
+ };
18
+
19
+ export const getChatResolvers = () => [
20
+ ChatConvoResolver,
21
+ ChatMessageResolver,
22
+ ChatConvoPublicResolver,
23
+ ];
24
+
25
+ export default chatRoadman;
@@ -0,0 +1,64 @@
1
+ import {createClientPackageJson} from './createPackageJsonForClient';
2
+ import shelljs from 'shelljs';
3
+ import {writeFileSync} from 'fs';
4
+ /**
5
+ * TODO script to copy fragments, query, mutations, subscriptions into client output
6
+ * - The copy some parts of package-json, like version number
7
+ * - Publish the separate client package.
8
+ */
9
+
10
+ /**
11
+ Using shell we create an output folder with these files
12
+ dist-client
13
+ - README.md
14
+ - package.json (edited with minimal deps)
15
+ - docs
16
+ - register
17
+ - dist ✅
18
+ - fragments
19
+ - query
20
+ - mutations
21
+ - subscriptions
22
+ - index.ts
23
+
24
+ @PS - NOTES to friends reading this.
25
+ - Why not use yarn workspaces? these are smaller packages, some might have very few files, plus lerna private e.t.c...
26
+ - A script is more efficient and faster, can run together with main publishing CI/CD
27
+ - Two bird with one stone.
28
+
29
+ */
30
+
31
+ (async () => {
32
+ // Dirs
33
+ shelljs.rm('-rf', 'dist-client');
34
+ shelljs.mkdir('-p', 'dist-client');
35
+ shelljs.mkdir('-p', 'dist-client/dist');
36
+
37
+ // register & docs
38
+ shelljs.cp('-rf', 'register', 'dist-client/register');
39
+ shelljs.cp('-rf', 'docs', 'dist-client/docs');
40
+
41
+ // README.md
42
+ shelljs.cp('-rf', 'README.md', 'dist-client/README.md');
43
+
44
+ // package.json
45
+ // TODO edit package.json to make it smaller with less deps
46
+ // shelljs.cp('-rf', 'package.json', 'dist-client/package.json');
47
+
48
+ // frags, query, mutations, sub
49
+ shelljs.cp('-rf', 'dist/chat/fragments', 'dist-client/dist/fragments');
50
+ shelljs.cp('-rf', 'dist/chat/query', 'dist-client/dist/query');
51
+ shelljs.cp('-rf', 'dist/chat/mutations', 'dist-client/dist/mutations');
52
+ shelljs.cp('-rf', 'dist/chat/subscriptions', 'dist-client/dist/subscriptions');
53
+
54
+ // index
55
+ shelljs.cp('-rf', 'dist/chat/index-client.d.ts', 'dist-client/dist/index.d.ts');
56
+ shelljs.cp('-rf', 'dist/chat/index-client.js', 'dist-client/dist/index.js');
57
+ shelljs.cp('-rf', 'dist/chat/index-client.js.map', 'dist-client/dist/index.js.map');
58
+
59
+ const getPackageJsonFile = await createClientPackageJson();
60
+ console.log('string file', JSON.stringify(getPackageJsonFile));
61
+ writeFileSync('dist-client/package.json', JSON.stringify(getPackageJsonFile), {
62
+ encoding: 'utf8',
63
+ });
64
+ })();
@@ -0,0 +1,32 @@
1
+ /**
2
+ * A simple script to copy current version from main package.json and create a client version
3
+ */
4
+
5
+ import {readFileSync} from 'fs';
6
+
7
+ /**
8
+ * Re-usable method for generating client package.json
9
+ * @param clientPackageName
10
+ */
11
+ export const createClientPackageJson = async (): Promise<Object> => {
12
+ const packageFile: any = await readFileSync('package.json', {encoding: 'utf8'});
13
+ const packageContentJSON = JSON.parse(packageFile);
14
+
15
+ const newPackage: Object = {
16
+ ...packageContentJSON,
17
+ name: '@roadmanjs/chat-client', // TODO edit it from props
18
+ description: '@roadmanjs/chat fragments, query, mutations, subscriptions', // TODO from args
19
+ dependencies: {
20
+ // make it only one dep for easy client react .e.t.c
21
+ 'graphql-tag': '^2.12.5',
22
+ },
23
+ devDependencies: {}, // make it empty
24
+ peerDependencies: {}, // make it empty
25
+ scripts: {}, // empty scripts
26
+ };
27
+
28
+ // console.log('new packageJson file', newPackage);
29
+
30
+ return newPackage;
31
+ };
32
+ createClientPackageJson();
@@ -0,0 +1,67 @@
1
+ import {Field, ObjectType} from 'couchset';
2
+ // import { GraphQLObjectType, GraphQLScalarType } from "graphql"
3
+ import {Request, Response} from 'express';
4
+
5
+ import GraphQLJSON from 'graphql-type-json';
6
+ import {RedisPubSub} from 'graphql-redis-subscriptions';
7
+
8
+ export {GeoType} from 'couchset';
9
+
10
+ export interface ContextType {
11
+ req: Request;
12
+ res: Response;
13
+ payload?: any;
14
+ pubsub: RedisPubSub;
15
+ }
16
+
17
+ /**
18
+ * GraphQL Types start
19
+ */
20
+
21
+ /**
22
+ * ChatResType
23
+ */
24
+
25
+ export interface GeoLocationType {
26
+ lat: number;
27
+ lon: number;
28
+ }
29
+
30
+ // export const getPagination = <T>(c: T): any =>
31
+ // new GraphQLObjectType({
32
+ // name: `${(c as any).name}Pagination`,
33
+ // fields: () => ({
34
+ // // items: {type: new GraphQLList(c as any)},
35
+ // hasNext: {type: GraphQLBoolean},
36
+ // params: {type: GraphQLString}, // TODO to GraphQLJSON
37
+ // }),
38
+ // });
39
+
40
+ @ObjectType()
41
+ export class ChatResType {
42
+ @Field(() => Boolean)
43
+ success: boolean;
44
+
45
+ @Field(() => String, {nullable: true})
46
+ message?: string;
47
+
48
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
49
+ @Field((type) => GraphQLJSON, {nullable: true})
50
+ data?: any;
51
+ }
52
+
53
+ export const getPagination = <T>(c: T): any => {
54
+ @ObjectType(`${(c as any).name}Pagination`)
55
+ class Pagination {
56
+ @Field(() => [c], {nullable: true})
57
+ items: [typeof c];
58
+
59
+ @Field(() => Boolean, {nullable: true})
60
+ hasNext?: boolean;
61
+
62
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
63
+ @Field((type) => GraphQLJSON, {nullable: true})
64
+ params?: any;
65
+ }
66
+ return Pagination;
67
+ };