New status flow
July 1st, 2026

GraphQL Changes — Branch AINT-38

This document covers all GraphQL additions and changes introduced in this branch. The branch implements a full Engagement Events and Event Applications feature, including payment flows, attendance tracking, QR code ticket generation, comments, tags, and favourites.


Table of Contents

  1. New Queries
  2. New Mutations
  3. New Objects
  4. Modified Objects
  5. New Input Types
  6. New Enum Types

New Queries

engagementEvents

Returns a paginated list of engagement events, filterable by status, office, tags, favourites, etc.

Returns: EngagementEventList (paginated)

Arguments:

Argument

Type

Required

filters

EngagementEventFilterInput

No

pagination

Pagination

No

Example:

query {
engagementEvents(
filters: {
statuses: [published]
hostOfficeIds: [1, 2]
tagIds: [10, 11]
tagFilterOperator: "AND"
my: "managed"
isFavourited: false
}
pagination: { page: 1, perPage: 10 }
) {
data {
id
title
description
status
startTime
endTime
applicationDeadline
location
googlePlaceId
contactInformation
eventGuideline
refundPolicy
feeCents
currency {
id
name
}
hostOffice {
id
name
}
managers {
id
fullName
}
engagementEventSpeakers {
id
name
description
profilePicture {
url
}
}
engagementEventDayActivities {
id
day
title
description
startTime
endTime
engagementEventSpeakers {
id
name
}
}
coverImage {
url
}
comments {
id
body
}
tagLists {
id
name
}
isFavourited
permissions {
canPublish
canUnpublish
canUpdate
canCreateComment
canDeleteComment
canManageTags
canFavourite
}
createdAt
updatedAt
}
paging {
totalCount
totalPages
currentPage
}
}
}

engagementEvent

Fetches a single engagement event by ID.

Returns: EngagementEvent

Arguments:

Argument

Type

Required

id

ID

Yes

Example:

query {
engagementEvent(id: "42") {
id
title
description
status
startTime
endTime
applicationDeadline
location
eventGuideline
refundPolicy
feeCents
currency {
id
name
}
engagementEventSpeakers {
id
name
}
engagementEventDayActivities {
id
day
title
}
permissions {
canUpdate
canPublish
canCreateComment
canFavourite
}
}
}

eventApplications

Returns a paginated, filterable list of event applications. Supports filtering by status, event, person, date range, and sorting.

Returns: EventApplicationList (paginated)

Arguments:

Argument

Type

Required

filters

EventApplicationFilterInput

No

pagination

Pagination

No

Example:

query {
eventApplications(
filters: {
statuses: [in_review, accepted]
engagementEventIds: [42]
personIds: [101]
startTime: { from: "2026-01-01", to: "2026-06-30" }
endTime: { from: "2026-01-01", to: "2026-12-31" }
my: "applied"
sort: start_time
sortDirection: DESC
}
pagination: { page: 1, perPage: 20 }
) {
data {
id
status
additionalDetails
ticketId
inReviewAt
engagementEvent {
id
title
}
person {
id
fullName
}
cv {
url
}
ticketPdf {
url
}
qrCode {
url
}
permissions {
canUpdate
canAccept
canReject
canConfirmPayment
canWithdraw
canDownloadTicket
canAbsent
}
createdAt
updatedAt
}
paging {
totalCount
totalPages
currentPage
}
}
}

eventApplication

Fetches a single event application by ID.

Returns: EventApplication

Arguments:

Argument

Type

Required

id

ID

Yes

Example:

query {
eventApplication(id: "7") {
id
status
ticketId
ticketPdf {
url
}
qrCode {
url
}
permissions {
canAccept
canReject
canWithdraw
canDownloadTicket
}
}
}

New Mutations

createEngagementEvent

Creates a new engagement event. The current user is automatically set as creator and first manager. Speakers can be nested inline.

Returns: EngagementEvent

Arguments:

Argument

Type

Required

engagementEvent

EngagementEventInput

No

Example:

mutation {
createEngagementEvent(
engagementEvent: {
title: "AIESEC Leadership Summit"
description: "Annual leadership event"
startTime: "2026-09-01T09:00:00Z"
endTime: "2026-09-03T18:00:00Z"
applicationDeadline: "2026-08-15T23:59:00Z"
hostOfficeId: "5"
location: "Cairo, Egypt"
googlePlaceId: "ChIJxxxxxxxxx"
contactInformation: "events@aiesec.org"
eventGuideline: "Bring your student ID"
refundPolicy: "Non-refundable"
feeCents: 5000
currencyId: "1"
managerIds: ["101", "102"]
coverImage: {
content: "data:image/png;base64,..."
filename: "cover.png"
}
engagementEventSpeakersAttributes: [
{
name: "Jane Doe"
description: "Keynote speaker"
profilePicture: {
content: "data:image/png;base64,..."
filename: "jane.png"
}
}
]
engagementEventDayActivitiesAttributes: [
{
day: 1
title: "Opening Ceremony"
description: "Welcome and introductions"
startTime: "2026-09-01T09:00:00Z"
endTime: "2026-09-01T11:00:00Z"
engagementEventSpeakerIds: ["1"]
}
]
}
) {
id
title
status
}
}

