@things-factory/transport-base 8.0.0-beta.8 → 8.0.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.
@@ -0,0 +1,213 @@
1
+ import { Arg, Ctx, Directive, Mutation, Resolver } from 'type-graphql'
2
+ import { EntityManager, In, Repository } from 'typeorm'
3
+
4
+ import { User } from '@things-factory/auth-base'
5
+ import { Domain, getRepository } from '@things-factory/shell'
6
+
7
+ import { NewTransportVehicle, TransportVehiclePatch } from '../'
8
+ import { TransportDriver } from '../transport-driver/transport-driver'
9
+ import { TransportVehicle } from './transport-vehicle'
10
+
11
+ const debug = require('debug')('things-factory:operato-wms:addTransportVehicle')
12
+
13
+ @Resolver(TransportVehicle)
14
+ export class TransportVehicleMutation {
15
+ @Directive('@transaction')
16
+ @Directive('@privilege(category: "transport", privilege: "mutation")')
17
+ @Mutation(returns => TransportVehicle)
18
+ async createTransportVehicle(
19
+ @Arg('transportVehicle', type => NewTransportVehicle) transportVehicle: NewTransportVehicle,
20
+ @Ctx() context: ResolverContext
21
+ ): Promise<TransportVehicle> {
22
+ const { tx, domain, user } = context.state
23
+
24
+ return await createTransportVehicle(transportVehicle, domain, user, tx)
25
+ }
26
+
27
+ @Directive('@transaction')
28
+ @Directive('@privilege(category: "transport", privilege: "mutation")')
29
+ @Mutation(returns => [TransportVehicle])
30
+ async updateTransportVehicle(
31
+ @Arg('patch', type => TransportVehiclePatch) patch: TransportVehiclePatch,
32
+ @Ctx() context: ResolverContext
33
+ ): Promise<TransportVehicle> {
34
+ const { tx, domain, user } = context.state
35
+
36
+ return await updateTransportVehicle(patch, domain, user, tx)
37
+ }
38
+
39
+ @Directive('@transaction')
40
+ @Directive('@privilege(category: "transport", privilege: "mutation")')
41
+ @Mutation(returns => [TransportVehicle])
42
+ async updateMultipleTransportVehicle(
43
+ @Arg('patches', type => [TransportVehiclePatch]) patches: TransportVehiclePatch[],
44
+ @Ctx() context: ResolverContext
45
+ ): Promise<TransportVehicle[]> {
46
+ const { tx, domain, user } = context.state
47
+
48
+ let results = []
49
+ const _createRecords = patches.filter((patch: any) => patch.cuFlag === '+')
50
+ const _updateRecords = patches.filter((patch: any) => patch.cuFlag.toUpperCase() === 'M')
51
+
52
+ if (_createRecords.length > 0) {
53
+ for (let i = 0; i < _createRecords.length; i++) {
54
+ const patch: TransportVehiclePatch = _createRecords[i]
55
+ const result = await createTransportVehicle(patch, domain, user, tx)
56
+ results.push({ ...result, cuFlag: '+' })
57
+ }
58
+ }
59
+
60
+ if (_updateRecords.length > 0) {
61
+ for (let i = 0; i < _updateRecords.length; i++) {
62
+ const patch: TransportVehiclePatch = _updateRecords[i]
63
+ const result = await updateTransportVehicle(patch, domain, user, tx)
64
+ results.push({ ...result, cuFlag: 'M' })
65
+ }
66
+ }
67
+
68
+ return results
69
+ }
70
+
71
+ @Directive('@transaction')
72
+ @Directive('@privilege(category: "transport", privilege: "mutation")')
73
+ @Mutation(returns => Boolean)
74
+ async deleteTransportVehicle(@Arg('id') id: string, @Ctx() context: ResolverContext): Promise<boolean> {
75
+ const { tx } = context.state
76
+
77
+ return await deleteTransportVehicle(id, tx)
78
+ }
79
+
80
+ @Directive('@transaction')
81
+ @Directive('@privilege(category: "transport", privilege: "mutation")')
82
+ @Mutation(returns => Boolean)
83
+ async deleteTransportVehicles(
84
+ @Arg('ids', type => [String]) ids: string[],
85
+ @Ctx() context: ResolverContext
86
+ ): Promise<boolean> {
87
+ return await deleteTransportVehicles(ids, context)
88
+ }
89
+
90
+ @Directive('@transaction')
91
+ @Directive('@privilege(category: "transport", privilege: "mutation")')
92
+ @Mutation(returns => TransportVehicle)
93
+ async addTransportVehicleDriver(
94
+ @Arg('id') id: string,
95
+ @Arg('driverId', type => String) driverId: string,
96
+ @Ctx() context: ResolverContext
97
+ ): Promise<TransportVehicle> {
98
+ const { domain, user, tx } = context.state
99
+ const transportVehicleRepo = tx.getRepository(TransportVehicle)
100
+ const transportVehicle = await transportVehicleRepo.findOne({
101
+ where: { domain: { id: domain.id }, id },
102
+ relations: ['domain', 'transportDrivers']
103
+ })
104
+
105
+ if (!transportVehicle) throw new Error('Failed to find vehicle')
106
+
107
+ transportVehicle.transportDrivers = []
108
+
109
+ const newDriver = await tx
110
+ .getRepository(TransportDriver)
111
+ .findOne({ where: { id: driverId, domain: { id: domain.id } } })
112
+ if (!newDriver) throw new Error('driver not found')
113
+
114
+ transportVehicle.transportDrivers.push(newDriver)
115
+
116
+ return await transportVehicleRepo.save({
117
+ ...transportVehicle,
118
+ updater: user
119
+ })
120
+ }
121
+
122
+ @Directive('@transaction')
123
+ @Directive('@privilege(category: "transport", privilege: "mutation")')
124
+ @Mutation(returns => TransportVehicle)
125
+ async deleteTransportVehicleDrivers(
126
+ @Arg('vehicleId') vehicleId: string,
127
+ @Arg('ids', type => [String]) ids: string[],
128
+ @Ctx() context: ResolverContext
129
+ ): Promise<TransportVehicle> {
130
+ const { domain, user, tx } = context.state
131
+ const transportVehicleRepo = tx.getRepository(TransportVehicle)
132
+ const transportVehicle = await transportVehicleRepo.findOne({
133
+ where: { domain: { id: domain.id }, id: vehicleId },
134
+ relations: ['domain', 'transportDrivers']
135
+ })
136
+
137
+ if (!transportVehicle) throw new Error('Failed to find vehicle')
138
+
139
+ const existedDriverIds: string[] = transportVehicle.transportDrivers.map(transportDriver => transportDriver.id)
140
+ const newDriverIds: string[] = existedDriverIds.filter(existedDriverId => !ids.includes(existedDriverId))
141
+
142
+ return await transportVehicleRepo.save({
143
+ ...transportVehicle,
144
+ transportDrivers: await getRepository(TransportDriver).findByIds(newDriverIds),
145
+ updater: user
146
+ })
147
+ }
148
+ }
149
+
150
+ export async function createTransportVehicle(
151
+ transportVehicle: TransportVehicle | NewTransportVehicle,
152
+ domain: Domain,
153
+ user: User,
154
+ tx?: EntityManager
155
+ ) {
156
+ const repository: Repository<TransportVehicle> = tx
157
+ ? tx.getRepository(TransportVehicle)
158
+ : getRepository(TransportVehicle)
159
+ return await repository.save({
160
+ ...transportVehicle,
161
+ regNumber: transportVehicle.name,
162
+ domain,
163
+ creator: user,
164
+ updater: user
165
+ })
166
+ }
167
+
168
+ export async function updateTransportVehicle(
169
+ patch: TransportVehicle | TransportVehiclePatch,
170
+ domain: Domain,
171
+ user: User,
172
+ tx?: EntityManager
173
+ ): Promise<TransportVehicle> {
174
+ const repository: Repository<TransportVehicle> = tx
175
+ ? tx.getRepository(TransportVehicle)
176
+ : getRepository(TransportVehicle)
177
+ const transportVehicle = await repository.findOne({
178
+ where: { domain: { id: domain.id }, id: patch.id }
179
+ })
180
+
181
+ return await repository.save({
182
+ ...transportVehicle,
183
+ ...patch,
184
+ regNumber: patch.name,
185
+ updater: user
186
+ })
187
+ }
188
+
189
+ export async function deleteTransportVehicle(id: string, tx?: EntityManager) {
190
+ const repository: Repository<TransportVehicle> = tx
191
+ ? tx.getRepository(TransportVehicle)
192
+ : getRepository(TransportVehicle)
193
+ await repository.delete(id)
194
+ return true
195
+ }
196
+
197
+ export async function deleteTransportVehicles(ids: string[], context: ResolverContext) {
198
+ const { tx, user } = context.state
199
+
200
+ const transportVehicles = await tx.getRepository(TransportVehicle).find({ where: { id: In(ids) } })
201
+
202
+ let deletedTransportVehicles: TransportVehicle[] = []
203
+ deletedTransportVehicles = await Promise.all(
204
+ transportVehicles.map((transportVehicle: TransportVehicle) => {
205
+ transportVehicle.deletedAt = new Date()
206
+ transportVehicle.updater = user
207
+
208
+ return transportVehicle
209
+ })
210
+ )
211
+ await tx.getRepository(TransportVehicle).save(deletedTransportVehicles)
212
+ return true
213
+ }
@@ -0,0 +1,96 @@
1
+ import { Arg, Ctx, Directive, FieldResolver, Query, Resolver, Root } from 'type-graphql'
2
+ import { IsNull } from 'typeorm'
3
+
4
+ import { User } from '@things-factory/auth-base'
5
+ import { Bizplace } from '@things-factory/biz-base'
6
+ import { buildQuery, Domain, Filter, getRepository, Pagination, Sorting } from '@things-factory/shell'
7
+
8
+ import { TransportVehicleList } from '../'
9
+ import { TransportDriver } from '../transport-driver/transport-driver'
10
+ import { TransportVehicle } from './transport-vehicle'
11
+
12
+ @Resolver(TransportVehicle)
13
+ export class TransportVehicleQuery {
14
+ @Directive('@transaction')
15
+ @Directive('@privilege(category: "transport", privilege: "query", domainOwnerGranted: true)')
16
+ @Query(returns => TransportVehicleList)
17
+ async transportVehicles(
18
+ @Ctx() context: ResolverContext,
19
+ @Arg('filters', type => [Filter], { nullable: true }) filters?: [Filter],
20
+ @Arg('pagination', type => Pagination, { nullable: true }) pagination?: Pagination,
21
+ @Arg('sortings', type => [Sorting], { nullable: true }) sortings?: [Sorting]
22
+ ): Promise<TransportVehicleList> {
23
+ const { domain, tx } = context.state
24
+
25
+ const queryBuilder = tx.getRepository(TransportVehicle).createQueryBuilder()
26
+ buildQuery(queryBuilder, { filters, pagination, sortings }, context, {
27
+ searchables: ['name', 'description', 'size']
28
+ })
29
+
30
+ queryBuilder
31
+ .leftJoinAndSelect('TransportVehicle.domain', 'Domain')
32
+ .leftJoinAndSelect('TransportVehicle.creator', 'Creator')
33
+ .leftJoinAndSelect('TransportVehicle.updater', 'Updater')
34
+
35
+ if (filters?.length > 0) {
36
+ queryBuilder
37
+ .andWhere('Domain.id = :domainId', { domainId: domain.id })
38
+ .andWhere('TransportVehicle.deletedAt IS NULL')
39
+ } else {
40
+ queryBuilder
41
+ .where('TransportVehicle.deletedAt IS NULL')
42
+ .andWhere('Domain.id = :domainId', { domainId: domain.id })
43
+ }
44
+
45
+ const [items, total] = await queryBuilder.getManyAndCount()
46
+
47
+ return { items, total }
48
+ }
49
+
50
+ @Directive('@transaction')
51
+ @Directive('@privilege(category: "transport", privilege: "query", domainOwnerGranted: true)')
52
+ @Query(returns => TransportVehicle)
53
+ async transportVehicleById(@Arg('id') id: string, @Ctx() context: ResolverContext): Promise<TransportVehicle> {
54
+ const { domain, user, tx } = context.state
55
+
56
+ return await tx.getRepository(TransportVehicle).findOne({
57
+ where: {
58
+ id,
59
+ domain: { id: domain.id },
60
+ deletedAt: IsNull()
61
+ }
62
+ })
63
+ }
64
+
65
+ @FieldResolver(type => Domain)
66
+ async domain(@Root() transportVehicle: TransportVehicle): Promise<Domain> {
67
+ return await getRepository(Domain).findOneBy({ id: transportVehicle.domainId })
68
+ }
69
+
70
+ @FieldResolver(type => Bizplace)
71
+ async bizplace(@Root() transportVehicle: TransportVehicle): Promise<Bizplace> {
72
+ return await getRepository(Bizplace).findOneBy({ id: transportVehicle.bizplaceId })
73
+ }
74
+
75
+ @FieldResolver(type => User)
76
+ async updater(@Root() transportVehicle: TransportVehicle): Promise<User> {
77
+ return await getRepository(User).findOneBy({ id: transportVehicle.updaterId })
78
+ }
79
+
80
+ @FieldResolver(type => User)
81
+ async creator(@Root() transportVehicle: TransportVehicle): Promise<User> {
82
+ return await getRepository(User).findOneBy({ id: transportVehicle.creatorId })
83
+ }
84
+
85
+ @FieldResolver(type => [TransportDriver])
86
+ async transportDrivers(@Root() transportVehicle: TransportVehicle): Promise<TransportDriver[]> {
87
+ return await (
88
+ await getRepository(TransportVehicle).findOne({
89
+ where: {
90
+ id: transportVehicle.id
91
+ },
92
+ relations: ['transportDrivers']
93
+ })
94
+ ).transportDrivers
95
+ }
96
+ }
@@ -0,0 +1,53 @@
1
+ import { Field, InputType, Int, ObjectType } from 'type-graphql'
2
+ import { TransportVehicle } from './transport-vehicle'
3
+
4
+ @ObjectType()
5
+ export class TransportVehicleList {
6
+ @Field(type => [TransportVehicle])
7
+ items: TransportVehicle[]
8
+
9
+ @Field(type => Int)
10
+ total: number
11
+ }
12
+
13
+ @InputType()
14
+ export class NewTransportVehicle {
15
+ @Field()
16
+ name: string
17
+
18
+ @Field()
19
+ regNumber: string
20
+
21
+ @Field()
22
+ size: string
23
+
24
+ @Field()
25
+ status: string
26
+
27
+ @Field({ nullable: true })
28
+ description: string
29
+ }
30
+
31
+ @InputType()
32
+ export class TransportVehiclePatch {
33
+ @Field({ nullable: true })
34
+ id: string
35
+
36
+ @Field({ nullable: true })
37
+ name: string
38
+
39
+ @Field({ nullable: true })
40
+ regNumber: string
41
+
42
+ @Field({ nullable: true })
43
+ size: string
44
+
45
+ @Field({ nullable: true })
46
+ status: string
47
+
48
+ @Field({ nullable: true })
49
+ description: string
50
+
51
+ @Field({ nullable: true })
52
+ cuFlag: string
53
+ }
@@ -0,0 +1,111 @@
1
+ import { Field, ID, ObjectType } from 'type-graphql'
2
+ import {
3
+ Column,
4
+ CreateDateColumn,
5
+ Entity,
6
+ Index,
7
+ ManyToMany,
8
+ ManyToOne,
9
+ PrimaryGeneratedColumn,
10
+ RelationId,
11
+ UpdateDateColumn
12
+ } from 'typeorm'
13
+
14
+ import { User } from '@things-factory/auth-base'
15
+ import { Bizplace } from '@things-factory/biz-base'
16
+ import { Domain } from '@things-factory/shell'
17
+
18
+ import { TransportDriver } from '../transport-driver/transport-driver'
19
+
20
+ @Entity()
21
+ @Index(
22
+ 'ix_transport-vehicle_0',
23
+ (transportVehicle: TransportVehicle) => [transportVehicle.domain, transportVehicle.name],
24
+ { unique: true }
25
+ )
26
+ @ObjectType()
27
+ export class TransportVehicle {
28
+ @PrimaryGeneratedColumn('uuid')
29
+ @Field(type => ID)
30
+ readonly id: string
31
+
32
+ @ManyToOne(type => Domain, { nullable: false })
33
+ @Field(type => Domain)
34
+ domain: Domain
35
+
36
+ @RelationId((transportVehicle: TransportVehicle) => transportVehicle.domain)
37
+ domainId: string
38
+
39
+ @ManyToOne(type => Bizplace, { nullable: true })
40
+ @Field(type => Bizplace, { nullable: true })
41
+ bizplace?: Bizplace
42
+
43
+ @RelationId((transportVehicle: TransportVehicle) => transportVehicle.bizplace)
44
+ bizplaceId?: string
45
+
46
+ @Column()
47
+ @Field()
48
+ name: string
49
+
50
+ @ManyToMany(type => TransportDriver, transportDriver => transportDriver.transportVehicles)
51
+ @Field(type => [TransportDriver], { nullable: true })
52
+ transportDrivers: TransportDriver[]
53
+
54
+ @Column()
55
+ @Field()
56
+ regNumber: string
57
+
58
+ @Column({ comment: '1ton, 3ton, 5ton, 8ton, 10ton' })
59
+ @Field()
60
+ size: string
61
+
62
+ @Column()
63
+ @Field()
64
+ status: string
65
+
66
+ @Column({ nullable: true })
67
+ @Field({ nullable: true })
68
+ description: string
69
+
70
+ @Column({ nullable: true })
71
+ @Field({ nullable: true })
72
+ ownerType: string
73
+
74
+ @Column({ nullable: true })
75
+ @Field({ nullable: true })
76
+ serviceStartDate: Date
77
+
78
+ @Column({ nullable: true })
79
+ @Field({ nullable: true })
80
+ serviceEndDate: Date
81
+
82
+ @Column({ nullable: true })
83
+ @Field({ nullable: true })
84
+ isEnabled: boolean
85
+
86
+ @ManyToOne(type => User)
87
+ @Field(type => User, { nullable: true })
88
+ creator: User
89
+
90
+ @RelationId((transportVehicle: TransportVehicle) => transportVehicle.creator)
91
+ creatorId: string
92
+
93
+ @ManyToOne(type => User)
94
+ @Field(type => User, { nullable: true })
95
+ updater: User
96
+
97
+ @RelationId((transportVehicle: TransportVehicle) => transportVehicle.updater)
98
+ updaterId: string
99
+
100
+ @CreateDateColumn()
101
+ @Field()
102
+ createdAt: Date
103
+
104
+ @UpdateDateColumn()
105
+ @Field()
106
+ updatedAt: Date
107
+
108
+ @Column({ nullable: true })
109
+ @Field({ nullable: true })
110
+ deletedAt: Date
111
+ }