qpa-server/src/schema.graphql

309 lines
5.8 KiB
GraphQL

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]
}