Files
root 9494f85b78
CI / schema-and-codegen (push) Failing after 29s
Initial commit
2026-06-20 03:54:40 -04:00

251 lines
4.7 KiB
GraphQL

"""Single source of truth for Web (Apollo) and Android (Apollo Kotlin)."""
scalar DateTime
enum MessageKind {
TEXT
MEDIA
SYSTEM
}
enum ChatType {
DIRECT
GROUP
CHANNEL
}
enum MemberRole {
OWNER
ADMIN
MEMBER
SUBSCRIBER
}
enum ChatEventType {
MESSAGE_CREATED
MESSAGE_UPDATED
MESSAGE_DELETED
TYPING
PRESENCE
READ_RECEIPT
DELIVERED
}
enum AccountEventType {
DEVICE_ADDED
DEVICE_REVOKED
SESSION_REFRESHED
}
type User {
id: ID!
displayName: String!
email: String
createdAt: DateTime!
}
type Device {
id: ID!
userId: ID!
name: String
lastSeenAt: DateTime
createdAt: DateTime!
}
type AuthPayload {
accessToken: String!
refreshToken: String!
user: User!
}
type MediaRef {
id: ID!
mimeType: String!
url: String!
thumbnailUrl: String
}
type Message {
id: ID!
chatId: ID!
senderId: ID
sender: User
kind: MessageKind!
body: String
mediaRefs: [MediaRef!]!
replyToId: ID
seq: Int!
createdAt: DateTime!
editedAt: DateTime
deletedAt: DateTime
}
type MessageEdge {
cursor: String!
node: Message!
}
type MessageConnection {
edges: [MessageEdge!]!
pageInfo: PageInfo!
}
type PageInfo {
endCursor: String
hasNextPage: Boolean!
}
interface ChatBase {
id: ID!
type: ChatType!
title: String
lastMessage: Message
unreadCount: Int!
updatedAt: DateTime!
}
type DirectThread implements ChatBase {
id: ID!
type: ChatType!
title: String
peer: User!
lastMessage: Message
unreadCount: Int!
updatedAt: DateTime!
}
type Group implements ChatBase {
id: ID!
type: ChatType!
title: String
lastMessage: Message
unreadCount: Int!
updatedAt: DateTime!
memberCount: Int!
isBroadcast: Boolean!
}
type Channel implements ChatBase {
id: ID!
type: ChatType!
title: String
lastMessage: Message
unreadCount: Int!
updatedAt: DateTime!
subscriberCount: Int!
pinnedMessages: [Message!]!
}
union Chat = DirectThread | Group | Channel
type PresignedUpload {
uploadUrl: String!
mediaId: ID!
headers: [HttpHeader!]
}
type HttpHeader {
name: String!
value: String!
}
input HttpHeaderInput {
name: String!
value: String!
}
type CallSession {
id: ID!
chatId: ID!
createdBy: ID!
status: CallStatus!
iceServers: [IceServer!]!
createdAt: DateTime!
}
enum CallStatus {
RINGING
ACTIVE
ENDED
}
type IceServer {
urls: [String!]!
username: String
credential: String
}
type Bot {
id: ID!
displayName: String!
tokenHint: String!
webhookUrl: String
createdAt: DateTime!
}
type Query {
me: User
myDevices: [Device!]!
chats: [Chat!]!
messages(chatId: ID!, after: String, first: Int = 30): MessageConnection!
bot(id: ID!): Bot
myBots: [Bot!]!
}
type Mutation {
register(email: String!, password: String!, displayName: String!): AuthPayload!
login(email: String!, password: String!): AuthPayload!
refresh(refreshToken: String!): AuthPayload!
registerDevice(name: String): Device!
revokeDevice(deviceId: ID!): Boolean!
createDirectThread(peerUserId: ID!): DirectThread!
createGroup(title: String!, memberIds: [ID!], isBroadcast: Boolean = false): Group!
createChannel(title: String!, isPublic: Boolean = false): Channel!
joinChannel(channelId: ID!): Boolean!
inviteToGroup(groupId: ID!, userIds: [ID!]!): Boolean!
setMemberRole(chatId: ID!, userId: ID!, role: MemberRole!): Boolean!
pinMessage(chatId: ID!, messageId: ID!): Boolean!
unpinMessage(chatId: ID!, messageId: ID!): Boolean!
sendMessage(chatId: ID!, body: String, replyToId: ID): Message!
editMessage(messageId: ID!, body: String!): Message!
deleteMessage(messageId: ID!, forEveryone: Boolean = false): Boolean!
markDelivered(chatId: ID!, upToSeq: Int!): Boolean!
markRead(chatId: ID!, upToSeq: Int!): Boolean!
setTyping(chatId: ID!, isTyping: Boolean!): Boolean!
requestMediaUpload(mimeType: String!, bytesHint: Int): PresignedUpload!
finalizeMediaUpload(mediaId: ID!, mimeType: String!, sizeBytes: Int!): MediaRef!
sendMediaMessage(chatId: ID!, mediaId: ID!, caption: String, replyToId: ID): Message!
startCall(chatId: ID!): CallSession!
endCall(callId: ID!): Boolean!
createBot(displayName: String!, webhookUrl: String): BotTokenPayload!
rotateBotToken(botId: ID!): BotTokenPayload!
setBotWebhook(botId: ID!, webhookUrl: String): Boolean!
addBotToChat(chatId: ID!, botId: ID!): Boolean!
}
type BotTokenPayload {
bot: Bot!
token: String!
}
type ChatEvent {
type: ChatEventType!
chatId: ID!
message: Message
userId: ID
isTyping: Boolean
online: Boolean
upToSeq: Int
at: DateTime!
}
type AccountEvent {
type: AccountEventType!
deviceId: ID
at: DateTime!
}
type Subscription {
onChatEvent(chatId: ID!): ChatEvent!
onAccountEvent: AccountEvent!
}