updateEngagementEvent

Updates an existing engagement event. Speakers and day activities support nested upsert/destroy via _destroy: true.

Returns: EngagementEvent

Arguments:

Argument

Type

Required

id

ID

Yes

engagementEvent

EngagementEventInput

No

Example:

mutation {
updateEngagementEvent(
id: "42"
engagementEvent: {
title: "Updated Summit Title"
feeCents: 7500
engagementEventSpeakersAttributes: [
{ id: "3", _destroy: true }
{ name: "New Speaker", description: "New session" }
]
}
) {
id
title
feeCents
}
}

inReviewEngagementEvent

Transitions an engagement event to in_review status, marking it ready for publishing approval.

Returns: EngagementEvent

Arguments:

Argument

Type

Required

id

ID

Yes

Example:

mutation {
inReviewEngagementEvent(id: "42") {
id
status
}
}

publishEngagementEvent

Publishes an engagement event (must be in in_review status). Records published_at and published_by.

Returns: EngagementEvent

Arguments:

Argument

Type

Required

id

ID

Yes

Example:

mutation {
publishEngagementEvent(id: "42") {
id
status
}
}

bulkAssignManagersForEvents

Bulk-assigns one or more managers to multiple engagement events. Only events the current user can update are affected.

Returns: [EngagementEvent]

Arguments:

Argument

Type

Required

ids

[ID!]

Yes

managerIds

[Int!]

Yes

Example:

mutation {
bulkAssignManagersForEvents(ids: ["42", "43"], managerIds: [101, 102]) {
id
managers {
id
fullName
}
}
}

bulkUnassignManagersForEvents

Bulk-unassigns managers from multiple engagement events. Passing an empty managerIds removes all managers.

Returns: [EngagementEvent]

Arguments:

Argument

Type

Required

ids

[ID!]

Yes

managerIds

[Int!]

Yes

Example:

mutation {
bulkUnassignManagersForEvents(ids: ["42", "43"], managerIds: [101]) {
id
managers {
id
fullName
}
}
}

createCommentForEngagementEvent

Creates a comment on an engagement event. The author is automatically set to the current user.

Returns: Comment

Arguments:

Argument

Type

Required

engagementEventId

ID

Yes

comment

CommentInput

No

Example:

mutation {
createCommentForEngagementEvent(
engagementEventId: "42"
comment: { body: "Looking forward to this event!" }
) {
id
body
}
}

bulkTagUpdateForEngagementEvents

Replaces the tag list for multiple engagement events in bulk. Only events the current user can update are affected.

Returns: [EngagementEvent]

Arguments:

Argument

Type

Required

ids

[Int]

No

tagListIds

[Int]

No

Example:

mutation {
bulkTagUpdateForEngagementEvents(ids: [42, 43], tagListIds: [10, 11, 12]) {
id
tagLists {
id
name
}
}
}

favouriteEngagementEvent

Marks an engagement event as favourited by the current user.

Returns: EngagementEvent

Arguments:

Argument

Type

Required

id

ID

Yes

Example:

mutation {
favouriteEngagementEvent(id: "42") {
id
isFavourited
}
}

unfavouriteEngagementEvent

Removes the current user's favourite from an engagement event.

Returns: EngagementEvent

Arguments:

Argument

Type

Required

id

ID

Yes

Example:

mutation {
unfavouriteEngagementEvent(id: "42") {
id
isFavourited
}
}

createEventApplication

Creates a new event application for the current user. Automatically transitions to pending_payment for paid events or in_review for free events. Supports re-applying for a previously withdrawn application (once). CV can be provided as base64 upload or via an existing attachment ID.

Returns: EventApplication

Arguments:

Argument

Type

Required

eventApplication

EventApplicationInput

No

Example (new application with CV upload):

mutation {
createEventApplication(
eventApplication: {
engagementEventId: "42"
additionalDetails: "I am very motivated to attend."
cv: { content: "data:application/pdf;base64,...", filename: "my_cv.pdf" }
}
) {
id
status
ticketId
}
}

