@things-factory/calendar 8.0.0-beta.9 → 8.0.2

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 (36) hide show
  1. package/client/bootstrap.ts +1 -0
  2. package/client/index.ts +0 -0
  3. package/client/pages/attendee/attendee-importer.ts +87 -0
  4. package/client/pages/attendee/attendee-list-page.ts +324 -0
  5. package/client/pages/calendar/calendar-importer.ts +87 -0
  6. package/client/pages/calendar/calendar-list-page.ts +325 -0
  7. package/client/pages/calendar/calendar-page.ts +128 -0
  8. package/client/pages/event/event-importer.ts +87 -0
  9. package/client/pages/event/event-list-page.ts +324 -0
  10. package/client/route.ts +19 -0
  11. package/client/tsconfig.json +13 -0
  12. package/dist-client/tsconfig.tsbuildinfo +1 -1
  13. package/dist-server/tsconfig.tsbuildinfo +1 -1
  14. package/package.json +7 -7
  15. package/server/controllers/index.ts +0 -0
  16. package/server/index.ts +4 -0
  17. package/server/middlewares/index.ts +3 -0
  18. package/server/migrations/index.ts +9 -0
  19. package/server/routes.ts +28 -0
  20. package/server/service/attendee/attendee-mutation.ts +122 -0
  21. package/server/service/attendee/attendee-query.ts +31 -0
  22. package/server/service/attendee/attendee-type.ts +44 -0
  23. package/server/service/attendee/attendee.ts +37 -0
  24. package/server/service/attendee/index.ts +7 -0
  25. package/server/service/calendar/calendar-mutation.ts +133 -0
  26. package/server/service/calendar/calendar-query.ts +48 -0
  27. package/server/service/calendar/calendar-type.ts +55 -0
  28. package/server/service/calendar/calendar.ts +82 -0
  29. package/server/service/calendar/index.ts +7 -0
  30. package/server/service/event/event-mutation.ts +125 -0
  31. package/server/service/event/event-query.ts +38 -0
  32. package/server/service/event/event-type.ts +61 -0
  33. package/server/service/event/event.ts +85 -0
  34. package/server/service/event/index.ts +7 -0
  35. package/server/service/index.ts +32 -0
  36. package/server/tsconfig.json +10 -0
