Skip to content

Commit b34c433

Browse files
committed
feat: create order
1 parent fa1b7c4 commit b34c433

File tree

16 files changed

+578
-7
lines changed

16 files changed

+578
-7
lines changed

apps/api/src/chat/chat.module.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,15 +17,18 @@ import { Campaign, CampaignAuthorizer } from './entities/campaign'
1717
import { CampaignMessage } from './entities/campaign-message'
1818
import { Contact, ContactAuthorizer } from './entities/contact'
1919
import { Menu, MenuAuthorizer } from './entities/menu'
20+
import { Order, OrderAuthorizer } from './entities/order'
2021
import { CampaignResolver } from './resolvers/campaign.resolver'
2122
import { ContactResolver } from './resolvers/contact.resolver'
2223
import { MenuResolver } from './resolvers/menu.resolver'
24+
import { OrderResolver } from './resolvers/order.resolver'
2325
import { BroadcastConsumer } from './services/broadcast.consumer'
2426
import { CampaignMessageService } from './services/campaign-message.service'
2527
import { CampaignService } from './services/campaign.service'
2628
import { ContactsConsumer } from './services/contact.consumer'
2729
import { ContactService } from './services/contact.service'
2830
import { MenuService } from './services/menu.service'
31+
import { OrderService } from './services/order.service'
2932