Example (reuse existing CV by attachment ID):

mutation {
createEventApplication(
eventApplication: {
engagementEventId: "42"
additionalDetails: "I am very motivated to attend."
cvId: "88"
}
) {
id
status
}
}

updateEventApplication

Updates an existing event application's details. Requires :update permission on the application.

Returns: EventApplication

Arguments:

Argument

Type

Required

id

ID

Yes

eventApplication

EventApplicationInput

No

Example:

mutation {
updateEventApplication(
id: "7"
eventApplication: { additionalDetails: "Updated motivation statement." }
) {
id
additionalDetails
}
}

acceptEventApplication

Accepts an event application in in_review status. On acceptance, a unique ticket_id is generated and a QR code + PDF ticket are generated asynchronously.

Returns: EventApplication

Arguments:

Argument

Type

Required

id

ID

Yes

Example:

mutation {
acceptEventApplication(id: "7") {
id
status
ticketId
}
}

rejectEventApplication

Rejects an event application in in_review status.

Returns: EventApplication

Arguments:

Argument

Type

Required

id

ID

Yes

Example:

mutation {
rejectEventApplication(id: "7") {
id
status
}
}

withdrawEventApplication

Allows an applicant to withdraw their application while it is in applied, pending_payment, in_review, or accepted status.

Returns: EventApplication

Arguments:

Argument

Type

Required

id

ID

Yes

Example:

mutation {
withdrawEventApplication(id: "7") {
id
status
}
}

confirmPaymentEventApplication

Confirms payment for an application in pending_payment status, advancing it to in_review.

Returns: EventApplication

Arguments:

Argument

Type

Required

id

ID

Yes

Example:

mutation {
confirmPaymentEventApplication(id: "7") {
id
status
}
}

attendedEventApplication

Marks an accepted application as attended. The id can be either the application's database ID or its ticket_id string (used for QR scanning at event entry).

Returns: EventApplication

Arguments:

Argument

Type

Required

id

ID

Yes

Example (by DB id):

mutation {
attendedEventApplication(id: "7") {
id
status
}
}

Example (by ticket_id via QR scan):

mutation {
attendedEventApplication(id: "A3F9C2") {
id
status
ticketId
}
}

absentEventApplication

Marks an accepted application as absent.

Returns: EventApplication

Arguments:

Argument

Type

Required

id

ID

Yes

Example:

mutation {
absentEventApplication(id: "7") {
id
status
}
}

New Objects

EngagementEvent

Represents an event managed by an AIESEC entity. Entirely new type added in this branch.

Field

Type

Description

id

ID!


title

String


description

String


startTime

DateTime


endTime

DateTime


status

EngagementEventStatus

Enum: draft, in_review, published, completed

hostOffice

Office

The organizing office

applicationDeadline

DateTime


engagementEventSpeakers

[EngagementEventSpeaker]


engagementEventDayActivities

[EngagementEventDayActivity]

Ordered by start_time

location

String


googlePlaceId

String


contactInformation

String


managers

[Person]


eventGuideline

String


refundPolicy

String


feeCents

Int

Fee amount in cents (0 = free)

currency

Currency


coverImage

Image


comments

[Comment]


tagLists

[TagList]


isFavourited

Boolean

Whether current user has favourited

permissions

EventPermission


createdAt

DateTime


updatedAt

DateTime



EngagementEventList

Paginated wrapper for EngagementEvent. New type added in this branch.

Field

Type

data

[EngagementEvent]

facets

[Facets]

paging

Paging


EngagementEventSpeaker

Represents a speaker associated with an engagement event. New type added in this branch.

Field

Type

id

ID!

name

String

description

String

profilePicture

Image

createdAt

DateTime

updatedAt

DateTime


EngagementEventDayActivity

Represents a scheduled activity within a day of the engagement event. New type added in this branch.

Field

Type

id

ID!

day

Int

title

String

description

String

startTime

DateTime

endTime

DateTime

engagementEventSpeakers

[EngagementEventSpeaker]

createdAt

DateTime

updatedAt

DateTime


EventApplication

Represents a person's application to an engagement event, including ticket, CV, QR code, and permission state. New type added in this branch.

Field

Type

Description

id

ID!


engagementEvent

EngagementEvent


person

Person

The applicant

additionalDetails

String

Motivation/extra info

status

EventApplicationStatus

Enum (see below)

cv

Image

Uploaded CV attachment

ticketId

String

Short unique ticket code (generated on accept)

ticketPdf

Image

PDF ticket (generated async after accept)

qrCode

Image

QR code image (generated async after accept)