@@ -0,0 +1,125 @@
1
+ import { Resolver, Mutation, Arg, Ctx, Directive } from 'type-graphql'
2
+ import { In } from 'typeorm'
3
+
4
+ import { Event } from './event'
5
+ import { NewEvent, EventPatch } from './event-type'
6
+
7
+ @Resolver(Event)
8
+ export class EventMutation {
9
+ @Directive('@transaction')
10
+ @Mutation(returns => Event, { description: 'To create new Event' })
11
+ async createEvent(@Arg('event') event: NewEvent, @Ctx() context: ResolverContext): Promise<Event> {
12
+ const { user, tx } = context.state
13
+
14
+ return await tx.getRepository(Event).save({
15
+ ...event,
16
+ creator: user,
17
+ updater: user
18
+ })
19
+ }
20
+
21
+ @Directive('@transaction')
22
+ @Mutation(returns => Event, { description: 'To modify Event information' })
23
+ async updateEvent(
24
+ @Arg('id') id: string,
25
+ @Arg('patch') patch: EventPatch,
26
+ @Ctx() context: ResolverContext
27
+ ): Promise<Event> {
28
+ const { user, tx } = context.state
29
+
30
+ const repository = tx.getRepository(Event)
31
+ const event = await repository.findOne({
32
+ where: { id }
33
+ })
34
+
35
+ return await repository.save({
36
+ ...event,
37
+ ...patch,
38
+ updater: user
39
+ })
40
+ }
41
+
42
+ @Directive('@transaction')
43
+ @Mutation(returns => [Event], { description: "To modify multiple Events' information" })
44
+ async updateMultipleEvent(
45
+ @Arg('patches', type => [EventPatch]) patches: EventPatch[],
46
+ @Ctx() context: ResolverContext
47
+ ): Promise<Event[]> {
48
+ const { user, tx } = context.state
49
+
50
+ let results = []
51
+ const _createRecords = patches.filter((patch: any) => patch.cuFlag.toUpperCase() === '+')
52
+ const _updateRecords = patches.filter((patch: any) => patch.cuFlag.toUpperCase() === 'M')
53
+ const eventRepo = tx.getRepository(Event)
54
+
55
+ if (_createRecords.length > 0) {
56
+ for (let i = 0; i < _createRecords.length; i++) {
57
+ const newRecord = _createRecords[i]
58
+
59
+ const result = await eventRepo.save({
60
+ ...newRecord,
61
+ creator: user,
62
+ updater: user
63
+ })
64
+
65
+ results.push({ ...result, cuFlag: '+' })
66
+ }
67
+ }
68
+
69
+ if (_updateRecords.length > 0) {
70
+ for (let i = 0; i < _updateRecords.length; i++) {
71
+ const updateRecord = _updateRecords[i]
72
+ const event = await eventRepo.findOneBy({ id: updateRecord.id })
73
+
74
+ const result = await eventRepo.save({
75
+ ...event,
76
+ ...updateRecord,
77
+ updater: user
78
+ })
79
+
80
+ results.push({ ...result, cuFlag: 'M' })
81
+ }
82
+ }
83
+
84
+ return results
85
+ }
86
+
87
+ @Directive('@transaction')
88
+ @Mutation(returns => Boolean, { description: 'To delete Event' })
89
+ async deleteEvent(@Arg('id') id: string, @Ctx() context: ResolverContext): Promise<boolean> {
90
+ const { tx } = context.state
91
+
92
+ await tx.getRepository(Event).delete({ id })
93
+
94
+ return true
95
+ }
96
+
97
+ @Directive('@transaction')
98
+ @Mutation(returns => Boolean, { description: 'To delete multiple Events' })
99
+ async deleteEvents(@Arg('ids', type => [String]) ids: string[], @Ctx() context: ResolverContext): Promise<boolean> {
100
+ const { tx } = context.state
101
+
102
+ await tx.getRepository(Event).delete({
103
+ id: In(ids)
104
+ })
105
+
106
+ return true
107
+ }
108
+
109
+ @Directive('@transaction')
110
+ @Mutation(returns => Boolean, { description: 'To import multiple Events' })
111
+ async importEvents(
112
+ @Arg('events', type => [EventPatch]) events: EventPatch[],
113
+ @Ctx() context: ResolverContext
114
+ ): Promise<boolean> {
115
+ const { tx } = context.state
116
+
117
+ await Promise.all(
118
+ events.map(async (event: EventPatch) => {
119
+ const createdEvent: Event = await tx.getRepository(Event).save({ ...event })
120
+ })
121
+ )
122
+
123
+ return true
124
+ }
125
+ }
@@ -0,0 +1,38 @@
1
+ import { Resolver, Query, FieldResolver, Root, Args, Arg, Ctx, Directive } from 'type-graphql'
2
+ import { getQueryBuilderFromListParams, getRepository, ListParam } from '@things-factory/shell'
3
+ import { User } from '@things-factory/auth-base'
4
+ import { Event } from './event'
5
+ import { EventList } from './event-type'
6
+
7
+ @Resolver(Event)
8
+ export class EventQuery {
9
+ @Query(returns => Event!, { nullable: true, description: 'To fetch a Event' })
10
+ async event(@Arg('id') id: string, @Ctx() context: ResolverContext): Promise<Event> {
11
+ return await getRepository(Event).findOne({
12
+ where: { id }
13
+ })
14
+ }
15
+
16
+ @Query(returns => EventList, { description: 'To fetch multiple Events' })
17
+ async events(@Args(type => ListParam) params: ListParam, @Ctx() context: ResolverContext): Promise<EventList> {
18
+ const queryBuilder = getQueryBuilderFromListParams({
19
+ params,
20
+ repository: await getRepository(Event),
21
+ searchables: ['name', 'description']
22
+ })
23
+
24
+ const [items, total] = await queryBuilder.getManyAndCount()
25
+
26
+ return { items, total }
27
+ }
28
+
29
+ @FieldResolver(type => User)
30
+ async updater(@Root() event: Event): Promise<User> {
31
+ return await getRepository(User).findOneBy({ id: event.updaterId })
32
+ }
33
+
34
+ @FieldResolver(type => User)
35
+ async creator(@Root() event: Event): Promise<User> {
36
+ return await getRepository(User).findOneBy({ id: event.creatorId })
37
+ }
38
+ }
@@ -0,0 +1,61 @@
1
+ import type { FileUpload } from 'graphql-upload/GraphQLUpload.js'
2
+ import GraphQLUpload from 'graphql-upload/GraphQLUpload.js'
3
+ import { ObjectType, Field, InputType, Int, ID, registerEnumType } from 'type-graphql'
4
+
5
+ import { ObjectRef, ScalarObject } from '@things-factory/shell'
6
+
7
+ import { Event, EventStatus } from './event'
8
+
9
+ @InputType()
10
+ export class NewEvent {
11
+ @Field()
12
+ name: string
13
+
14
+ @Field({ nullable: true })
15
+ description?: string
16
+
17
+ @Field(type => EventStatus, { nullable: true })
18
+ state?: EventStatus
19
+
20
+ @Field({ nullable: true })
21
+ active?: boolean
22
+
23
+ @Field({ nullable: true })
24
+ params?: string
25
+
26
+ @Field(type => GraphQLUpload, { nullable: true })
27
+ thumbnail?: FileUpload
28
+ }
29
+
30
+ @InputType()
31
+ export class EventPatch {
32
+ @Field(type => ID, { nullable: true })
33
+ id?: string
34
+
35
+ @Field({ nullable: true })
36
+ name?: string
37
+
38
+ @Field({ nullable: true })
39
+ description?: string
40
+
41
+ @Field(type => EventStatus, { nullable: true })
42
+ state?: EventStatus
43
+
44
+ @Field({ nullable: true })
45
+ active?: boolean
46
+
47
+ @Field(type => GraphQLUpload, { nullable: true })
48
+ thumbnail?: FileUpload
49
+
50
+ @Field({ nullable: true })
51
+ cuFlag?: string
52
+ }
53
+
54
+ @ObjectType()
55
+ export class EventList {
56
+ @Field(type => [Event])
57
+ items: Event[]
58
+
59
+ @Field(type => Int)
60
+ total: number
61
+ }
@@ -0,0 +1,85 @@
1
+ import {
2
+ CreateDateColumn,
3
+ UpdateDateColumn,
4
+ Entity,
5
+ Index,
6
+ Column,
7
+ RelationId,
8
+ ManyToOne,
9
+ ManyToMany,
10
+ JoinTable,
11
+ PrimaryGeneratedColumn
12
+ } from 'typeorm'
13
+ import { ObjectType, Field, Int, ID, registerEnumType } from 'type-graphql'
14
+
15
+ import { User } from '@things-factory/auth-base'
16
+ import { Attendee } from '../attendee/attendee'
17
+
18
+ export enum EventStatus {
19
+ STATUS_A = 'STATUS_A',
20
+ STATUS_B = 'STATUS_B'
21
+ }
22
+
23
+ registerEnumType(EventStatus, {
24
+ name: 'EventStatus',
25
+ description: 'state enumeration of a event'
26
+ })
27
+
28
+ @Entity()
29
+ @ObjectType({ description: 'Entity for Event' })
30
+ export class Event {
31
+ @PrimaryGeneratedColumn('uuid')
32
+ @Field(type => ID)
33
+ readonly id: string
34
+
35
+ @Column()
36
+ @Field({ nullable: true })
37
+ name?: string
38
+
39
+ @Column({ nullable: true })
40
+ @Field({ nullable: true })
41
+ description?: string
42
+
43
+ @Column({ type: 'datetime' })
44
+ @Field({ nullable: true })
45
+ startDateTime: Date
46
+
47
+ @Column({ type: 'datetime' })
48
+ @Field({ nullable: true })
49
+ endDateTime: Date
50
+
51
+ @Column({ nullable: true })
52
+ @Field({ nullable: true })
53
+ location: string
54
+
55
+ @ManyToMany(() => Attendee)
56
+ @JoinTable()
57
+ @Field(type => [Attendee], { nullable: true })
58
+ attendees: Attendee[]
59
+
60
+ @Column({ nullable: true })
61
+ @Field({ nullable: true })
62
+ state?: EventStatus
63
+
64
+ @CreateDateColumn()
65
+ @Field({ nullable: true })
66
+ createdAt?: Date
67
+
68
+ @UpdateDateColumn()
69
+ @Field({ nullable: true })
70
+ updatedAt?: Date
71
+
72
+ @ManyToOne(type => User, { nullable: true })
73
+ @Field(type => User, { nullable: true })
74
+ creator?: User
75
+
76
+ @RelationId((event: Event) => event.creator)
77
+ creatorId?: string
78
+
79
+ @ManyToOne(type => User, { nullable: true })
80
+ @Field(type => User, { nullable: true })
81
+ updater?: User
82
+
83
+ @RelationId((event: Event) => event.updater)
84
+ updaterId?: string
85
+ }
@@ -0,0 +1,7 @@
1
+ import { Event } from './event'
2
+ import { EventQuery } from './event-query'
3
+ import { EventMutation } from './event-mutation'
4
+
5
+ export const entities = [Event]
6
+ export const resolvers = [EventQuery, EventMutation]
7
+ export const subscribers = []
@@ -0,0 +1,32 @@
1
+ /* EXPORT ENTITY TYPES */
2
+ export * from './attendee/attendee'
3
+ export * from './event/event'
4
+ export * from './calendar/calendar'
5
+
6
+ /* IMPORT ENTITIES AND RESOLVERS */
7
+ import { entities as AttendeeEntities, resolvers as AttendeeResolvers, subscribers as AttendeeSubscribers } from './attendee'
8
+ import { entities as EventEntities, resolvers as EventResolvers, subscribers as EventSubscribers } from './event'
9
+ import { entities as CalendarEntities, resolvers as CalendarResolvers, subscribers as CalendarSubscribers } from './calendar'
10
+
11
+ export const entities = [
12
+ /* ENTITIES */
13
+ ...AttendeeEntities,
14
+ ...EventEntities,
15
+ ...CalendarEntities,
16
+ ]
17
+
18
+ export const subscribers = [
19
+ /* SUBSCRIBERS */
20
+ ...AttendeeSubscribers,
21
+ ...EventSubscribers,
22
+ ...CalendarSubscribers,
23
+ ]
24
+
25
+ export const schema = {
26
+ resolverClasses: [
27
+ /* RESOLVER CLASSES */
28
+ ...AttendeeResolvers,
29
+ ...EventResolvers,
30
+ ...CalendarResolvers,
31
+ ]
32
+ }
@@ -0,0 +1,10 @@
1
+ {
2
+ "extends": "../../tsconfig-base.json",
3
+ "compilerOptions": {
4
+ "strict": false,
5
+ "module": "commonjs",
6
+ "outDir": "../dist-server",
7
+ "baseUrl": "./"
8
+ },
9
+ "include": ["./**/*"]
10
+ }