3033
@Module({
3134
imports: [
@@ -45,6 +48,10 @@ import { MenuService } from './services/menu.service'
4548
imports: [NestjsQueryTypegooseModule.forFeature([Menu])],
4649
dtos: [{ DTOClass: Menu }],
4750
}),
51+
NestjsQueryGraphQLModule.forFeature({
52+
imports: [NestjsQueryTypegooseModule.forFeature([Order])],
53+
dtos: [{ DTOClass: Order }],
54+
}),
4855
BullModule.registerQueue({
4956
name: 'broadcast',
5057
settings: {
@@ -78,18 +85,22 @@ import { MenuService } from './services/menu.service'
7885
ContactResolver,
7986
CampaignResolver,
8087
MenuResolver,
88+
OrderResolver,
8189

8290
// Services
8391
ContactService,
8492
CampaignService,
8593
CampaignMessageService,
8694
MenuService,
95+
OrderService,
8796

8897
// Authorizers
8998
ContactAuthorizer,
9099
CampaignAuthorizer,
91100
MenuAuthorizer,
101+
OrderAuthorizer,
92102

103+
// Consumers
93104
BroadcastConsumer,
94105
ContactsConsumer,
95106
],
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
import { Field, InputType, ObjectType } from '@nestjs/graphql'
2+
import { prop } from '@typegoose/typegoose'
3+
4+
@ObjectType()
5+
export class OrderItem {
6+
@Field()
7+
@prop({ required: true, set: (name) => name.trim() })
8+
name: string
9+
10+
@Field()
11+
@prop({ required: true })
12+
quantity: number
13+
}
14+
15+
@InputType()
16+
export class CreateOrderItemInput {
17+
@Field()
18+
name: string
19+
20+
@Field()
21+
quantity: number
22+
}
23+
24+
@InputType()
25+
export class UpdateOrderItemInput {
26+
@Field({ nullable: true })
27+
name: string
28+
29+
@Field({ nullable: true })
30+
quantity: number
31+
}
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
import { BaseEntity } from '@app/common/base/base-entity'
2+
import { OwnedAuthorizer } from '@app/common/base/owned.authorizer'
3+
import { OwnedEntity } from '@app/common/decorators/owned-entity.decorator'
4+
import { Reference } from '@app/common/typings/mongodb'
5+
import { Injectable } from '@nestjs/common'
6+
import { Field, InputType, ObjectType } from '@nestjs/graphql'
7+
import { Authorize } from '@ptc-org/nestjs-query-graphql'
8+
import { prop } from '@typegoose/typegoose'
9+
import { getAddress, isAddress } from 'ethers/lib/utils'
10+
import { User } from '../../users/entities/user'
11+
import { CreateOrderItemInput, OrderItem, UpdateOrderItemInput } from './order-item'
12+
13+
export enum OrderState {
14+
PendingPayment = 'pending-payment',
15+
PendingDelivery = 'pending-delivery',
16+
Completed = 'completed',
17+
}
18+
19+
@Injectable()
20+
export class OrderAuthorizer extends OwnedAuthorizer<Order> {}
21+
22+
@ObjectType()
23+
@OwnedEntity()
24+
@Authorize<Order>(OrderAuthorizer)
25+
export class Order extends BaseEntity {
26+
@prop({ ref: User, required: true, index: true })
27+
readonly owner!: Reference<User>
28+
29+
@Field()
30+
@prop({ required: true, validate: isAddress, set: (addr) => addr && getAddress(addr) })
31+
address: string
32+
33+
@Field()
34+
@prop({ required: true, default: 0 })
35+
total: number
36+
37+
@prop({ required: true })
38+
@Field()
39+
state: OrderState
40+
41+
@Field(() => [OrderItem])
42+
@prop({ default: [] })
43+
items: OrderItem[]
44+
}
45+
46+
@InputType()
47+
export class CreateOrderInput {
48+
@Field()
49+
address: string
50+
51+
@Field({ nullable: true })
52+
total: number
53+
54+
@Field()
55+
state: OrderState
56+
57+
@Field(() => [CreateOrderItemInput])
58+
items: CreateOrderItemInput[]
59+
}
60+
61+
@InputType()
62+
export class UpdateOrderInput {
63+
@Field({ nullable: true })
64+
address: string
65+
66+
@Field({ nullable: true })
67+
total: number
68+
69+
@Field({ nullable: true })
70+
state: OrderState
71+
72+
@Field(() => [UpdateOrderItemInput], { nullable: true })
73+
items: UpdateOrderItemInput[]
74+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import { BaseResolver } from '@app/common/base/base.resolver'
2+
import { UseGuards, UseInterceptors } from '@nestjs/common'
3+
import { Resolver } from '@nestjs/graphql'
4+
import { Authorizer, AuthorizerInterceptor, InjectAuthorizer } from '@ptc-org/nestjs-query-graphql'
5+
import { GraphqlGuard } from '../../auth/guards/graphql.guard'
6+
import { CreateOrderInput, Order, UpdateOrderInput } from '../entities/order'
7+
import { OrderService } from '../services/order.service'
8+
9+
@Resolver(() => Order)
10+
@UseGuards(GraphqlGuard)
11+
@UseInterceptors(AuthorizerInterceptor(Order))
12+
export class OrderResolver extends BaseResolver(Order, {
13+
CreateDTOClass: CreateOrderInput,
14+
UpdateDTOClass: UpdateOrderInput,
15+
guards: [GraphqlGuard],
16+
}) {
17+
constructor(protected orderService: OrderService, @InjectAuthorizer(Order) readonly authorizer: Authorizer<Order>) {
18+
super(orderService)
19+
}
20+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import { BaseService } from '@app/common/base/base.service'
2+
import { Injectable, Logger } from '@nestjs/common'
3+
import { ReturnModelType } from '@typegoose/typegoose'
4+
import { InjectModel } from 'nestjs-typegoose'
5+
import { Order } from '../entities/order'
6+
7+
@Injectable()
8+
export class OrderService extends BaseService<Order> {
9+
protected readonly logger = new Logger(OrderService.name)
10+
static instance: OrderService
11+
12+
constructor(@InjectModel(Order) protected readonly model: ReturnModelType<typeof Order>) {
13+
super(model)
14+
OrderService.instance = this
15+
}
16+
}

apps/runner/src/services/runner.service.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -679,7 +679,7 @@ export class RunnerService {
679679
ownerId: string,
680680
onError: () => any,
681681
) {
682-
if (workflow.type !== 'chatbot' || integration.key !== 'chatbot') {
682+
if (workflow.type !== 'chatbot' || !['chatbot', 'orders'].includes(integration.key)) {
683683
return this.getCredentialsAndIntegrationAccount(credentialsId, ownerId, onError)
684684
}
685685

generated/graphql.ts

Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,11 @@ export enum MenuSortFields {
161161
createdAt = "createdAt"
162162
}
163163

164+
export enum OrderSortFields {
165+
id = "id",
166+
createdAt = "createdAt"
167+
}
168+
164169
export enum UserDatabaseSortFields {
165170
id = "id",
166171
createdAt = "createdAt"
@@ -552,6 +557,19 @@ export interface MenuSort {
552557
nulls?: Nullable<SortNulls>;
553558
}
554559

560+
export interface OrderFilter {
561+
and?: Nullable<OrderFilter[]>;
562+
or?: Nullable<OrderFilter[]>;
563+
id?: Nullable<IDFilterComparison>;
564+
createdAt?: Nullable<DateFieldComparison>;
565+
}
566+
567+
export interface OrderSort {
568+
field: OrderSortFields;
569+
direction: SortDirection;
570+
nulls?: Nullable<SortNulls>;
571+
}
572+
555573
export interface UserDatabaseFilter {
556574
and?: Nullable<UserDatabaseFilter[]>;
557575
or?: Nullable<UserDatabaseFilter[]>;
@@ -802,6 +820,43 @@ export interface DeleteOneMenuInput {
802820
id: string;
803821
}
804822

823+
export interface CreateOneOrderInput {
824+
order: CreateOrderInput;
825+
}
826+
827+
export interface CreateOrderInput {
828+
address: string;
829+
total?: Nullable<number>;
830+
state: string;
831+
items: CreateOrderItemInput[];
832+
}
833+
834+
export interface CreateOrderItemInput {
835+
name: string;
836+
quantity: number;
837+
}
838+
839+
export interface UpdateOneOrderInput {
840+
id: string;
841+
update: UpdateOrderInput;
842+
}
843+
844+
export interface UpdateOrderInput {
845+
address?: Nullable<string>;
846+
total?: Nullable<number>;
847+
state?: Nullable<string>;
848+
items?: Nullable<UpdateOrderItemInput[]>;
849+
}
850+
851+
export interface UpdateOrderItemInput {
852+
name?: Nullable<string>;
853+
quantity?: Nullable<number>;
854+
}
855+
856+
export interface DeleteOneOrderInput {
857+
id: string;
858+
}
859+
805860
export interface CreateOneUserDatabaseInput {
806861
userDatabase: CreateUserDatabase;
807862
}
@@ -1030,6 +1085,20 @@ export interface AccountCredential {
10301085
authExpired: boolean;
10311086
}
10321087

1088+
export interface OrderItem {
1089+
name: string;
1090+
quantity: number;
1091+
}
1092+
1093+
export interface Order {
1094+
id: string;
1095+
createdAt: DateTime;
1096+
address: string;
1097+
total: number;
1098+
state: string;
1099+
items: OrderItem[];
1100+
}
1101+
10331102
export interface UserDatabase {
10341103
id: string;
10351104
createdAt: DateTime;
@@ -1332,6 +1401,25 @@ export interface MenuConnection {
13321401
edges: MenuEdge[];
13331402
}
13341403

1404+
export interface OrderDeleteResponse {
1405+
id?: Nullable<string>;
1406+
createdAt?: Nullable<DateTime>;
1407+
address?: Nullable<string>;
1408+
total?: Nullable<number>;
1409+
state?: Nullable<string>;
1410+
items?: Nullable<OrderItem[]>;
1411+
}
1412+
1413+
export interface OrderEdge {
1414+
node: Order;
1415+
cursor: ConnectionCursor;
1416+
}
1417+
1418+
export interface OrderConnection {
1419+
pageInfo: PageInfo;
1420+
edges: OrderEdge[];
1421+
}
1422+
13351423
export interface WorkflowTriggerDeleteResponse {
13361424
id?: Nullable<string>;
13371425
createdAt?: Nullable<DateTime>;
@@ -1523,6 +1611,8 @@ export interface IQuery {
15231611
campaigns(paging?: Nullable<CursorPaging>, filter?: Nullable<CampaignFilter>, sorting?: Nullable<CampaignSort[]>): CampaignConnection | Promise<CampaignConnection>;
15241612
menu(id: string): Menu | Promise<Menu>;
15251613
menus(paging?: Nullable<CursorPaging>, filter?: Nullable<MenuFilter>, sorting?: Nullable<MenuSort[]>): MenuConnection | Promise<MenuConnection>;
1614+
order(id: string): Order | Promise<Order>;
1615+
orders(paging?: Nullable<CursorPaging>, filter?: Nullable<OrderFilter>, sorting?: Nullable<OrderSort[]>): OrderConnection | Promise<OrderConnection>;
15261616
contractSchema(chainId: number, address: string, type: string): ContractSchema | Promise<ContractSchema>;
15271617
asyncSchemas(integrationId: string, accountCredentialId: string, names: string[], inputs?: Nullable<JSONObject>, integrationTriggerId?: Nullable<string>, integrationActionId?: Nullable<string>): AsyncSchema | Promise<AsyncSchema>;
15281618
manyAsyncSchemas(asyncSchemaInputs: JSONObject[]): AsyncSchema | Promise<AsyncSchema>;
@@ -1575,6 +1665,9 @@ export interface IMutation {
15751665
createOneMenu(input: CreateOneMenuInput): Menu | Promise<Menu>;
15761666
updateOneMenu(input: UpdateOneMenuInput): Menu | Promise<Menu>;
15771667
deleteOneMenu(input: DeleteOneMenuInput): MenuDeleteResponse | Promise<MenuDeleteResponse>;
1668+
createOneOrder(input: CreateOneOrderInput): Order | Promise<Order>;
1669+
updateOneOrder(input: UpdateOneOrderInput): Order | Promise<Order>;
1670+
deleteOneOrder(input: DeleteOneOrderInput): OrderDeleteResponse | Promise<OrderDeleteResponse>;
15781671
createOneUserDatabase(input: CreateOneUserDatabaseInput): UserDatabase | Promise<UserDatabase>;
15791672
updateOneUserDatabase(input: UpdateOneUserDatabaseInput): UserDatabase | Promise<UserDatabase>;
15801673
deleteOneUserDatabase(input: DeleteOneUserDatabaseInput): UserDatabaseDeleteResponse | Promise<UserDatabaseDeleteResponse>;

0 commit comments

Comments
 (0)