inReviewAt

DateTime

When the application entered review

permissions

EventApplicationPermissionType


createdAt

DateTime


updatedAt

DateTime



EventApplicationList

Paginated wrapper for EventApplication. New type added in this branch.

Field

Type

data

[EventApplication]

facets

[Facets]

paging

Paging


EventApplicationPermissionType

Granular permission flags for actions on an event application. New type added in this branch.

Field

Type

Condition

canUpdate

Boolean

User has :update on application

canAccept

Boolean

User has :accept and status is in_review

canReject

Boolean

User has :reject and status is in_review

canConfirmPayment

Boolean

User has :confirm_payment and status is pending_payment

canWithdraw

Boolean

User has :withdraw and status is applied or pending_payment

canDownloadTicket

Boolean

Status is accepted and ticket PDF is attached

canAbsent

Boolean

User has :absent and status is accepted


Modified Objects

EventPermission

Newly added fields:

Field

Type

Condition

canCreateComment

Boolean

User can :create Comment or can :update the event

canDeleteComment

Boolean

User can :destroy Comment or can :update the event

canManageTags

Boolean

User can :update the event

canFavourite

Boolean

User can :favourite or :unfavourite the event

No fields were removed.


New Input Types

EngagementEventInput

Input for creating or updating an engagement event.

Argument

Type

Required

title

String

No

description

String

No

startTime

DateTime

No

endTime

DateTime

No

hostOfficeId

ID

No

applicationDeadline

DateTime

No

location

String

No

googlePlaceId

String

No

contactInformation

String

No

managerIds

[ID]

No

eventGuideline

String

No

refundPolicy

String

No

feeCents

Int

No

currencyId

ID

No

coverImage

ImageInput

No

engagementEventSpeakersAttributes

[EngagementEventSpeakerInput]

No

engagementEventDayActivitiesAttributes

[EngagementEventDayActivityInput]

No


EngagementEventSpeakerInput

Nested input for managing speakers. Supports create, update and destroy.

Argument

Type

Notes

id

ID

Provide to update/destroy an existing speaker

name

String


description

String


profilePicture

ImageInput

Base64 image upload

_destroy

Boolean

Set true to delete the speaker (requires id)


EngagementEventDayActivityInput

Nested input for managing day activities. Supports create, update and destroy.

Argument

Type

Notes

id

ID

Provide to update/destroy an existing activity

title

String


description

String


startTime

DateTime


endTime

DateTime


engagementEventSpeakerIds

[ID]

Link existing speakers to this activity

_destroy

Boolean

Set true to delete the activity (requires id)


EngagementEventFilterInput

Filter input for the engagementEvents query.

Argument

Type

Notes

statuses

[EngagementEventStatus]

Filter by one or more statuses

hostOfficeIds

[ID]

Filter by host office

my

String

e.g. "managed" to show events managed by current user

tagIds

[ID]

Filter by tag IDs

isFavourited

Boolean

Filter by current user's favourites

tagFilterOperator

String

"AND" or "OR" (default "OR")


EventApplicationInput

Input for creating or updating an event application.

Argument

Type

Notes

engagementEventId

ID

Target event

additionalDetails

String

Motivation text

cv

ImageInput

Base64 CV upload (PDF or image)

cvId

ID

Existing ActiveStorage::Attachment ID to reuse


EventApplicationFilterInput

Filter input for the eventApplications query.

Argument

Type

Notes

statuses

[EventApplicationStatus]

Filter by one or more statuses

engagementEventIds

[ID]

Filter by event

personIds

[ID]

Filter by applicant

startTime

DateInput

Filter by event start time range

endTime

DateInput

Filter by event end time range

my

String

e.g. "applied" to show current user's applications

sort

EventApplicationSortOption

start_time or end_time

sortDirection

BaseSortDirection

ASC or DESC


New Enum Types

EngagementEventStatus

Values are derived from the EngagementEvent model statuses:

Value

Description

draft

Newly created, not yet submitted for review

in_review

Submitted for review, awaiting publish approval

published

Live and accepting applications

completed

Event has concluded


EventApplicationStatus

Values are derived from the EventApplication model statuses:

Value

Description

applied

Initial state (free events skip this — go straight to in_review)

pending_payment

Awaiting payment confirmation (paid events only)

in_review

Application under review by managers

accepted

Application accepted; ticket and QR code generated

rejected

Application rejected

attended

Applicant confirmed present at the event

absent

Applicant marked absent

withdrawn

Applicant withdrew (can reapply once)


EventApplicationSortOption

Extends BaseSortOption:

Value

start_time

end_time


Crafted by