type User { name: String! username: String email: String! id: ID! events: [CalendarEvent]! roles: [UserRole!] } type UserRole { user: User! type: RoleType! } scalar Date scalar RoleType scalar Translations scalar Upload scalar EventImageType scalar EventPublishedState type UserSession { hash: String! user: User! ctime: Date! isValid: Boolean! } input SignupInput { email: String! username: String! name: String! } input SigninInput { hash: String! } input RequestInviteInput { email: String! } # ------ # Events # ------ type EventImage { url: String! } type EventImages { event: CalendarEvent thumb: EventImage cover: EventImage poster: EventImage gallery: [EventImage!] } type CalendarEvent { id: ID! owner: User! infos: [EventInformation]! info(lang: String!): EventInformation time: EventTime! status: EventStatus! location: Location! occurrences: [EventOccurrence] tags: [EventTag] images: EventImages publishedState: EventPublishedState! revisionState: EventEventRevisionState! revisions: [EventRevision] } type EventTag { id: ID! name: String! translations: [EventTagTranslation!]! translation(language: String!): EventTagTranslation } type EventTagTranslation { id: ID! language: String! text: String! } type EventOccurrence { id: ID! event: CalendarEvent! start: String! end: String! } type Location { address: String name: String } type EventTime { timeZone: TimeZone start: Timestamp end: Timestamp recurrence: String exceptions: String } # in RFC3339 e.g. 2002-10-02T10:00:00-05:00 or 2002-10-02T15:00:00Z scalar Timestamp # IANA Timezone e.g. "Europe/Zurich" scalar TimeZone # "confirmed" | "tentative" | "cancelled" scalar EventStatus scalar EventEventRevisionState # e.g. 'de', 'en', etc' scalar Language # Event information for presentation type EventInformation { id: ID! language: String! title: String! description: String } scalar Category input EventsQueryFilter { owner: ID limit: Int pendingRevision: Boolean } input OccurrencesQueryFilter { from: Timestamp to: Timestamp timeZone: TimeZone categories: [Category] limit: Int } input RevisionsQueryFilter { limit: Int } input EventTimeInput { timeZone: TimeZone! start: Timestamp! end: Timestamp! recurrence: String exceptions: String } input EventInformationInput { language: String! title: String! description: String } input EventLocationInput { address: String name: String } input CreateEventInput { time: EventTimeInput! infos: [EventInformationInput]! location: EventLocationInput! tagNames: [String!]! publishedState: EventPublishedState! } input UpdateEventInput { id: ID! time: EventTimeInput infos: [EventInformationInput!] location: EventLocationInput tagNames: [String!]! status: String publishedState: EventPublishedState! } input GrantRoleInput { userId: ID! roleType: RoleType! } input RevokeRoleInput { userId: ID! roleType: RoleType! } type Error { path: String! message: String! } input CreateModifyEventTagTranslationInput { language: String! text: String! } input CreateEventTagInput { name: String! translations: [CreateModifyEventTagTranslationInput!]! } input UpdateEventTagInput { id: ID! name: String! translations: [CreateModifyEventTagTranslationInput!]! } input DeleteEventTagInput { id: ID! } input UnsetEventImageInput { eventId: ID! imageType: EventImageType } input EventImageUploadInput { eventId: ID! imageType: EventImageType file: Upload! } input EventImagesUploadInput { files: [Upload!]! id: ID! } input EventGalleryImagesInput { eventId: ID! imageIds: [ID!]! } input StartEventRevisionInput { eventId: ID! } input ReviseEventInput { revisionId: ID! conclusion: String! comment: String } type EventRevision { id: ID! event: CalendarEvent! author: User! conclusion: String comment: String createdAt: Date! submittedAt: Date dismissedBy: User lastChangedAt: Date! } input RequestRevisionInput { eventId: ID! } input EventRevisionInput { revisionId: ID! } type Mutation { # Auth signup(input: SignupInput!): [Error] signin(input: SigninInput!): UserSession! requestInvite(input: RequestInviteInput!): Boolean! grantRole(input: GrantRoleInput!): User! revokeRole(input: GrantRoleInput!): User! # Event createEvent(input: CreateEventInput!): CalendarEvent updateEvent(input: UpdateEventInput!): CalendarEvent deleteEvent(id: ID!): User! startEventRevision(input: StartEventRevisionInput!): CalendarEvent submitEventRevision(input: ReviseEventInput!): CalendarEvent requestEventRevision(input: RequestRevisionInput!): CalendarEvent dismissOpenEventRevision(input: EventRevisionInput!): CalendarEvent # Event Images setEventImage(input: EventImageUploadInput!): CalendarEvent unsetEventImage(id: UnsetEventImageInput!): CalendarEvent addEventGalleryImages(input: EventImagesUploadInput!): CalendarEvent removeEventGalleryImages(input: EventGalleryImagesInput!): CalendarEvent # Tags createEventTag(input: CreateEventTagInput!): EventTag updateEventTag(input: UpdateEventTagInput!): EventTag deleteEventTag(input: DeleteEventTagInput!): [EventTag] } type Query { # Auth me: User user(id: ID!): User # Event event(id: ID!): CalendarEvent events(filter: EventsQueryFilter!): [CalendarEvent] occurrences(filter: OccurrencesQueryFilter!): [EventOccurrence] occurrence(id: ID!): EventOccurrence tags: [EventTag] revisions(filter: RevisionsQueryFilter!): [EventRevision] }