This repository has been archived by the owner on Apr 3, 2024. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathapi-schema.graphql
2508 lines (2251 loc) · 82.2 KB
/
api-schema.graphql
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
# This file was generated based on ".graphqlconfig". Do not edit manually.
schema {
query: Query
mutation: Mutation
}
directive @custom_rule(name: String!, options: RuleOptions) on FIELD_DEFINITION
directive @rule(options: RuleOptions, ruleType: RuleType, subject: AbilitySubjects) on FIELD_DEFINITION
union Permission = GroupPermission | UserPermission
type AccessLog {
"Unique ID for this AccessLog. Automatically generated."
id: BigInt
"IP address which the access that generated this access log originated from."
ip: String
"Name of the service which this access log is a record for."
service: String
"DateTime at which this access log was generated."
timestamp: DateTime
user: User
"ID of the user who initiated this access log."
userId: BigInt
}
type AlertLog {
"Unique ID for this alert. Automatically generated."
id: BigInt
"The message logged by this alert. This is what is displayed to the user(s) viewing alerts."
message: String
"""
Severity of this alert. Currently can be any value, but should probably be one of the following:
- "INFO"
- "WARN"
- "ERROR"
A Postgres enum could be added in the future to enforce this. This could also be a number, which would allow
for easier filtering of alerts by severity.
"""
severity: String
"DateTime at which this alert was generated."
timestamp: DateTime
}
"""
Assets are the physical objects that are property of RPI TV, or are otherwise managed and tracked by RPI TV.
Due to the club's rapidly revolving door of members, it's easy for equipment to get lost or forgotten about. The
Asset system is intended to assist in keeping track of what assets RPI TV owns, where they were purchased, how
much they were purchased for, and where they are being used (and by whom).
Assets currently do not have a "checked in" or "checked out" status. Instead, each asset has a last known location,
as well as the last known user who was using the asset. When an asset is "checked out", the user will scan the
location's bar code and the asset's QR code, which will update the asset's last known location and last known
handler. It is presumed that an asset will not be checked out for long, or if it is, the user who checked it out
will have it in their possession at all times, so they will know the status of it while it is in their possession.
When the user wants to "check in" the asset, the same process is done as when they checked it out.
"""
type Asset {
children(filter: FilterAssetInput, order: [OrderAssetInput!], pagination: PaginationInput): [Asset!]
"Unique ID for this asset. Automatically generated."
id: BigInt
"""
Flag whether this asset is lost or not. The asset is usually considered lost if the asset is not at the last
known location and the last known handler cannot account for its current location.
"""
isLost: Boolean
lastKnownHandler: User
"The user ID of the user who last checked this asset out/in."
lastKnownHandlerId: BigInt
"""
The last known location of this asset. This should be the last location that the asset was checked out
from/checked into.
"""
lastKnownLocation: String
"""
The model number of this asset. While the asset name is a human-readable name for quickly identifying what the
asset is for, the model number is defined by the manufacturer, and is used to identify the exact model of the
asset. This is useful for future club members who wish to re-purchase an asset or find out more information
about it, such as the manual. Not all assets will have a model number, in which case this can be set to null.
"""
modelNumber: String
"The name of this asset. This isn't necessarily the same as the model name, but it should be a human-readable"
name: String
"Optional notes about this asset."
notes: String
parent: Asset
"""
Some assets are part of a larger set of assets. For example, a camera may be part of a camera kit, which
includes a camera, a lens, a battery, and a bag. It doesn't make sense to require the user to scan the QR code
for all of these assets. Instead, the kit itself can be scanned and all child assets will be updated. Note that
scanning a child will not update a parent, nor it's siblings. If the asset is not part of a set, this can be
set to null.
"""
parentId: BigInt
"""
DateTime at which this asset was purchased. This doesn't have to be super specific, but gives future club
members a rough idea of how old a piece of equipment is, and whether it may still be under warranty. This
should be the date that the asset was purchased, not the date that it was received. If the purchase date is
unknown, it can be set to null.
"""
purchaseDate: DateTime
"""
The location where this asset was purchased. This is useful for new club members who wish to re-purchase an
asset, and want to know where to purchase it from. If the purchase location is unknown, it can be set to null.
Purchase location should be as specific as possible, and can be either a physical location or a website URL.
"""
purchaseLocation: String
"""
The price which this asset was purchased for in pennies. This is useful for new club members who wish to
re-purchase an asset, and want to know the worth of the asset, for example. If an asset wasn't purchased,
(i.e. it was donated), the purchase price can be set to 0. If the purchase price is unknown, it can also be set
to null.
"""
purchasePrice: Int
"""
The serial number of this asset. Serial numbers are useful for warranty or support tickets with the manufacturer.
Most assets will likely have a serial number somewhere, however it may be hard to find, or doesn't necessarily
make sense to log it. In this case, the serial number can be set to null.
"""
serialNumber: String
"""
Unique tag number for this asset. This is what is printed/written/labeled on the asset itself. Sometimes, assets
are not tagged (e.g. due to physical size constraints), however they should still have a tag number.
"""
tag: Int
}
"""
Audit logs are used to track changes to resources within the database. At the moment, Prisma does not have an elegant
way of generating these automatically with the user's ID. It would be possible to generate automatically if we
weren't logging the user who made the change using Prisma middleware or extensions. For now, they have to be
logged manually using {@link PrismaServicegenAuditLog }.
All automatic generation solutions that I came up with involved violating type safety, relying on private Prisma
interfaces, and/or were so obtuse and hacky that it wasn't worth it.
"""
type AuditLog {
action: String!
details: [String!]!
"Unique ID for this audit log. Automatically generated."
id: BigInt
"""
Identifier of the resource that was changed. This should be the ID of the resource. If {@link #subject} is null,
then this should also be null.
"""
identifier: ID
"""
Custom message to display to the user when this audit log is displayed. This should be a human-readable message.
This will be combined with the automatically generated message based on {@link #prevValue}.
"""
message: String
"""
The type of subject which was changed. This should be one of the values in {@link AbilitySubjects }. If the change
was to a resource that is not a subject, this should be null.
"""
subject: String
"DateTime at which this audit log was created."
timestamp: DateTime
user: User
"User ID of the user that initiated this audit log."
userId: BigInt
}
type BlogPost {
author: Person
"""
The name to display for the author, as opposed to the actual username/person name. This allows for posting
blogs as a "group".
"""
authorDisplayName: String
"The User ID of the author of this blog post."
authorId: BigInt
"The actual body of the blog post."
content: String
"Unique ID for this blog post. Automatically generated."
id: BigInt
"DateTime at which this blog post was posted."
postedAt: DateTime
"The title of the blog post."
title: String
}
type Category {
children(filter: FilterCategoryInput, order: [OrderCategoryInput!], pagination: PaginationInput): [Category!]
"Unique ID for this category. Automatically generated."
id: BigInt
"The name of this category"
name: String
parent: Category
"The ID of the parent category, or null if this is a top-level category."
parentId: BigInt
"The priority of this category. Categories with a higher priority should be displayed first."
priority: Int
productions(filter: FilterProductionInput, order: [OrderProductionInput!], pagination: PaginationInput): [Production!]
}
type ContactSubmission {
"Additional metadata about this ContactSubmission. Unstructured JSON data."
additionalData: JSON
"The main body of the ContactSubmission."
body: String
"The email address for how to reach the person who submitted this ContactSubmission."
email: String
"Unique ID for this ContactSubmission. Automatically generated."
id: BigInt
"The name of the person who submitted this ContactSubmission."
name: String
"Flag whether this contact submission has been resolved or not."
resolved: Boolean
"The subject/title of the ContactSubmission."
subject: String
"Timestamp at which this ContactSubmission was submitted."
timestamp: DateTime
}
type Credit {
"Unique ID for this Credit. Automatically generated."
id: BigInt
person: Person
"The ID of the person this Credit belongs to."
personId: BigInt
"The priority of this Credit. Credits with a higher priority should be displayed first."
priority: Int
production: Production
"The ID of the production this Credit is for."
productionId: BigInt
"The title of this Credit"
title: String
}
type Group {
children(filter: FilterGroupInput, order: [OrderGroupInput!], pagination: PaginationInput): [Group!]
"Unique ID for this Group. Automatically generated."
id: BigInt
"The display name for this Group"
name: String
parent: Group
"The ID of the parent of this Group. If null, this Group is a top-level Group."
parentId: BigInt
permissions(filter: FilterGroupPermissionInput, order: [OrderGroupPermissionInput!], pagination: PaginationInput): [GroupPermission!]
"""
The priority of this Group. Groups with a higher priority will override the permissions of Groups with a lower
priority.
"""
priority: Int
users(filter: FilterUserGroupInput, pagination: PaginationInput): [UserGroup!]
}
type GroupPermission {
"The action for this GroupPermission. Should be a valid action within {@link AbilityAction }."
action: String
"Any conditional checks for this GroupPermission."
conditions: JSON
"The set of fields for this GroupPermission."
fields: [String!]
group: Group
"ID of the group which this GroupPermission is for."
groupId: BigInt
"Unique ID for this GroupPermission. Automatically generated."
id: BigInt
"True if this GroupPermission is a denying permission. False if this GroupPermission is an allowing permission."
inverted: Boolean
"The reason for this GroupPermission if this GroupPermission has {@link #inverted} equal to true."
reason: String
"The set of subjects for this GroupPermission. Should be all valid subjects within {@link AbilitySubjects }."
subject: [String!]
}
type Image {
"The description for this image."
description: String
"Unique ID for this Image. Automatically generated."
id: BigInt
"The display name for this image."
name: String
"The path/URI for this image."
path: String
people(filter: FilterPersonImageInput, pagination: PaginationInput): [PersonImage!]
productions(filter: FilterProductionImageInput, pagination: PaginationInput): [ProductionImage!]
profilePictureFor(filter: FilterPersonInput, order: [OrderPersonInput!], pagination: PaginationInput): [Person!]
thumbnailFor(filter: FilterProductionInput, order: [OrderProductionInput!], pagination: PaginationInput): [Production!]
}
type Mutation {
createAlertLog(input: CreateAlertLogInput!): AlertLog!
createAsset(input: CreateAssetInput!): Asset!
createBlogPost(input: CreateBlogPostInput!): BlogPost!
createCategory(input: CreateCategoryInput!): Category!
createContactSubmission(input: CreateContactSubmissionInput!): ContactSubmission!
createCredit(input: CreateCreditInput!): Credit!
createGroup(input: CreateGroupInput!): Group!
createGroupPermission(input: CreateGroupPermissionInput!): GroupPermission!
createImage(input: CreateImageInput!): Image!
createPerson(input: CreatePersonInput!): Person!
createPersonImage(input: CreatePersonImageInput!): PersonImage!
createPersonRole(input: CreatePersonRoleInput!): PersonRole!
createProduction(input: CreateProductionInput!): Production!
createProductionImage(input: CreateProductionImageInput!): ProductionImage!
createProductionRSVP(input: CreateProductionRSVPInput!): ProductionRSVP!
createProductionTag(input: CreateProductionTagInput!): ProductionTag!
createProductionVideo(input: CreateProductionVideoInput!): ProductionVideo!
createRedirect(input: CreateRedirectInput!): Redirect!
createRole(input: CreateRoleInput!): Role!
createStream(input: CreateStreamInput!): Stream!
createUser(input: CreateUserInput!): User!
createUserGroup(input: CreateUserGroupInput!): UserGroup!
createUserPermission(input: CreateUserPermissionInput!): UserPermission!
createVideo(input: CreateVideoInput!): Video!
createVote(input: CreateVoteInput!): Vote!
createVoteResponse(input: CreateVoteResponseInput!): VoteResponse!
deleteAlertLog(id: BigInt!): AlertLog!
deleteAsset(id: BigInt!): Asset!
deleteBlogPost(id: BigInt!): BlogPost!
deleteCategory(id: BigInt!): Category!
deleteContactSubmission(id: BigInt!): ContactSubmission!
deleteCredit(id: BigInt!): Credit!
deleteGroup(id: BigInt!): Group!
deleteGroupPermission(id: BigInt!): GroupPermission!
deleteImage(id: BigInt!): Image!
deletePerson(id: BigInt!): Person!
deletePersonImage(id: BigInt!): PersonImage!
deletePersonRole(id: BigInt!): PersonRole!
deleteProduction(id: BigInt!): Production!
deleteProductionImage(id: BigInt!): ProductionImage!
deleteProductionRSVP(id: BigInt!): ProductionRSVP!
deleteProductionTag(id: BigInt!): ProductionTag!
deleteProductionVideo(id: BigInt!): ProductionVideo!
deleteRedirect(id: BigInt!): Redirect!
deleteRole(id: BigInt!): Role!
deleteStream(id: UUID!): Stream!
deleteUser(id: BigInt!): User!
deleteUserGroup(id: BigInt!): UserGroup!
deleteUserPermission(id: BigInt!): UserPermission!
deleteVideo(id: BigInt!): Video!
deleteVote(id: BigInt!): Vote!
deleteVoteResponse(id: BigInt!): VoteResponse!
loginLocal(password: String!, username: String!): User!
logout: Boolean!
updateAlertLog(id: BigInt!, input: UpdateAlertLogInput!): AlertLog!
updateAsset(id: BigInt!, input: UpdateAssetInput!): Asset!
updateBlogPost(id: BigInt!, input: UpdateBlogPostInput!): BlogPost!
updateCategory(id: BigInt!, input: UpdateCategoryInput!): Category!
updateContactSubmission(id: BigInt!, input: UpdateContactSubmissionInput!): ContactSubmission!
updateCredit(id: BigInt!, input: UpdateCreditInput!): Credit!
updateGroup(id: BigInt!, input: UpdateGroupInput!): Group!
updateGroupPermission(id: BigInt!, input: UpdateGroupPermissionInput!): GroupPermission!
updateImage(id: BigInt!, input: UpdateImageInput!): Image!
updatePerson(id: BigInt!, input: UpdatePersonInput!): Person!
updatePersonImage(id: BigInt!, input: UpdatePersonImageInput!): PersonImage!
updatePersonRole(id: BigInt!, input: UpdatePersonRoleInput!): PersonRole!
updateProduction(id: BigInt!, input: UpdateProductionInput!): Production!
updateProductionImage(id: BigInt!, input: UpdateProductionImageInput!): ProductionImage!
updateProductionRSVP(id: BigInt!, input: UpdateProductionRSVPInput!): ProductionRSVP!
updateProductionVideo(id: BigInt!, input: UpdateProductionVideoInput!): ProductionVideo!
updateRedirect(id: BigInt!, input: UpdateRedirectInput!): Redirect!
updateRole(id: BigInt!, input: UpdateRoleInput!): Role!
updateUser(id: BigInt!, input: UpdateUserInput!): User!
updateUserPermission(id: BigInt!, input: UpdateUserPermissionInput!): UserPermission!
updateVideo(id: BigInt!, input: UpdateVideoInput!): Video!
updateVote(id: BigInt!, input: UpdateVoteInput!): Vote!
updateVoteResponse(id: BigInt!, input: UpdateVoteResponseInput!): VoteResponse!
}
type Person {
blogPosts(filter: FilterBlogPostInput, order: [OrderBlogPostInput!], pagination: PaginationInput): [BlogPost!]
credits(filter: FilterCreditInput, order: [OrderCreditInput!], pagination: PaginationInput): [Credit!]
"An \"about me\" section for this Person."
description: String
"""
The date that this Person intends on graduating from the university. This allows for automated role removals,
as well as displaying the Person's class year on their profile.
"""
graduation: DateTime
"Unique ID for this Person. Automatically generated."
id: BigInt
images(filter: FilterPersonImageInput, pagination: PaginationInput): [PersonImage!]
"The name (or pseudonym) for this Person. Should likely be in the format \"First Last\"."
name: String
"ID of the image which should be used for this Person's profile picture."
profilePictureId: BigInt
"The pronouns for this Person. Should likely be in the format \"they/them\". Optional."
pronouns: String
roles(filter: FilterPersonRoleInput, order: [OrderPersonRoleInput!], pagination: PaginationInput): [PersonRole!]
users(filter: FilterUserInput, order: [OrderUserInput!], pagination: PaginationInput): [User!]
}
type PersonImage {
"Unique ID for this PersonImage. Automatically generated."
id: BigInt
image: Image
"ID of the image this PersonImage is associated with."
imageId: BigInt
person: Person
"ID of the person this PersonImage is associated with."
personId: BigInt
"Priority of this PersonImage. Higher priority images should be displayed first."
priority: Int
}
type PersonRole {
"End date of when this PersonRole association should no longer be active."
endTime: DateTime
"Unique ID for this PersonRole. Automatically generated."
id: BigInt
person: Person
"ID of the person this PersonRole is associated with."
personId: BigInt
role: Role
"ID of the role this PersonRole is associated with."
roleId: BigInt
"Start date of when this PersonRole association should begin."
startTime: DateTime
}
type Production {
category: Category
"The ID of the category which this Production belongs to."
categoryId: BigInt
"The closet meeting location for club members to meet at before the Production."
closetLocation: String
"The time that club members should meet at the closet location before the Production."
closetTime: DateTime
credits(filter: FilterCreditInput, order: [OrderCreditInput!], pagination: PaginationInput): [Credit!]
"The Description of this Production"
description: String
"""
The ID of the Discord channel within the Discord server that messages related to this Production should be sent
to.
"""
discordChannel: String
"The ID of the Discord server that messages related to this Production should be sent to."
discordServer: String
"""
The expected end time of this Production. This is used, in combination with start time, to determine which
Productions are live.
"""
endTime: DateTime
"The location of the event for this Production."
eventLocation: String
"Unique ID for this Production. Automatically generated."
id: BigInt
images(filter: FilterProductionImageInput, pagination: PaginationInput): [ProductionImage!]
"The title/name of this Production"
name: String
rsvps(filter: FilterProductionRSVPInput, order: [OrderProductionRSVPInput!], pagination: PaginationInput): [ProductionRSVP!]
"""
The expected start time of this Production. This is used, in combination with end time, to determine which
Productions are live.
"""
startTime: DateTime
tags(filter: FilterProductionTagInput, order: [OrderProductionTagInput!], pagination: PaginationInput): [ProductionTag!]
"Any notes that the team has about this Production. Can be markup."
teamNotes: String
thumbnail: Image
"The ID of the Image which should be used as the thumbnail for this Production."
thumbnailId: BigInt
videos(filter: FilterProductionVideoInput, pagination: PaginationInput): [ProductionVideo!]
}
type ProductionImage {
"Unique ID for this ProductionImage. Automatically generated."
id: BigInt
image: Image
"ID of the image this ProductionImage is associated with."
imageId: BigInt
"The priority of this ProductionImage. Higher priority ProductionImages should appear before lower priority ones."
priority: Int
production: Production
"ID of the production this ProductionImage is associated with."
productionId: BigInt
}
type ProductionRSVP {
"Unique ID for this ProductionRSVP. Automatically generated."
id: BigInt
"Any additional notes provided by the User, officers, or producers."
notes: String
production: Production
"ID of the Production that the User is RSVPing for."
productionId: BigInt
user: User
"ID of the User that is RSVPing for the Production."
userId: BigInt
"The User's response to the Production's RSVP. Should be \"yes\", \"no\", or \"maybe\"."
willAttend: String
}
type ProductionTag {
"Unique ID for this ProductionTag. Automatically generated."
id: BigInt
production: Production
"ID of the Production that this tag is associated with."
productionId: BigInt
"This tag's value."
tag: String
}
type ProductionVideo {
"Unique ID for this ProductionVideo. Automatically generated."
id: BigInt
"The priority of this ProductionVideo. Higher priority ProductionVideos should appear before lower priority ones."
priority: Int
production: Production
"ID of the person this ProductionVideo is associated with."
productionId: BigInt
video: Video
"ID of the video this ProductionVideo is associated with."
videoId: BigInt
}
type Query {
accessLogCount(filter: FilterAccessLogInput): Int!
alertLogCount(filter: FilterAlertLogInput): Int!
assetCount(filter: FilterAssetInput): Int!
auditLogCount(filter: FilterAuditLogInput): Int!
blogPostCount(filter: FilterBlogPostInput): Int!
categoryCount(filter: FilterCategoryInput): Int!
contactSubmissionCount(filter: FilterContactSubmissionInput): Int!
creditCount(filter: FilterCreditInput): Int!
findManyAccessLog(filter: FilterAccessLogInput, order: [OrderAccessLogInput!], pagination: PaginationInput): [AccessLog!]!
findManyAlertLog(filter: FilterAlertLogInput, order: [OrderAlertLogInput!], pagination: PaginationInput): [AlertLog!]!
findManyAsset(filter: FilterAssetInput, order: [OrderAssetInput!], pagination: PaginationInput): [Asset!]!
findManyAuditLog(filter: FilterAuditLogInput, order: [OrderAuditLogInput!], pagination: PaginationInput): [AuditLog!]!
findManyBlogPost(filter: FilterBlogPostInput, order: [OrderBlogPostInput!], pagination: PaginationInput): [BlogPost!]!
findManyCategory(filter: FilterCategoryInput, order: [OrderCategoryInput!], pagination: PaginationInput): [Category!]!
findManyContactSubmission(filter: FilterContactSubmissionInput, order: [OrderContactSubmissionInput!], pagination: PaginationInput): [ContactSubmission!]!
findManyCredit(filter: FilterCreditInput, order: [OrderCreditInput!], pagination: PaginationInput): [Credit!]!
findManyGroup(filter: FilterGroupInput, order: [OrderGroupInput!], pagination: PaginationInput): [Group!]!
findManyGroupPermission(filter: FilterGroupPermissionInput, order: [OrderGroupPermissionInput!], pagination: PaginationInput): [GroupPermission!]!
findManyImage(filter: FilterImageInput, order: [OrderImageInput!], pagination: PaginationInput): [Image!]!
findManyPerson(filter: FilterPersonInput, order: [OrderPersonInput!], pagination: PaginationInput): [Person!]!
findManyPersonRole(filter: FilterPersonRoleInput, order: [OrderPersonRoleInput!], pagination: PaginationInput): [PersonRole!]!
findManyProduction(filter: FilterProductionInput, order: [OrderProductionInput!], pagination: PaginationInput): [Production!]!
findManyProductionRSVP(filter: FilterProductionRSVPInput, order: [OrderProductionRSVPInput!], pagination: PaginationInput): [ProductionRSVP!]!
findManyProductionTag(filter: FilterProductionTagInput, order: [OrderProductionTagInput!], pagination: PaginationInput): [ProductionTag!]!
findManyRedirect(filter: FilterRedirectInput, order: [OrderRedirectInput!], pagination: PaginationInput): [Redirect!]!
findManyRole(filter: FilterRoleInput, order: [OrderRoleInput!], pagination: PaginationInput): [Role!]!
findManyStream(pagination: PaginationInput): [Stream!]!
findManyUser(filter: FilterUserInput, order: [OrderUserInput!], pagination: PaginationInput): [User!]!
findManyUserPermission(filter: FilterUserPermissionInput, order: [OrderUserPermissionInput!], pagination: PaginationInput): [UserPermission!]!
findManyVideo(filter: FilterVideoInput, order: [OrderVideoInput!], pagination: PaginationInput): [Video!]!
findManyVote(filter: FilterVoteInput, order: [OrderVoteInput!], pagination: PaginationInput): [Vote!]!
findManyVoteResponse(filter: FilterVoteResponseInput, order: [OrderVoteResponseInput!], pagination: PaginationInput): [VoteResponse!]!
findOneAccessLog(id: BigInt!): AccessLog
findOneAlertLog(id: BigInt!): AlertLog
findOneAsset(id: BigInt!): Asset
findOneAuditLog(id: BigInt!): AuditLog
findOneBlogPost(id: BigInt!): BlogPost
findOneCategory(id: BigInt!): Category
findOneContactSubmission(id: BigInt!): ContactSubmission
findOneCredit(id: BigInt!): Credit
findOneGroup(id: BigInt!): Group
findOneGroupPermission(id: BigInt!): GroupPermission
findOneImage(id: BigInt!): Image
findOnePerson(id: BigInt!): Person
findOnePersonImage(id: BigInt!): PersonImage
findOnePersonRole(id: BigInt!): PersonRole
findOneProduction(id: BigInt!): Production
findOneProductionImage(id: BigInt!): ProductionImage
findOneProductionRSVP(id: BigInt!): ProductionRSVP
findOneProductionTag(id: BigInt!): ProductionTag
findOneProductionVideo(id: BigInt!): ProductionVideo
findOneRedirect(id: BigInt!): Redirect
findOneRole(id: BigInt!): Role
findOneStream(id: UUID!): Stream
findOneUser(id: BigInt!): User
findOneUserGroup(id: BigInt!): UserGroup
findOneUserPermission(id: BigInt!): UserPermission
findOneVideo(id: BigInt!): Video
findOneVote(id: BigInt!): Vote
findOneVoteResponse(id: BigInt!): VoteResponse
groupCount(filter: FilterGroupInput): Int!
groupPermissionCount(filter: FilterGroupPermissionInput): Int!
imageCount(filter: FilterImageInput): Int!
permissionsFor(userId: BigInt): [Permission!]
personCount(filter: FilterPersonInput): Int!
personImageCount(filter: FilterPersonImageInput): Int!
personRoleCount(filter: FilterPersonRoleInput): Int!
productionCount(filter: FilterProductionInput): Int!
productionImageCount(filter: FilterProductionImageInput): Int!
productionRSVPCount(filter: FilterProductionRSVPInput): Int!
productionTagCount(filter: FilterProductionTagInput): Int!
productionVideoCount(filter: FilterProductionVideoInput): Int!
redirectCount(filter: FilterRedirectInput): Int!
roleCount(filter: FilterRoleInput): Int!
self: User
streamCount: Int!
userCount(filter: FilterUserInput): Int!
userGroupCount(filter: FilterUserGroupInput): Int!
userPermissionCount(filter: FilterUserPermissionInput): Int!
videoCount(filter: FilterVideoInput): Int!
voteCount(filter: FilterVoteInput): Int!
voteResponseCount(filter: FilterVoteResponseInput): Int!
}
type Redirect {
"The date and time at which this Redirect expires. If null, this Redirect never expires."
expires: DateTime
"Unique ID for this Redirect. Automatically generated."
id: BigInt
"The key used in URLs to access this Redirect."
key: String
"The URL which this Redirect redirects to."
location: String
}
type Role {
"The optional description of this role. May be what people within this role are responsible for, for example."
description: String
"Unique ID for this Role. Automatically generated."
id: BigInt
"The name of this role."
name: String
people(filter: FilterPersonRoleInput, order: [OrderPersonRoleInput!], pagination: PaginationInput): [PersonRole!]
}
type Stream {
"The location this stream is being pulled from."
from: String
"Unique ID for this stream. Automatically generated."
id: UUID
"The latest message from this stream."
message: String
"The location this stream is being pushed to."
to: String
}
type User {
accessLogs(filter: FilterAccessLogInput, order: [OrderAccessLogInput!], pagination: PaginationInput): [AccessLog!]
auditLogs(filter: FilterAuditLogInput, order: [OrderAuditLogInput!], pagination: PaginationInput): [AuditLog!]
checkedOutAssets(filter: FilterAssetInput, order: [OrderAssetInput!], pagination: PaginationInput): [Asset!]
"Discord account ID for this user, or null if the user does not have a linked Discord account."
discord: String
groups(filter: FilterUserGroupInput, pagination: PaginationInput): [UserGroup!]
"Unique ID for this User. Automatically generated."
id: BigInt
"DateTime at which the user's account was created."
joined: DateTime
"Email address for this user."
mail: String
permissions(filter: FilterUserPermissionInput, order: [OrderUserPermissionInput!], pagination: PaginationInput): [UserPermission!]
person: Person
"Attached Person's ID, or null if this user does not have a linked Person."
personId: BigInt
productionRsvps(filter: FilterProductionRSVPInput, order: [OrderProductionRSVPInput!], pagination: PaginationInput): [ProductionRSVP!]
"""
Unique username for this user. Must be less than or equal to 8 characters in length and must be alphanumeric.
Recommended to be the user's RCS ID.
"""
username: String
voteResponses(filter: FilterVoteResponseInput, order: [OrderVoteResponseInput!], pagination: PaginationInput): [VoteResponse!]
}
type UserGroup {
group: Group
"ID of the group this UserGroup is associated with."
groupId: BigInt
"Unique ID for this UserGroup. Automatically generated."
id: BigInt
user: User
"ID of the user this UserGroup is associated with."
userId: BigInt
}
type UserPermission {
"The action for this UserPermission. Should be a valid action within {@link AbilityAction }."
action: String
"Any conditional checks for this UserPermission."
conditions: JSON
"The set of fields for this UserPermission."
fields: [String!]
"Unique ID for this UserPermission. Automatically generated."
id: BigInt
"True if this UserPermission is a denying permission. False if this UserPermission is an allowing permission."
inverted: Boolean
"The reason for this UserPermission if this UserPermission has {@link #inverted} equal to true."
reason: String
"The set of subjects for this UserPermission. Should be all valid subjects within {@link AbilitySubjects }."
subject: [String!]
user: User
"ID of the user which this UserPermission is for."
userId: BigInt
}
type Video {
"The format for this Video. Probably either \"EMBED\", \"RTMP\", or \"HLS\"."
format: String
"Unique ID for this Video. Automatically generated."
id: BigInt
"""
All additional data about this video. This is an unstructured JSON object. The data will vary depending on the
format of the video.
"""
metadata: JSON
"The display name for this Video."
name: String
videoFor(filter: FilterProductionVideoInput, pagination: PaginationInput): [ProductionVideo!]
}
type Vote {
"Additional describing information about this vote."
description: String
"Timestamp at which this vote closes and no more responses will be accepted."
expires: DateTime
"Unique ID for this Vote. Automatically generated."
id: BigInt
"An array of available options for responses to this vote."
options: [String!]
"The question proposed in this vote."
question: String
responses(filter: FilterVoteResponseInput, order: [OrderVoteResponseInput!], pagination: PaginationInput): [VoteResponse!]
}
type VoteResponse {
"Unique ID for this VoteResponse. Automatically generated."
id: BigInt
"""
The user's selection for this VoteResponse. If the vote's options are changed, this field will still remain
unchanged unless the user updates their vote.
"""
selection: String
"Timestamp at which this VoteResponse was submitted."
timestamp: DateTime
user: User
"ID of the user this VoteResponse is associated with."
userId: BigInt
vote: Vote
"ID of the vote this VoteResponse is associated with."
voteId: BigInt
}
enum AbilitySubjects {
AccessLog
AlertLog
Asset
AuditLog
BlogPost
Category
ContactSubmission
Credit
Group
GroupPermission
Image
Person
PersonImage
PersonRole
Production
ProductionImage
ProductionRSVP
ProductionTag
ProductionVideo
Redirect
Role
Stream
User
UserGroup
UserPermission
Video
Vote
VoteResponse
}
enum AccessLogOrderableFields {
id
service
timestamp
}
enum AlertLogOrderableFields {
id
message
severity
timestamp
}
enum AssetOrderableFields {
id
name
purchaseDate
purchasePrice
tag
}
enum AuditLogOrderableFields {
id
identifier
message
subject
timestamp
}
enum BlogPostOrderableFields {
id
postedAt
title
}
enum CaseSensitivity {
Default
Insensitive
}
enum CategoryOrderableFields {
id
name
priority
}
enum ContactSubmissionOrderableFields {
id
timestamp
}
enum CreditOrderableFields {
id
priority
title
}
enum GroupOrderableFields {
id
name
priority
}
enum GroupPermissionOrderableFields {
action
id
}
enum ImageOrderableFields {
id
name
}
enum OrderDirection {
Asc
Desc
}
enum PersonOrderableFields {
graduation
id
name
}
enum PersonRoleOrderableFields {
id
startTime
}
enum ProductionOrderableFields {
categoryId
id
name
startTime
}
enum ProductionRSVPOrderableFields {
id
willAttend
}
enum ProductionTagOrderableFields {
id
tag
}
enum RedirectOrderableFields {
expires
id
key
}
enum RoleOrderableFields {
id
name
}
enum RuleType {
Count
Create
Delete
ReadMany
ReadOne
Update
}
enum UserOrderableFields {
id
joined
mail
username
}
enum UserPermissionOrderableFields {
action
id
}
enum VideoOrderableFields {
id
name
}
enum VoteOrderableFields {
expires
id
question
}
enum VoteResponseOrderableFields {
id
timestamp
}
"The `BigInt` scalar type represents non-fractional signed whole numeric values."
scalar BigInt
"A date-time string at UTC, such as 2019-12-03T09:54:33Z, compliant with the date-time format."
scalar DateTime
"The `JSON` scalar type represents JSON values as specified by [ECMA-404](http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf)."
scalar JSON
"A field whose value is a generic Universally Unique Identifier: https://en.wikipedia.org/wiki/Universally_unique_identifier."
scalar UUID
input BooleanComparisonInput {
equals: Boolean
}
"Input type for createAlertLog mutation"
input CreateAlertLogInput {
"The message logged by this alert. This is what is displayed to the user(s) viewing alerts."
message: String
"""
Severity of this alert. Currently can be any value, but should probably be one of the following:
- "INFO"
- "WARN"
- "ERROR"
A Postgres enum could be added in the future to enforce this. This could also be a number, which would allow
for easier filtering of alerts by severity.
"""
severity: String
}
"Input type for createAsset mutation"
input CreateAssetInput {
"""
Flag whether this asset is lost or not. The asset is usually considered lost if the asset is not at the last
known location and the last known handler cannot account for its current location.
"""
isLost: Boolean
"The user ID of the user who last checked this asset out/in."
lastKnownHandlerId: BigInt
"""
The last known location of this asset. This should be the last location that the asset was checked out
from/checked into.
"""
lastKnownLocation: String
"""
The model number of this asset. While the asset name is a human-readable name for quickly identifying what the
asset is for, the model number is defined by the manufacturer, and is used to identify the exact model of the
asset. This is useful for future club members who wish to re-purchase an asset or find out more information
about it, such as the manual. Not all assets will have a model number, in which case this can be set to null.
"""
modelNumber: String
"The name of this asset. This isn't necessarily the same as the model name, but it should be a human-readable"
name: String