diff --git a/.gitignore b/.gitignore
index 0ce4a2985cfcb22940734b9a8920e07fdfd0e3cb..672f0c68053d1cc0aaeafe03cf1cc0b10f6dd675 100644
--- a/.gitignore
+++ b/.gitignore
@@ -22,6 +22,4 @@ vite.config.ts.timestamp-*
 
 static/*.jpg
 
-
-
-.vscode
+src/graphql.d.ts
diff --git a/.vscode/settings.json b/.vscode/settings.json
new file mode 100644
index 0000000000000000000000000000000000000000..4824881b2f6da037cfd8333090e8aeb109803b6f
--- /dev/null
+++ b/.vscode/settings.json
@@ -0,0 +1,4 @@
+{
+	"typescript.tsdk": "node_modules/typescript/lib",
+	"typescript.enablePromptUseWorkspaceTsdk": true
+}
diff --git a/package.json b/package.json
index c4514859c1fe0b650a15ff750732d24c1783028a..68277343b1a8c91cba01540c252c58d1ffa73a12 100644
--- a/package.json
+++ b/package.json
@@ -11,14 +11,15 @@
 		"start": "node build",
 		"dev": "vite dev",
 		"build": "vite build",
-		"prebuild": "npm run pull-schema",
+		"prebuild": "npm run schema && npm run graphql-dts",
 		"preview": "vite preview",
 		"check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json",
 		"check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch",
 		"lint": "prettier --check . && eslint .",
 		"format": "prettier --write .",
 		"schema-env": "gql.tada generate-schema $API_ORIGIN/graphql/v0 --header \"Authorization: Basic $API_TOKEN\" -o src/lib/graphql/schema.gql",
-		"schema": "dotenv -- pnpm run schema-env"
+		"schema": "dotenv -- pnpm run schema-env",
+		"graphql-dts": "gql.tada generate-output"
 	},
 	"devDependencies": {
 		"@sveltejs/adapter-node": "^5.2.2",
diff --git a/src/graphql-env.d.ts b/src/graphql-env.d.ts
deleted file mode 100644
index f31f53d14db1246d35d944290b989c45ada0e663..0000000000000000000000000000000000000000
--- a/src/graphql-env.d.ts
+++ /dev/null
@@ -1,110 +0,0 @@
-/* eslint-disable */
-/* prettier-ignore */
-
-export type introspection_types = {
-    'Account': { kind: 'UNION'; name: 'Account'; fields: {}; possibleTypes: 'Group' | 'User'; };
-    'AccountId': { kind: 'INPUT_OBJECT'; name: 'AccountId'; isOneOf: false; inputFields: [{ name: 'uuid'; type: { kind: 'SCALAR'; name: 'UUID'; ofType: null; }; defaultValue: null }, { name: 'id'; type: { kind: 'SCALAR'; name: 'SmolStr'; ofType: null; }; defaultValue: null }]; };
-    'Address': { kind: 'OBJECT'; name: 'Address'; fields: { 'accountUuid': { name: 'accountUuid'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'UUID'; ofType: null; }; } }; 'country': { name: 'country'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'String'; ofType: null; }; } }; 'formatted': { name: 'formatted'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'String'; ofType: null; }; } }; 'locality': { name: 'locality'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'String'; ofType: null; }; } }; 'name': { name: 'name'; type: { kind: 'SCALAR'; name: 'String'; ofType: null; } }; 'postalCode': { name: 'postalCode'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'String'; ofType: null; }; } }; 'region': { name: 'region'; type: { kind: 'SCALAR'; name: 'String'; ofType: null; } }; 'streetAddress': { name: 'streetAddress'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'String'; ofType: null; }; } }; }; };
-    'Base64': unknown;
-    'Boolean': unknown;
-    'BooleanFilter': { kind: 'INPUT_OBJECT'; name: 'BooleanFilter'; isOneOf: false; inputFields: [{ name: 'eq'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'Boolean'; ofType: null; }; }; defaultValue: null }]; };
-    'BuildInfo': { kind: 'OBJECT'; name: 'BuildInfo'; fields: { 'ref': { name: 'ref'; type: { kind: 'SCALAR'; name: 'String'; ofType: null; } }; 'sha': { name: 'sha'; type: { kind: 'SCALAR'; name: 'String'; ofType: null; } }; }; };
-    'ClaimAccess': { name: 'ClaimAccess'; enumValues: 'NONE' | 'READ' | 'WRITE' | 'CREATE' | 'DELETE'; };
-    'CreateGroup': { kind: 'INPUT_OBJECT'; name: 'CreateGroup'; isOneOf: false; inputFields: [{ name: 'id'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'Identifier'; ofType: null; }; }; defaultValue: null }, { name: 'name'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'String'; ofType: null; }; }; defaultValue: null }, { name: 'type'; type: { kind: 'ENUM'; name: 'GroupType'; ofType: null; }; defaultValue: null }]; };
-    'CreateToken': { kind: 'INPUT_OBJECT'; name: 'CreateToken'; isOneOf: false; inputFields: [{ name: 'id'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'String'; ofType: null; }; }; defaultValue: null }, { name: 'description'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'String'; ofType: null; }; }; defaultValue: null }, { name: 'globalAccess'; type: { kind: 'ENUM'; name: 'ClaimAccess'; ofType: null; }; defaultValue: null }, { name: 'allowedIps'; type: { kind: 'LIST'; name: never; ofType: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'String'; ofType: null; }; }; }; defaultValue: null }, { name: 'claims'; type: { kind: 'LIST'; name: never; ofType: { kind: 'NON_NULL'; name: never; ofType: { kind: 'INPUT_OBJECT'; name: 'NewTokenClaim'; ofType: null; }; }; }; defaultValue: null }]; };
-    'CreateTraining': { kind: 'INPUT_OBJECT'; name: 'CreateTraining'; isOneOf: false; inputFields: [{ name: 'id'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'Identifier'; ofType: null; }; }; defaultValue: null }, { name: 'name'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'String'; ofType: null; }; }; defaultValue: null }, { name: 'fullName'; type: { kind: 'SCALAR'; name: 'String'; ofType: null; }; defaultValue: null }]; };
-    'CreateUnixAccount': { kind: 'INPUT_OBJECT'; name: 'CreateUnixAccount'; isOneOf: false; inputFields: [{ name: 'vhost'; type: { kind: 'SCALAR'; name: 'String'; ofType: null; }; defaultValue: null }]; };
-    'CreateUser': { kind: 'INPUT_OBJECT'; name: 'CreateUser'; isOneOf: false; inputFields: [{ name: 'password'; type: { kind: 'INPUT_OBJECT'; name: 'Password'; ofType: null; }; defaultValue: null }, { name: 'familyName'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'String'; ofType: null; }; }; defaultValue: null }, { name: 'givenName'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'String'; ofType: null; }; }; defaultValue: null }, { name: 'promotion'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'Int'; ofType: null; }; }; defaultValue: null }, { name: 'trainingId'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'Identifier'; ofType: null; }; }; defaultValue: null }]; };
-    'CurrentGroupRole': { name: 'CurrentGroupRole'; enumValues: 'MEMBER' | 'ADMIN' | 'BOARD_MEMBER' | 'OWNER'; };
-    'Date': unknown;
-    'DateTime': unknown;
-    'DateTimeFilter': { kind: 'INPUT_OBJECT'; name: 'DateTimeFilter'; isOneOf: false; inputFields: [{ name: 'gt'; type: { kind: 'SCALAR'; name: 'LocalDateTime'; ofType: null; }; defaultValue: null }, { name: 'eq'; type: { kind: 'LIST'; name: never; ofType: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'LocalDateTime'; ofType: null; }; }; }; defaultValue: null }, { name: 'lt'; type: { kind: 'SCALAR'; name: 'LocalDateTime'; ofType: null; }; defaultValue: null }]; };
-    'Float': unknown;
-    'FromNull': { name: 'FromNull'; enumValues: 'NUMBER' | 'STRING' | 'BOOLEAN' | 'LIST' | 'OBJECT'; };
-    'Gender': { name: 'Gender'; enumValues: 'MALE' | 'FEMALE' | 'NON_BINARY' | 'UNKNOWN'; };
-    'GenderFilter': { kind: 'INPUT_OBJECT'; name: 'GenderFilter'; isOneOf: false; inputFields: [{ name: 'isIn'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'LIST'; name: never; ofType: { kind: 'NON_NULL'; name: never; ofType: { kind: 'ENUM'; name: 'Gender'; ofType: null; }; }; }; }; defaultValue: null }]; };
-    'GlobalValues': { kind: 'OBJECT'; name: 'GlobalValues'; fields: { 'evenSemester': { name: 'evenSemester'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'Boolean'; ofType: null; }; } }; 'integration': { name: 'integration'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'Boolean'; ofType: null; }; } }; 'schoolYear': { name: 'schoolYear'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'Int'; ofType: null; }; } }; }; };
-    'Group': { kind: 'OBJECT'; name: 'Group'; fields: { 'active': { name: 'active'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'Boolean'; ofType: null; }; } }; 'backgroundImage': { name: 'backgroundImage'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'Url'; ofType: null; }; } }; 'backgroundImageThumbnailHash': { name: 'backgroundImageThumbnailHash'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'Base64'; ofType: null; }; } }; 'createdAt': { name: 'createdAt'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'DateTime'; ofType: null; }; } }; 'description': { name: 'description'; type: { kind: 'SCALAR'; name: 'String'; ofType: null; } }; 'email': { name: 'email'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'String'; ofType: null; }; } }; 'hidden': { name: 'hidden'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'Boolean'; ofType: null; }; } }; 'id': { name: 'id'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'Identifier'; ofType: null; }; } }; 'name': { name: 'name'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'String'; ofType: null; }; } }; 'picture': { name: 'picture'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'Url'; ofType: null; }; } }; 'pictureThumbnailHash': { name: 'pictureThumbnailHash'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'Base64'; ofType: null; }; } }; 'profile': { name: 'profile'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'Url'; ofType: null; }; } }; 'shortDescription': { name: 'shortDescription'; type: { kind: 'SCALAR'; name: 'String'; ofType: null; } }; 'type': { name: 'type'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'ENUM'; name: 'GroupType'; ofType: null; }; } }; 'unixAccount': { name: 'unixAccount'; type: { kind: 'OBJECT'; name: 'UnixAccount'; ofType: null; } }; 'updatedAt': { name: 'updatedAt'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'DateTime'; ofType: null; }; } }; 'uuid': { name: 'uuid'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'UUID'; ofType: null; }; } }; 'website': { name: 'website'; type: { kind: 'SCALAR'; name: 'Url'; ofType: null; } }; }; };
-    'GroupConnection': { kind: 'OBJECT'; name: 'GroupConnection'; fields: { 'edges': { name: 'edges'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'LIST'; name: never; ofType: { kind: 'NON_NULL'; name: never; ofType: { kind: 'OBJECT'; name: 'GroupEdge'; ofType: null; }; }; }; } }; 'nodes': { name: 'nodes'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'LIST'; name: never; ofType: { kind: 'NON_NULL'; name: never; ofType: { kind: 'OBJECT'; name: 'Group'; ofType: null; }; }; }; } }; 'pageInfo': { name: 'pageInfo'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'OBJECT'; name: 'PageInfo'; ofType: null; }; } }; 'remainingCount': { name: 'remainingCount'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'Int'; ofType: null; }; } }; }; };
-    'GroupEdge': { kind: 'OBJECT'; name: 'GroupEdge'; fields: { 'cursor': { name: 'cursor'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'String'; ofType: null; }; } }; 'node': { name: 'node'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'OBJECT'; name: 'Group'; ofType: null; }; } }; 'remainingCount': { name: 'remainingCount'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'Int'; ofType: null; }; } }; }; };
-    'GroupFilter': { kind: 'INPUT_OBJECT'; name: 'GroupFilter'; isOneOf: false; inputFields: [{ name: 'uuid'; type: { kind: 'INPUT_OBJECT'; name: 'UuidFilter'; ofType: null; }; defaultValue: null }, { name: 'name'; type: { kind: 'INPUT_OBJECT'; name: 'TextFilter'; ofType: null; }; defaultValue: null }, { name: 'type'; type: { kind: 'INPUT_OBJECT'; name: 'GroupTypeFilter'; ofType: null; }; defaultValue: null }, { name: 'shortDescription'; type: { kind: 'INPUT_OBJECT'; name: 'NullableTextFilter'; ofType: null; }; defaultValue: null }, { name: 'description'; type: { kind: 'INPUT_OBJECT'; name: 'NullableTextFilter'; ofType: null; }; defaultValue: null }, { name: 'active'; type: { kind: 'INPUT_OBJECT'; name: 'BooleanFilter'; ofType: null; }; defaultValue: null }, { name: 'accountUuid'; type: { kind: 'INPUT_OBJECT'; name: 'UuidFilter'; ofType: null; }; defaultValue: null }, { name: 'unixAccount'; type: { kind: 'INPUT_OBJECT'; name: 'UnixAccountFilter'; ofType: null; }; defaultValue: null }, { name: 'id'; type: { kind: 'INPUT_OBJECT'; name: 'TextFilter'; ofType: null; }; defaultValue: null }, { name: 'email'; type: { kind: 'INPUT_OBJECT'; name: 'TextFilter'; ofType: null; }; defaultValue: null }, { name: 'emailVerified'; type: { kind: 'INPUT_OBJECT'; name: 'BooleanFilter'; ofType: null; }; defaultValue: null }, { name: 'website'; type: { kind: 'INPUT_OBJECT'; name: 'NullableTextFilter'; ofType: null; }; defaultValue: null }, { name: 'hidden'; type: { kind: 'INPUT_OBJECT'; name: 'BooleanFilter'; ofType: null; }; defaultValue: null }, { name: 'createdAt'; type: { kind: 'INPUT_OBJECT'; name: 'DateTimeFilter'; ofType: null; }; defaultValue: null }, { name: 'updatedAt'; type: { kind: 'INPUT_OBJECT'; name: 'DateTimeFilter'; ofType: null; }; defaultValue: null }, { name: 'or'; type: { kind: 'LIST'; name: never; ofType: { kind: 'NON_NULL'; name: never; ofType: { kind: 'INPUT_OBJECT'; name: 'GroupFilter'; ofType: null; }; }; }; defaultValue: null }]; };
-    'GroupId': { kind: 'INPUT_OBJECT'; name: 'GroupId'; isOneOf: false; inputFields: [{ name: 'id'; type: { kind: 'SCALAR'; name: 'SmolStr'; ofType: null; }; defaultValue: null }, { name: 'email'; type: { kind: 'SCALAR'; name: 'String'; ofType: null; }; defaultValue: null }, { name: 'uuid'; type: { kind: 'SCALAR'; name: 'UUID'; ofType: null; }; defaultValue: null }]; };
-    'GroupOfMember': { kind: 'OBJECT'; name: 'GroupOfMember'; fields: { 'group': { name: 'group'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'OBJECT'; name: 'Group'; ofType: null; }; } }; 'isAdmin': { name: 'isAdmin'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'Boolean'; ofType: null; }; } }; 'isBoardMember': { name: 'isBoardMember'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'Boolean'; ofType: null; }; } }; 'isOwner': { name: 'isOwner'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'Boolean'; ofType: null; }; } }; 'role': { name: 'role'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'ENUM'; name: 'CurrentGroupRole'; ofType: null; }; } }; 'since': { name: 'since'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'Date'; ofType: null; }; } }; }; };
-    'GroupOfMemberFilter': { kind: 'INPUT_OBJECT'; name: 'GroupOfMemberFilter'; isOneOf: false; inputFields: [{ name: 'role'; type: { kind: 'ENUM'; name: 'CurrentGroupRole'; ofType: null; }; defaultValue: null }, { name: 'since'; type: { kind: 'INPUT_OBJECT'; name: 'NeverDateFilter'; ofType: null; }; defaultValue: null }, { name: 'strictRole'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'Boolean'; ofType: null; }; }; defaultValue: "false" }]; };
-    'GroupRole': { name: 'GroupRole'; enumValues: 'GONE' | 'MEMBER' | 'ADMIN' | 'BOARD_MEMBER' | 'OWNER'; };
-    'GroupType': { name: 'GroupType'; enumValues: 'ASSOCIATION' | 'CLUB' | 'COMMISSION' | 'LIST' | 'HOME' | 'OTHER' | 'UNKNOWN'; };
-    'GroupTypeFilter': { kind: 'INPUT_OBJECT'; name: 'GroupTypeFilter'; isOneOf: false; inputFields: [{ name: 'isIn'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'LIST'; name: never; ofType: { kind: 'NON_NULL'; name: never; ofType: { kind: 'ENUM'; name: 'GroupType'; ofType: null; }; }; }; }; defaultValue: null }]; };
-    'Health': { kind: 'OBJECT'; name: 'Health'; fields: { 'db': { name: 'db'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'String'; ofType: null; }; } }; }; };
-    'HistoricalGroupOfMember': { kind: 'OBJECT'; name: 'HistoricalGroupOfMember'; fields: { 'group': { name: 'group'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'OBJECT'; name: 'Group'; ofType: null; }; } }; 'role': { name: 'role'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'ENUM'; name: 'GroupRole'; ofType: null; }; } }; 'since': { name: 'since'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'Date'; ofType: null; }; } }; }; };
-    'HistoricalGroupOfMemberFilter': { kind: 'INPUT_OBJECT'; name: 'HistoricalGroupOfMemberFilter'; isOneOf: false; inputFields: [{ name: 'role'; type: { kind: 'ENUM'; name: 'GroupRole'; ofType: null; }; defaultValue: null }, { name: 'since'; type: { kind: 'INPUT_OBJECT'; name: 'NeverDateFilter'; ofType: null; }; defaultValue: null }, { name: 'strictRole'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'Boolean'; ofType: null; }; }; defaultValue: "false" }]; };
-    'HistoricalMemberOfGroup': { kind: 'OBJECT'; name: 'HistoricalMemberOfGroup'; fields: { 'role': { name: 'role'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'ENUM'; name: 'GroupRole'; ofType: null; }; } }; 'since': { name: 'since'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'Date'; ofType: null; }; } }; 'user': { name: 'user'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'OBJECT'; name: 'User'; ofType: null; }; } }; }; };
-    'Identifier': unknown;
-    'Int': unknown;
-    'Int16Filter': { kind: 'INPUT_OBJECT'; name: 'Int16Filter'; isOneOf: false; inputFields: [{ name: 'gt'; type: { kind: 'SCALAR'; name: 'Int'; ofType: null; }; defaultValue: null }, { name: 'eq'; type: { kind: 'LIST'; name: never; ofType: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'Int'; ofType: null; }; }; }; defaultValue: null }, { name: 'lt'; type: { kind: 'SCALAR'; name: 'Int'; ofType: null; }; defaultValue: null }]; };
-    'LevenshteinFilter': { kind: 'INPUT_OBJECT'; name: 'LevenshteinFilter'; isOneOf: false; inputFields: [{ name: 'value'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'String'; ofType: null; }; }; defaultValue: null }, { name: 'threshold'; type: { kind: 'SCALAR'; name: 'Int'; ofType: null; }; defaultValue: null }]; };
-    'LocalDateTime': unknown;
-    'Mutation': { kind: 'OBJECT'; name: 'Mutation'; fields: { 'addClaims': { name: 'addClaims'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'OBJECT'; name: 'Token'; ofType: null; }; } }; 'addGroupMemberRole': { name: 'addGroupMemberRole'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'OBJECT'; name: 'HistoricalMemberOfGroup'; ofType: null; }; } }; 'copyClaims': { name: 'copyClaims'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'OBJECT'; name: 'Token'; ofType: null; }; } }; 'createGroup': { name: 'createGroup'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'OBJECT'; name: 'Group'; ofType: null; }; } }; 'createGroupUnixAccount': { name: 'createGroupUnixAccount'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'OBJECT'; name: 'UnixAccount'; ofType: null; }; } }; 'createToken': { name: 'createToken'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'OBJECT'; name: 'PlainToken'; ofType: null; }; } }; 'createTraining': { name: 'createTraining'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'OBJECT'; name: 'Training'; ofType: null; }; } }; 'createUser': { name: 'createUser'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'OBJECT'; name: 'User'; ofType: null; }; } }; 'createUserUnixAccount': { name: 'createUserUnixAccount'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'OBJECT'; name: 'UnixAccount'; ofType: null; }; } }; 'deleteClaims': { name: 'deleteClaims'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'OBJECT'; name: 'Token'; ofType: null; }; } }; 'deleteGroup': { name: 'deleteGroup'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'Boolean'; ofType: null; }; } }; 'deleteToken': { name: 'deleteToken'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'Int'; ofType: null; }; } }; 'deleteTraining': { name: 'deleteTraining'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'Int'; ofType: null; }; } }; 'deleteUser': { name: 'deleteUser'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'Int'; ofType: null; }; } }; 'endOfIntegration': { name: 'endOfIntegration'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'Boolean'; ofType: null; }; } }; 'evenSemester': { name: 'evenSemester'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'Boolean'; ofType: null; }; } }; 'newYear': { name: 'newYear'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'Int'; ofType: null; }; } }; 'regenerateToken': { name: 'regenerateToken'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'OBJECT'; name: 'PlainToken'; ofType: null; }; } }; 'status': { name: 'status'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'Int'; ofType: null; }; } }; 'updateGroup': { name: 'updateGroup'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'OBJECT'; name: 'Group'; ofType: null; }; } }; 'updateToken': { name: 'updateToken'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'OBJECT'; name: 'Token'; ofType: null; }; } }; 'updateTraining': { name: 'updateTraining'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'OBJECT'; name: 'Training'; ofType: null; }; } }; 'updateUnixAccount': { name: 'updateUnixAccount'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'OBJECT'; name: 'UnixAccount'; ofType: null; }; } }; 'updateUser': { name: 'updateUser'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'OBJECT'; name: 'User'; ofType: null; }; } }; }; };
-    'NeverDateFilter': { kind: 'INPUT_OBJECT'; name: 'NeverDateFilter'; isOneOf: false; inputFields: [{ name: 'gt'; type: { kind: 'SCALAR'; name: 'Date'; ofType: null; }; defaultValue: null }, { name: 'eq'; type: { kind: 'LIST'; name: never; ofType: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'Date'; ofType: null; }; }; }; defaultValue: null }, { name: 'lt'; type: { kind: 'SCALAR'; name: 'Date'; ofType: null; }; defaultValue: null }]; };
-    'NewTokenClaim': { kind: 'INPUT_OBJECT'; name: 'NewTokenClaim'; isOneOf: false; inputFields: [{ name: 'claim'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'String'; ofType: null; }; }; defaultValue: null }, { name: 'access'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'ENUM'; name: 'ClaimAccess'; ofType: null; }; }; defaultValue: null }]; };
-    'NullableDateFilter': { kind: 'INPUT_OBJECT'; name: 'NullableDateFilter'; isOneOf: false; inputFields: [{ name: 'null'; type: { kind: 'SCALAR'; name: 'Boolean'; ofType: null; }; defaultValue: null }, { name: 'day'; type: { kind: 'SCALAR'; name: 'Int'; ofType: null; }; defaultValue: null }, { name: 'month'; type: { kind: 'SCALAR'; name: 'Int'; ofType: null; }; defaultValue: null }, { name: 'gt'; type: { kind: 'SCALAR'; name: 'Date'; ofType: null; }; defaultValue: null }, { name: 'eq'; type: { kind: 'LIST'; name: never; ofType: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'Date'; ofType: null; }; }; }; defaultValue: null }, { name: 'lt'; type: { kind: 'SCALAR'; name: 'Date'; ofType: null; }; defaultValue: null }]; };
-    'NullableDateTimeFilter': { kind: 'INPUT_OBJECT'; name: 'NullableDateTimeFilter'; isOneOf: false; inputFields: [{ name: 'null'; type: { kind: 'SCALAR'; name: 'Boolean'; ofType: null; }; defaultValue: null }, { name: 'gt'; type: { kind: 'SCALAR'; name: 'LocalDateTime'; ofType: null; }; defaultValue: null }, { name: 'eq'; type: { kind: 'LIST'; name: never; ofType: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'LocalDateTime'; ofType: null; }; }; }; defaultValue: null }, { name: 'lt'; type: { kind: 'SCALAR'; name: 'LocalDateTime'; ofType: null; }; defaultValue: null }]; };
-    'NullableFilter': { kind: 'INPUT_OBJECT'; name: 'NullableFilter'; isOneOf: false; inputFields: [{ name: 'null'; type: { kind: 'SCALAR'; name: 'Boolean'; ofType: null; }; defaultValue: null }]; };
-    'NullableTextFilter': { kind: 'INPUT_OBJECT'; name: 'NullableTextFilter'; isOneOf: false; inputFields: [{ name: 'null'; type: { kind: 'SCALAR'; name: 'Boolean'; ofType: null; }; defaultValue: null }, { name: 'like'; type: { kind: 'LIST'; name: never; ofType: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'String'; ofType: null; }; }; }; defaultValue: null }, { name: 'notLike'; type: { kind: 'LIST'; name: never; ofType: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'String'; ofType: null; }; }; }; defaultValue: null }, { name: 'similar'; type: { kind: 'LIST'; name: never; ofType: { kind: 'NON_NULL'; name: never; ofType: { kind: 'INPUT_OBJECT'; name: 'SimilarFilter'; ofType: null; }; }; }; defaultValue: null }, { name: 'levenshtein'; type: { kind: 'LIST'; name: never; ofType: { kind: 'NON_NULL'; name: never; ofType: { kind: 'INPUT_OBJECT'; name: 'LevenshteinFilter'; ofType: null; }; }; }; defaultValue: null }]; };
-    'OrderByGroup': { name: 'OrderByGroup'; enumValues: 'UUID' | 'ID' | 'NAME' | 'CREATED_AT' | 'UPDATED_AT'; };
-    'OrderByUser': { name: 'OrderByUser'; enumValues: 'UUID' | 'ID' | 'GIVEN_NAME' | 'FAMILY_NAME' | 'NICKNAME' | 'BIRTH_DATE' | 'PROMOTION' | 'YEAR' | 'CREATED_AT' | 'UPDATED_AT' | 'LAST_USED_AT'; };
-    'PageInfo': { kind: 'OBJECT'; name: 'PageInfo'; fields: { 'endCursor': { name: 'endCursor'; type: { kind: 'SCALAR'; name: 'String'; ofType: null; } }; 'hasNextPage': { name: 'hasNextPage'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'Boolean'; ofType: null; }; } }; 'hasPreviousPage': { name: 'hasPreviousPage'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'Boolean'; ofType: null; }; } }; 'startCursor': { name: 'startCursor'; type: { kind: 'SCALAR'; name: 'String'; ofType: null; } }; }; };
-    'Password': { kind: 'INPUT_OBJECT'; name: 'Password'; isOneOf: false; inputFields: [{ name: 'hash'; type: { kind: 'SCALAR'; name: 'String'; ofType: null; }; defaultValue: null }, { name: 'plain'; type: { kind: 'SCALAR'; name: 'String'; ofType: null; }; defaultValue: null }]; };
-    'PlainToken': { kind: 'OBJECT'; name: 'PlainToken'; fields: { 'base64': { name: 'base64'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'String'; ofType: null; }; } }; 'raw': { name: 'raw'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'String'; ofType: null; }; } }; }; };
-    'Query': { kind: 'OBJECT'; name: 'Query'; fields: { 'account': { name: 'account'; type: { kind: 'UNION'; name: 'Account'; ofType: null; } }; 'buildInfo': { name: 'buildInfo'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'OBJECT'; name: 'BuildInfo'; ofType: null; }; } }; 'currentToken': { name: 'currentToken'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'OBJECT'; name: 'Token'; ofType: null; }; } }; 'globalsValues': { name: 'globalsValues'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'OBJECT'; name: 'GlobalValues'; ofType: null; }; } }; 'group': { name: 'group'; type: { kind: 'OBJECT'; name: 'Group'; ofType: null; } }; 'groups': { name: 'groups'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'OBJECT'; name: 'GroupConnection'; ofType: null; }; } }; 'health': { name: 'health'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'OBJECT'; name: 'Health'; ofType: null; }; } }; 'oAuthAppOwner': { name: 'oAuthAppOwner'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'UNION'; name: 'Account'; ofType: null; }; } }; 'token': { name: 'token'; type: { kind: 'OBJECT'; name: 'Token'; ofType: null; } }; 'tokens': { name: 'tokens'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'LIST'; name: never; ofType: { kind: 'NON_NULL'; name: never; ofType: { kind: 'OBJECT'; name: 'Token'; ofType: null; }; }; }; } }; 'trainings': { name: 'trainings'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'LIST'; name: never; ofType: { kind: 'NON_NULL'; name: never; ofType: { kind: 'OBJECT'; name: 'Training'; ofType: null; }; }; }; } }; 'user': { name: 'user'; type: { kind: 'OBJECT'; name: 'User'; ofType: null; } }; 'users': { name: 'users'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'OBJECT'; name: 'UserConnection'; ofType: null; }; } }; }; };
-    'SimilarFilter': { kind: 'INPUT_OBJECT'; name: 'SimilarFilter'; isOneOf: false; inputFields: [{ name: 'value'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'String'; ofType: null; }; }; defaultValue: null }, { name: 'threshold'; type: { kind: 'SCALAR'; name: 'Float'; ofType: null; }; defaultValue: null }]; };
-    'SmolStr': unknown;
-    'String': unknown;
-    'TextFilter': { kind: 'INPUT_OBJECT'; name: 'TextFilter'; isOneOf: false; inputFields: [{ name: 'like'; type: { kind: 'LIST'; name: never; ofType: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'String'; ofType: null; }; }; }; defaultValue: null }, { name: 'notLike'; type: { kind: 'LIST'; name: never; ofType: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'String'; ofType: null; }; }; }; defaultValue: null }, { name: 'similar'; type: { kind: 'LIST'; name: never; ofType: { kind: 'NON_NULL'; name: never; ofType: { kind: 'INPUT_OBJECT'; name: 'SimilarFilter'; ofType: null; }; }; }; defaultValue: null }, { name: 'levenshtein'; type: { kind: 'LIST'; name: never; ofType: { kind: 'NON_NULL'; name: never; ofType: { kind: 'INPUT_OBJECT'; name: 'LevenshteinFilter'; ofType: null; }; }; }; defaultValue: null }]; };
-    'Token': { kind: 'OBJECT'; name: 'Token'; fields: { 'allowedIps': { name: 'allowedIps'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'LIST'; name: never; ofType: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'String'; ofType: null; }; }; }; } }; 'claims': { name: 'claims'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'LIST'; name: never; ofType: { kind: 'NON_NULL'; name: never; ofType: { kind: 'OBJECT'; name: 'TokenClaim'; ofType: null; }; }; }; } }; 'description': { name: 'description'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'String'; ofType: null; }; } }; 'globalAccess': { name: 'globalAccess'; type: { kind: 'ENUM'; name: 'ClaimAccess'; ofType: null; } }; 'id': { name: 'id'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'String'; ofType: null; }; } }; 'tokenHash': { name: 'tokenHash'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'String'; ofType: null; }; } }; 'uuid': { name: 'uuid'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'UUID'; ofType: null; }; } }; }; };
-    'TokenClaim': { kind: 'OBJECT'; name: 'TokenClaim'; fields: { 'access': { name: 'access'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'ENUM'; name: 'ClaimAccess'; ofType: null; }; } }; 'claim': { name: 'claim'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'String'; ofType: null; }; } }; }; };
-    'TokenId': { kind: 'INPUT_OBJECT'; name: 'TokenId'; isOneOf: false; inputFields: [{ name: 'id'; type: { kind: 'SCALAR'; name: 'SmolStr'; ofType: null; }; defaultValue: null }, { name: 'uuid'; type: { kind: 'SCALAR'; name: 'UUID'; ofType: null; }; defaultValue: null }, { name: 'globalAccess'; type: { kind: 'ENUM'; name: 'ClaimAccess'; ofType: null; }; defaultValue: null }]; };
-    'Training': { kind: 'OBJECT'; name: 'Training'; fields: { 'fullName': { name: 'fullName'; type: { kind: 'SCALAR'; name: 'String'; ofType: null; } }; 'id': { name: 'id'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'Identifier'; ofType: null; }; } }; 'name': { name: 'name'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'String'; ofType: null; }; } }; 'uuid': { name: 'uuid'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'UUID'; ofType: null; }; } }; }; };
-    'TrainingId': { kind: 'INPUT_OBJECT'; name: 'TrainingId'; isOneOf: false; inputFields: [{ name: 'id'; type: { kind: 'SCALAR'; name: 'SmolStr'; ofType: null; }; defaultValue: null }, { name: 'uuid'; type: { kind: 'SCALAR'; name: 'UUID'; ofType: null; }; defaultValue: null }]; };
-    'UUID': unknown;
-    'UnixAccount': { kind: 'OBJECT'; name: 'UnixAccount'; fields: { 'accountUuid': { name: 'accountUuid'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'UUID'; ofType: null; }; } }; 'uid': { name: 'uid'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'Int'; ofType: null; }; } }; 'vhost': { name: 'vhost'; type: { kind: 'SCALAR'; name: 'String'; ofType: null; } }; 'website': { name: 'website'; type: { kind: 'SCALAR'; name: 'Url'; ofType: null; } }; }; };
-    'UnixAccountFilter': { kind: 'INPUT_OBJECT'; name: 'UnixAccountFilter'; isOneOf: false; inputFields: [{ name: 'null'; type: { kind: 'SCALAR'; name: 'Boolean'; ofType: null; }; defaultValue: null }, { name: 'uuid'; type: { kind: 'INPUT_OBJECT'; name: 'UuidFilter'; ofType: null; }; defaultValue: null }, { name: 'uid'; type: { kind: 'INPUT_OBJECT'; name: 'Int16Filter'; ofType: null; }; defaultValue: null }, { name: 'vhost'; type: { kind: 'INPUT_OBJECT'; name: 'TextFilter'; ofType: null; }; defaultValue: null }]; };
-    'UnixAccountId': { kind: 'INPUT_OBJECT'; name: 'UnixAccountId'; isOneOf: false; inputFields: [{ name: 'uid'; type: { kind: 'SCALAR'; name: 'Int'; ofType: null; }; defaultValue: null }, { name: 'uuid'; type: { kind: 'SCALAR'; name: 'UUID'; ofType: null; }; defaultValue: null }]; };
-    'UpdateGroup': { kind: 'INPUT_OBJECT'; name: 'UpdateGroup'; isOneOf: false; inputFields: [{ name: 'name'; type: { kind: 'SCALAR'; name: 'String'; ofType: null; }; defaultValue: null }, { name: 'type'; type: { kind: 'ENUM'; name: 'GroupType'; ofType: null; }; defaultValue: null }, { name: 'shortDescription'; type: { kind: 'SCALAR'; name: 'String'; ofType: null; }; defaultValue: null }, { name: 'description'; type: { kind: 'SCALAR'; name: 'String'; ofType: null; }; defaultValue: null }, { name: 'active'; type: { kind: 'SCALAR'; name: 'Boolean'; ofType: null; }; defaultValue: null }, { name: 'id'; type: { kind: 'SCALAR'; name: 'Identifier'; ofType: null; }; defaultValue: null }, { name: 'email'; type: { kind: 'SCALAR'; name: 'String'; ofType: null; }; defaultValue: null }, { name: 'emailVerified'; type: { kind: 'SCALAR'; name: 'Boolean'; ofType: null; }; defaultValue: null }, { name: 'website'; type: { kind: 'SCALAR'; name: 'Url'; ofType: null; }; defaultValue: null }, { name: 'hidden'; type: { kind: 'SCALAR'; name: 'Boolean'; ofType: null; }; defaultValue: null }]; };
-    'UpdateToken': { kind: 'INPUT_OBJECT'; name: 'UpdateToken'; isOneOf: false; inputFields: [{ name: 'id'; type: { kind: 'SCALAR'; name: 'String'; ofType: null; }; defaultValue: null }, { name: 'description'; type: { kind: 'SCALAR'; name: 'String'; ofType: null; }; defaultValue: null }, { name: 'allowedIps'; type: { kind: 'LIST'; name: never; ofType: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'String'; ofType: null; }; }; }; defaultValue: null }]; };
-    'UpdateTraining': { kind: 'INPUT_OBJECT'; name: 'UpdateTraining'; isOneOf: false; inputFields: [{ name: 'name'; type: { kind: 'SCALAR'; name: 'String'; ofType: null; }; defaultValue: null }, { name: 'fullName'; type: { kind: 'SCALAR'; name: 'String'; ofType: null; }; defaultValue: null }]; };
-    'UpdateUnixAccount': { kind: 'INPUT_OBJECT'; name: 'UpdateUnixAccount'; isOneOf: false; inputFields: [{ name: 'uid'; type: { kind: 'SCALAR'; name: 'Int'; ofType: null; }; defaultValue: null }, { name: 'vhost'; type: { kind: 'SCALAR'; name: 'String'; ofType: null; }; defaultValue: null }]; };
-    'UpdateUser': { kind: 'INPUT_OBJECT'; name: 'UpdateUser'; isOneOf: false; inputFields: [{ name: 'password'; type: { kind: 'INPUT_OBJECT'; name: 'Password'; ofType: null; }; defaultValue: null }, { name: 'givenNameAtBirth'; type: { kind: 'SCALAR'; name: 'String'; ofType: null; }; defaultValue: null }, { name: 'givenNameInUse'; type: { kind: 'SCALAR'; name: 'String'; ofType: null; }; defaultValue: null }, { name: 'middleName'; type: { kind: 'SCALAR'; name: 'String'; ofType: null; }; defaultValue: null }, { name: 'familyName'; type: { kind: 'SCALAR'; name: 'String'; ofType: null; }; defaultValue: null }, { name: 'nickname'; type: { kind: 'SCALAR'; name: 'String'; ofType: null; }; defaultValue: null }, { name: 'gender'; type: { kind: 'ENUM'; name: 'Gender'; ofType: null; }; defaultValue: null }, { name: 'birthdate'; type: { kind: 'SCALAR'; name: 'Date'; ofType: null; }; defaultValue: null }, { name: 'zoneinfo'; type: { kind: 'SCALAR'; name: 'String'; ofType: null; }; defaultValue: null }, { name: 'locale'; type: { kind: 'SCALAR'; name: 'String'; ofType: null; }; defaultValue: null }, { name: 'schoolLogin'; type: { kind: 'SCALAR'; name: 'String'; ofType: null; }; defaultValue: null }, { name: 'phoneNumber'; type: { kind: 'SCALAR'; name: 'String'; ofType: null; }; defaultValue: null }, { name: 'phoneNumberVerified'; type: { kind: 'SCALAR'; name: 'Boolean'; ofType: null; }; defaultValue: null }, { name: 'initialPromotion'; type: { kind: 'SCALAR'; name: 'Int'; ofType: null; }; defaultValue: null }, { name: 'gapYear'; type: { kind: 'SCALAR'; name: 'Int'; ofType: null; }; defaultValue: null }, { name: 'diplomaYearDuration'; type: { kind: 'SCALAR'; name: 'Int'; ofType: null; }; defaultValue: null }, { name: 'trainingId'; type: { kind: 'SCALAR'; name: 'SmolStr'; ofType: null; }; defaultValue: null }, { name: 'extendedTrialPeriod'; type: { kind: 'SCALAR'; name: 'Boolean'; ofType: null; }; defaultValue: null }, { name: 'aeiieMember'; type: { kind: 'SCALAR'; name: 'Boolean'; ofType: null; }; defaultValue: null }, { name: 'suspended'; type: { kind: 'SCALAR'; name: 'Boolean'; ofType: null; }; defaultValue: null }, { name: 'public'; type: { kind: 'SCALAR'; name: 'Boolean'; ofType: null; }; defaultValue: null }, { name: 'lastUsedAt'; type: { kind: 'SCALAR'; name: 'LocalDateTime'; ofType: null; }; defaultValue: null }, { name: 'id'; type: { kind: 'SCALAR'; name: 'Identifier'; ofType: null; }; defaultValue: null }, { name: 'email'; type: { kind: 'SCALAR'; name: 'String'; ofType: null; }; defaultValue: null }, { name: 'emailVerified'; type: { kind: 'SCALAR'; name: 'Boolean'; ofType: null; }; defaultValue: null }, { name: 'website'; type: { kind: 'SCALAR'; name: 'Url'; ofType: null; }; defaultValue: null }, { name: 'hidden'; type: { kind: 'SCALAR'; name: 'Boolean'; ofType: null; }; defaultValue: null }]; };
-    'Url': unknown;
-    'Urn': unknown;
-    'User': { kind: 'OBJECT'; name: 'User'; fields: { 'address': { name: 'address'; type: { kind: 'OBJECT'; name: 'Address'; ofType: null; } }; 'aeiieMember': { name: 'aeiieMember'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'Boolean'; ofType: null; }; } }; 'backgroundImage': { name: 'backgroundImage'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'Url'; ofType: null; }; } }; 'backgroundImageThumbnailHash': { name: 'backgroundImageThumbnailHash'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'Base64'; ofType: null; }; } }; 'birthdate': { name: 'birthdate'; type: { kind: 'SCALAR'; name: 'Date'; ofType: null; } }; 'civilName': { name: 'civilName'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'String'; ofType: null; }; } }; 'createdAt': { name: 'createdAt'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'DateTime'; ofType: null; }; } }; 'diplomaYearDuration': { name: 'diplomaYearDuration'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'Int'; ofType: null; }; } }; 'email': { name: 'email'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'String'; ofType: null; }; } }; 'emailForwardAddress': { name: 'emailForwardAddress'; type: { kind: 'SCALAR'; name: 'String'; ofType: null; } }; 'emailVerified': { name: 'emailVerified'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'Boolean'; ofType: null; }; } }; 'extendedTrialPeriod': { name: 'extendedTrialPeriod'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'Boolean'; ofType: null; }; } }; 'familyName': { name: 'familyName'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'String'; ofType: null; }; } }; 'forenames': { name: 'forenames'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'String'; ofType: null; }; } }; 'gapYear': { name: 'gapYear'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'Int'; ofType: null; }; } }; 'gender': { name: 'gender'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'ENUM'; name: 'Gender'; ofType: null; }; } }; 'givenName': { name: 'givenName'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'String'; ofType: null; }; } }; 'givenNameAtBirth': { name: 'givenNameAtBirth'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'String'; ofType: null; }; } }; 'givenNameInUse': { name: 'givenNameInUse'; type: { kind: 'SCALAR'; name: 'String'; ofType: null; } }; 'group': { name: 'group'; type: { kind: 'OBJECT'; name: 'GroupOfMember'; ofType: null; } }; 'groupHistory': { name: 'groupHistory'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'LIST'; name: never; ofType: { kind: 'NON_NULL'; name: never; ofType: { kind: 'OBJECT'; name: 'HistoricalGroupOfMember'; ofType: null; }; }; }; } }; 'groups': { name: 'groups'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'LIST'; name: never; ofType: { kind: 'NON_NULL'; name: never; ofType: { kind: 'OBJECT'; name: 'GroupOfMember'; ofType: null; }; }; }; } }; 'hidden': { name: 'hidden'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'Boolean'; ofType: null; }; } }; 'id': { name: 'id'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'Identifier'; ofType: null; }; } }; 'initialPromotion': { name: 'initialPromotion'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'Int'; ofType: null; }; } }; 'lastUsedAt': { name: 'lastUsedAt'; type: { kind: 'SCALAR'; name: 'DateTime'; ofType: null; } }; 'locale': { name: 'locale'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'String'; ofType: null; }; } }; 'middleName': { name: 'middleName'; type: { kind: 'SCALAR'; name: 'String'; ofType: null; } }; 'name': { name: 'name'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'String'; ofType: null; }; } }; 'nickname': { name: 'nickname'; type: { kind: 'SCALAR'; name: 'String'; ofType: null; } }; 'oAuthGroup': { name: 'oAuthGroup'; type: { kind: 'OBJECT'; name: 'GroupOfMember'; ofType: null; } }; 'passwordHash': { name: 'passwordHash'; type: { kind: 'SCALAR'; name: 'String'; ofType: null; } }; 'phoneNumber': { name: 'phoneNumber'; type: { kind: 'SCALAR'; name: 'String'; ofType: null; } }; 'phoneNumberVerified': { name: 'phoneNumberVerified'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'Boolean'; ofType: null; }; } }; 'photo': { name: 'photo'; type: { kind: 'SCALAR'; name: 'Url'; ofType: null; } }; 'photoThumbnailHash': { name: 'photoThumbnailHash'; type: { kind: 'SCALAR'; name: 'Base64'; ofType: null; } }; 'picture': { name: 'picture'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'Url'; ofType: null; }; } }; 'pictureThumbnailHash': { name: 'pictureThumbnailHash'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'Base64'; ofType: null; }; } }; 'preferredNickname': { name: 'preferredNickname'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'String'; ofType: null; }; } }; 'preferredUsername': { name: 'preferredUsername'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'String'; ofType: null; }; } }; 'profile': { name: 'profile'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'Url'; ofType: null; }; } }; 'promotion': { name: 'promotion'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'Int'; ofType: null; }; } }; 'restrictedAccess': { name: 'restrictedAccess'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'Boolean'; ofType: null; }; } }; 'schoolEmail': { name: 'schoolEmail'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'String'; ofType: null; }; } }; 'schoolLogin': { name: 'schoolLogin'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'String'; ofType: null; }; } }; 'semester': { name: 'semester'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'Int'; ofType: null; }; } }; 'suspended': { name: 'suspended'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'Boolean'; ofType: null; }; } }; 'training': { name: 'training'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'OBJECT'; name: 'Training'; ofType: null; }; } }; 'trialPeriodDaysLeft': { name: 'trialPeriodDaysLeft'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'Int'; ofType: null; }; } }; 'unixAccount': { name: 'unixAccount'; type: { kind: 'OBJECT'; name: 'UnixAccount'; ofType: null; } }; 'updatedAt': { name: 'updatedAt'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'DateTime'; ofType: null; }; } }; 'uuid': { name: 'uuid'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'UUID'; ofType: null; }; } }; 'website': { name: 'website'; type: { kind: 'SCALAR'; name: 'Url'; ofType: null; } }; 'year': { name: 'year'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'Int'; ofType: null; }; } }; 'zoneinfo': { name: 'zoneinfo'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'String'; ofType: null; }; } }; }; };
-    'UserConnection': { kind: 'OBJECT'; name: 'UserConnection'; fields: { 'edges': { name: 'edges'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'LIST'; name: never; ofType: { kind: 'NON_NULL'; name: never; ofType: { kind: 'OBJECT'; name: 'UserEdge'; ofType: null; }; }; }; } }; 'nodes': { name: 'nodes'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'LIST'; name: never; ofType: { kind: 'NON_NULL'; name: never; ofType: { kind: 'OBJECT'; name: 'User'; ofType: null; }; }; }; } }; 'pageInfo': { name: 'pageInfo'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'OBJECT'; name: 'PageInfo'; ofType: null; }; } }; 'remainingCount': { name: 'remainingCount'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'Int'; ofType: null; }; } }; }; };
-    'UserEdge': { kind: 'OBJECT'; name: 'UserEdge'; fields: { 'cursor': { name: 'cursor'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'String'; ofType: null; }; } }; 'node': { name: 'node'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'OBJECT'; name: 'User'; ofType: null; }; } }; 'remainingCount': { name: 'remainingCount'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'Int'; ofType: null; }; } }; }; };
-    'UserFilter': { kind: 'INPUT_OBJECT'; name: 'UserFilter'; isOneOf: false; inputFields: [{ name: 'uuid'; type: { kind: 'INPUT_OBJECT'; name: 'UuidFilter'; ofType: null; }; defaultValue: null }, { name: 'givenName'; type: { kind: 'INPUT_OBJECT'; name: 'TextFilter'; ofType: null; }; defaultValue: null }, { name: 'givenNameInUse'; type: { kind: 'INPUT_OBJECT'; name: 'NullableTextFilter'; ofType: null; }; defaultValue: null }, { name: 'givenNameAtBirth'; type: { kind: 'INPUT_OBJECT'; name: 'TextFilter'; ofType: null; }; defaultValue: null }, { name: 'middleName'; type: { kind: 'INPUT_OBJECT'; name: 'NullableTextFilter'; ofType: null; }; defaultValue: null }, { name: 'familyName'; type: { kind: 'INPUT_OBJECT'; name: 'TextFilter'; ofType: null; }; defaultValue: null }, { name: 'nickname'; type: { kind: 'INPUT_OBJECT'; name: 'NullableTextFilter'; ofType: null; }; defaultValue: null }, { name: 'gender'; type: { kind: 'INPUT_OBJECT'; name: 'GenderFilter'; ofType: null; }; defaultValue: null }, { name: 'birthdate'; type: { kind: 'INPUT_OBJECT'; name: 'NullableDateFilter'; ofType: null; }; defaultValue: null }, { name: 'zoneinfo'; type: { kind: 'INPUT_OBJECT'; name: 'TextFilter'; ofType: null; }; defaultValue: null }, { name: 'locale'; type: { kind: 'INPUT_OBJECT'; name: 'TextFilter'; ofType: null; }; defaultValue: null }, { name: 'pictureThumbnailHash'; type: { kind: 'INPUT_OBJECT'; name: 'NullableFilter'; ofType: null; }; defaultValue: null }, { name: 'backgroundThumbnailHash'; type: { kind: 'INPUT_OBJECT'; name: 'NullableFilter'; ofType: null; }; defaultValue: null }, { name: 'photoThumbnailHash'; type: { kind: 'INPUT_OBJECT'; name: 'NullableFilter'; ofType: null; }; defaultValue: null }, { name: 'phoneNumber'; type: { kind: 'INPUT_OBJECT'; name: 'NullableTextFilter'; ofType: null; }; defaultValue: null }, { name: 'phoneNumberVerified'; type: { kind: 'INPUT_OBJECT'; name: 'BooleanFilter'; ofType: null; }; defaultValue: null }, { name: 'schoolLogin'; type: { kind: 'INPUT_OBJECT'; name: 'TextFilter'; ofType: null; }; defaultValue: null }, { name: 'promotion'; type: { kind: 'INPUT_OBJECT'; name: 'Int16Filter'; ofType: null; }; defaultValue: null }, { name: 'initialPromotion'; type: { kind: 'INPUT_OBJECT'; name: 'Int16Filter'; ofType: null; }; defaultValue: null }, { name: 'gapYear'; type: { kind: 'INPUT_OBJECT'; name: 'Int16Filter'; ofType: null; }; defaultValue: null }, { name: 'year'; type: { kind: 'INPUT_OBJECT'; name: 'Int16Filter'; ofType: null; }; defaultValue: null }, { name: 'diplomaYearDuration'; type: { kind: 'INPUT_OBJECT'; name: 'Int16Filter'; ofType: null; }; defaultValue: null }, { name: 'semester'; type: { kind: 'INPUT_OBJECT'; name: 'Int16Filter'; ofType: null; }; defaultValue: null }, { name: 'training'; type: { kind: 'INPUT_OBJECT'; name: 'TextFilter'; ofType: null; }; defaultValue: null }, { name: 'aeiieMember'; type: { kind: 'INPUT_OBJECT'; name: 'BooleanFilter'; ofType: null; }; defaultValue: null }, { name: 'trialPeriodDaysLeft'; type: { kind: 'INPUT_OBJECT'; name: 'Int16Filter'; ofType: null; }; defaultValue: null }, { name: 'extendedTrialPeriod'; type: { kind: 'INPUT_OBJECT'; name: 'BooleanFilter'; ofType: null; }; defaultValue: null }, { name: 'restrictedAccess'; type: { kind: 'INPUT_OBJECT'; name: 'BooleanFilter'; ofType: null; }; defaultValue: null }, { name: 'suspended'; type: { kind: 'INPUT_OBJECT'; name: 'BooleanFilter'; ofType: null; }; defaultValue: null }, { name: 'public'; type: { kind: 'INPUT_OBJECT'; name: 'BooleanFilter'; ofType: null; }; defaultValue: null }, { name: 'lastUsedAt'; type: { kind: 'INPUT_OBJECT'; name: 'NullableDateTimeFilter'; ofType: null; }; defaultValue: null }, { name: 'groups'; type: { kind: 'INPUT_OBJECT'; name: 'UserGroupsFilter'; ofType: null; }; defaultValue: null }, { name: 'accountUuid'; type: { kind: 'INPUT_OBJECT'; name: 'UuidFilter'; ofType: null; }; defaultValue: null }, { name: 'unixAccount'; type: { kind: 'INPUT_OBJECT'; name: 'UnixAccountFilter'; ofType: null; }; defaultValue: null }, { name: 'id'; type: { kind: 'INPUT_OBJECT'; name: 'TextFilter'; ofType: null; }; defaultValue: null }, { name: 'email'; type: { kind: 'INPUT_OBJECT'; name: 'TextFilter'; ofType: null; }; defaultValue: null }, { name: 'emailVerified'; type: { kind: 'INPUT_OBJECT'; name: 'BooleanFilter'; ofType: null; }; defaultValue: null }, { name: 'website'; type: { kind: 'INPUT_OBJECT'; name: 'NullableTextFilter'; ofType: null; }; defaultValue: null }, { name: 'hidden'; type: { kind: 'INPUT_OBJECT'; name: 'BooleanFilter'; ofType: null; }; defaultValue: null }, { name: 'createdAt'; type: { kind: 'INPUT_OBJECT'; name: 'DateTimeFilter'; ofType: null; }; defaultValue: null }, { name: 'updatedAt'; type: { kind: 'INPUT_OBJECT'; name: 'DateTimeFilter'; ofType: null; }; defaultValue: null }, { name: 'or'; type: { kind: 'LIST'; name: never; ofType: { kind: 'NON_NULL'; name: never; ofType: { kind: 'INPUT_OBJECT'; name: 'UserFilter'; ofType: null; }; }; }; defaultValue: null }]; };
-    'UserGroupsFilter': { kind: 'INPUT_OBJECT'; name: 'UserGroupsFilter'; isOneOf: false; inputFields: [{ name: 'uuid'; type: { kind: 'INPUT_OBJECT'; name: 'UuidFilter'; ofType: null; }; defaultValue: null }, { name: 'id'; type: { kind: 'INPUT_OBJECT'; name: 'TextFilter'; ofType: null; }; defaultValue: null }, { name: 'name'; type: { kind: 'INPUT_OBJECT'; name: 'TextFilter'; ofType: null; }; defaultValue: null }, { name: 'type'; type: { kind: 'INPUT_OBJECT'; name: 'GroupTypeFilter'; ofType: null; }; defaultValue: null }, { name: 'active'; type: { kind: 'INPUT_OBJECT'; name: 'BooleanFilter'; ofType: null; }; defaultValue: null }, { name: 'hidden'; type: { kind: 'INPUT_OBJECT'; name: 'BooleanFilter'; ofType: null; }; defaultValue: null }]; };
-    'UserId': { kind: 'INPUT_OBJECT'; name: 'UserId'; isOneOf: false; inputFields: [{ name: 'uuid'; type: { kind: 'SCALAR'; name: 'UUID'; ofType: null; }; defaultValue: null }, { name: 'id'; type: { kind: 'SCALAR'; name: 'SmolStr'; ofType: null; }; defaultValue: null }, { name: 'personalEmail'; type: { kind: 'SCALAR'; name: 'String'; ofType: null; }; defaultValue: null }, { name: 'urn'; type: { kind: 'SCALAR'; name: 'Urn'; ofType: null; }; defaultValue: null }]; };
-    'UuidFilter': { kind: 'INPUT_OBJECT'; name: 'UuidFilter'; isOneOf: false; inputFields: [{ name: 'isIn'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'LIST'; name: never; ofType: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'UUID'; ofType: null; }; }; }; }; defaultValue: null }]; };
-};
-
-/** An IntrospectionQuery representation of your schema.
- *
- * @remarks
- * This is an introspection of your schema saved as a file by GraphQLSP.
- * It will automatically be used by `gql.tada` to infer the types of your GraphQL documents.
- * If you need to reuse this data or update your `scalars`, update `tadaOutputLocation` to
- * instead save to a .ts instead of a .d.ts file.
- */
-export type introspection = {
-	name: never;
-	query: 'Query';
-	mutation: 'Mutation';
-	subscription: never;
-	types: introspection_types;
-};
-
-import * as gqlTada from 'gql.tada';
-
-declare module 'gql.tada' {
-	interface setupSchema {
-		introspection: introspection;
-	}
-}
diff --git a/src/lib/graphql/schema.gql b/src/lib/graphql/schema.gql
index e5981e2c2c1761e68f0485f2fd2e0f0464393c3f..f4ff494fd70623d284bcaa851d3fb9158b00c888 100644
--- a/src/lib/graphql/schema.gql
+++ b/src/lib/graphql/schema.gql
@@ -17,199 +17,15 @@ Indicates that an Input Object is a OneOf Input Object (and thus requires
 """
 directive @oneOf on INPUT_OBJECT
 
-union Account = User | Group
-
-input AccountId {
-	uuid: UUID
-	id: SmolStr
-}
-
-type Address {
-	"""
-	# **ADMIN ONLY**
-	## UUID interne de l'adresse
-
-	Par exemple, `72c612f8-1d07-432e-8f71-60584be51f40`
-	"""
-	accountUuid: UUID!
-
-	"""
-	## Nom de l'adresse
-	Le nom usuel de l'adresse s'il existe. Limite de **64** caractères.
-
-	Par exemple, `Pyroloc` ou `Résidence "Les Estudines du Parc"`.
-	"""
-	name: String
-
-	"""
-	## Adresse postale complète de l'adresse
-	Formatée pour être affichée ou utilisée sur une étiquette d'envoi.
-	Ce champ PEUT contenir plusieurs lignes, séparées par des retours à la ligne.
-	Les nouvelles lignes peuvent être représentées soit par une paire retour
-	chariot/saut de ligne ("\r\n"), soit par un seul caractère de saut de ligne ("\n").
-	"""
-	formatted: String!
-
-	"""
-	## Rue de l'adresse
-	Composante complète de l'adresse de la rue, qui PEUT inclure le numéro de la maison,
-	le nom de la rue, la boîte postale et des informations sur plusieurs lignes concernant
-	l'adresse de la rue. Ce champ PEUT contenir plusieurs lignes, séparées par des retours
-	à la ligne. Les nouvelles lignes peuvent être représentées soit par une paire retour
-	chariot/saut de ligne ("\r\n"), soit par un seul caractère de saut de ligne ("\n").
-	"""
-	streetAddress: String!
-
-	"""
-	## Ville ou localité de l'adresse
-	"""
-	locality: String!
-
-	"""
-	## Région de l'adresse
-	Province, de la préfecture ou région.
-	"""
-	region: String
-
-	"""
-	## Code postal de l'adresse
-	"""
-	postalCode: String!
-
-	"""
-	## Pays de l'adresse
-	"""
-	country: String!
-}
-
-"""
-Base64 [RFC4648](https://www.rfc-editor.org/rfc/rfc4648)
-"""
-scalar Base64
-
-input BooleanFilter {
-	eq: Boolean!
-}
-
 type BuildInfo {
 	ref: String
 	sha: String
 }
 
-"""
-Rôles dans un group
-"""
-enum ClaimAccess {
-	"""
-	Aucun
-	"""
-	NONE
-
-	"""
-	Lecture
-	"""
-	READ
-
-	"""
-	Écriture
-	"""
-	WRITE
-
-	"""
-	Création
-	"""
-	CREATE
-
-	"""
-	Suppression
-	"""
-	DELETE
-}
-
-input CreateGroup {
-	id: Identifier!
-	name: String!
-	type: GroupType
-}
-
-input CreateToken {
-	id: String!
-	description: String!
-	globalAccess: ClaimAccess
-	allowedIps: [String!]
-	claims: [NewTokenClaim!]
-}
-
-input CreateTraining {
-	id: Identifier!
-	name: String!
-	fullName: String
-}
-
 input CreateUnixAccount {
 	vhost: String
 }
 
-input CreateUser {
-	password: Password
-	familyName: String!
-	givenName: String!
-	promotion: Int!
-	trainingId: Identifier!
-}
-
-"""
-Rôles dans un groupe
-"""
-enum CurrentGroupRole {
-	"""
-	Membre ordinaire
-	"""
-	MEMBER
-
-	"""
-	Administrateur·trice
-	"""
-	ADMIN
-
-	"""
-	Membre du bureau
-	"""
-	BOARD_MEMBER
-
-	"""
-	Président·e
-	"""
-	OWNER
-}
-
-"""
-ISO 8601 calendar date without timezone.
-Format: %Y-%m-%d
-
-# Examples
-
-* `1994-11-13`
-* `2000-02-24`
-"""
-scalar Date
-
-"""
-A datetime with timezone offset.
-
-The input is a string in RFC3339 format, e.g. "2022-01-12T04:00:19.12345Z"
-or "2022-01-12T04:00:19+03:00". The output is also a string in RFC3339
-format, but it is always normalized to the UTC (Z) offset, e.g.
-"2022-01-12T04:00:19.12345Z".
-"""
-scalar DateTime
-
-input DateTimeFilter {
-	gt: LocalDateTime
-	eq: [LocalDateTime!]
-	lt: LocalDateTime
-}
-
 enum FromNull {
 	NUMBER
 	STRING
@@ -218,1260 +34,70 @@ enum FromNull {
 	OBJECT
 }
 
-"""
-Genre d'une personne
-"""
-enum Gender {
-	"""
-	Masculin
-	"""
-	MALE
-
-	"""
-	Féminin
-	"""
-	FEMALE
-
-	"""
-	Non binaire
-	"""
-	NON_BINARY
-
-	"""
-	Inconnu
-	"""
-	UNKNOWN
-}
-
-input GenderFilter {
-	isIn: [Gender!]!
-}
-
-type GlobalValues {
-	schoolYear: Int!
-	evenSemester: Boolean!
-	integration: Boolean!
+input GroupId {
+	id: SmolStr
+	email: String
+	uuid: UUID
 }
 
-type Group {
-	"""
-	# **ADMIN ONLY**
-	## UUID interne du group
-
-	Par exemple, `72c612f8-1d07-432e-8f71-60584be51f40`
-	"""
-	uuid: UUID!
-
-	"""
-	## Identifiant du group
-	Le nom du group normalisé (sans accents, caractères spéciaux ni espaces).
-	Ne peut contenir que des caractères ASCII et éventuellement des tirets pour
-	remplacer les espaces.
-
-	Par exemple, `arise` ou `aeiie`.
-	"""
-	id: Identifier!
-
-	"""
-	## Nom du group
-	Le nom usuel du group, présenté sous forme d'acronyme ou sous forme longue.
-
-	Par exemple, `ARISE` ou `BdE`.
-	"""
-	name: String!
-
-	"""
-	## Description courte du group
-	64 caractères maximum, de quoi présenter le group succinctement.
-	"""
-	shortDescription: String
-
-	"""
-	## Description du group
-	Une description plus complète que `short_description`, sans limite de caractères.
-	"""
-	description: String
-
-	"""
-	## Adresse électronique préférée de l'utilisateur.
-	Sa valeur DOIT être conforme à la syntaxe addr-spec de la RFC 5322 [RFC5322].
-
-	Par exemple, `arise@iiens.net` ou `bde@iiens.net`.
-	"""
-	email: String!
-
-	"""
-	## URL du site perso du groupe
-	"""
-	website: Url
-
-	"""
-	## Type de groupe
-	Club, Association 1901, etc.
-	"""
-	type: GroupType!
-	unixAccount: UnixAccount
-
-	"""
-	## Date de la création du compte du group
-	Sa valeur est un string JSON [RFC3339] représentant le temps  entre 1970-01-01T0:0:0Z,
-	mesuré en UTC, et la date/heure.
-	"""
-	createdAt: DateTime!
-
-	"""
-	## Date de la dernière mise à jour des informations relatives au group
-	Sa valeur est un string JSON [RFC3339] représentant le temps  entre 1970-01-01T0:0:0Z,
-	mesuré en UTC, et la date/heure.
-	"""
-	updatedAt: DateTime!
-
-	"""
-	## URL de la page de profil du group
-	Page de profil sur [www.iiens.net].
-
-	Par exemple, `https://www.iiens.net/eleve/acier2020` ou `https://www.iiens.net/eleve/dupontj2042`
-	"""
-	profile: Url!
-
-	"""
-	## URL de la photo de profil du groupe
-	Cette URL fait référence à un fichier image (par exemple, un fichier image PNG,
-	JPEG ou GIF), plutôt qu'à une page Web contenant une image.
-
-	Par exemple, `https://api.iiens.net/picture/acier2020` ou `https://api.iiens.net/picture/dupontj2042`
-	"""
-	picture: Url!
-
-	"""
-	Hash de la photo de profil du groupe
-	"""
-	pictureThumbnailHash: Base64!
-
-	"""
-	## URL de la photo de profil du groupe
-	Cette URL fait référence à un fichier image (par exemple, un fichier image PNG,
-	JPEG ou GIF), plutôt qu'à une page Web contenant une image.
-
-	Par exemple, `https://api.iiens.net/picture/acier2020` ou `https://api.iiens.net/picture/dupontj2042`
-	"""
-	backgroundImage: Url!
-
-	"""
-	Hash de l'image d'arrière plan du groupe
-	"""
-	backgroundImageThumbnailHash: Base64!
-
-	"""
-	## Groupe actif
-	**VRAI** si le group est encore actif.
-	Se traduit par une déclaration lors d'une réunion publique de l'AEIIE s'il
-	s'agit d'un group BdE. Les listes candidates à l'élection BdE sont actives le
-	temps de la campagne.
-	"""
-	active: Boolean!
-
-	"""
-	# **ADMIN ONLY**
-	## Compte caché
-	Le compte du group sera invisible de toutes les requêtes, sauf admin si le filtre
-	de la requête le demande.
-	"""
-	hidden: Boolean!
+type Health {
+	db: String!
 }
 
-type GroupConnection {
-	"""
-	Information to aid in pagination.
-	"""
-	pageInfo: PageInfo!
-
-	"""
-	A list of edges.
-	"""
-	edges: [GroupEdge!]!
+scalar Identifier
 
-	"""
-	A list of nodes.
-	"""
-	nodes: [Group!]!
-	remainingCount: Int!
+type Mutation {
+	createGroupUnixAccount(group: GroupId!, account: CreateUnixAccount!): UnixAccount!
+	status: Int!
 }
 
 """
-An edge in a connection.
+Ensemble des requêtes possibles pour l'API Arise.
+Certaines peuvent être cachées, en fonction des permissions courantes.
 """
-type GroupEdge {
-	"""
-	The item at the end of the edge
-	"""
-	node: Group!
-	remainingCount: Int!
-
-	"""
-	A cursor for use in pagination
-	"""
-	cursor: String!
+type Query {
+	trainings: [Training!]!
+	buildInfo: BuildInfo!
+	health: Health!
 }
 
-input GroupFilter {
-	uuid: UuidFilter
-	name: TextFilter
-	type: GroupTypeFilter
-	shortDescription: NullableTextFilter
-	description: NullableTextFilter
-	active: BooleanFilter
-	accountUuid: UuidFilter
-	unixAccount: UnixAccountFilter
-	id: TextFilter
-	email: TextFilter
-	emailVerified: BooleanFilter
-	website: NullableTextFilter
-	hidden: BooleanFilter
-	createdAt: DateTimeFilter
-	updatedAt: DateTimeFilter
-	or: [GroupFilter!]
-}
+scalar SmolStr
 
-input GroupId {
-	id: SmolStr
-	email: String
-	uuid: UUID
+type Training {
+	uuid: UUID!
+	id: Identifier!
+	name: String!
+	fullName: String
 }
 
-type GroupOfMember {
-	group: Group!
-	role: CurrentGroupRole!
-	isOwner: Boolean!
-	isBoardMember: Boolean!
-	isAdmin: Boolean!
-	since: Date!
-}
+"""
+A UUID is a unique 128-bit number, stored as 16 octets. UUIDs are parsed as
+Strings within GraphQL. UUIDs are used to assign unique identifiers to
+entities without requiring a central allocating authority.
 
-input GroupOfMemberFilter {
-	role: CurrentGroupRole
-	since: NeverDateFilter
-	strictRole: Boolean! = false
-}
+# References
 
+* [Wikipedia: Universally Unique Identifier](http://en.wikipedia.org/wiki/Universally_unique_identifier)
+* [RFC4122: A Universally Unique IDentifier (UUID) URN Namespace](http://tools.ietf.org/html/rfc4122)
 """
-Rôles dans un groupe
-"""
-enum GroupRole {
-	"""
-	A quitté le groupe
-	"""
-	GONE
+scalar UUID
 
-	"""
-	Membre ordinaire
-	"""
-	MEMBER
+type UnixAccount {
+	accountUuid: UUID!
+	uid: Int!
+	vhost: String
 
 	"""
-	Administrateur·trice
-	"""
-	ADMIN
+	URL du site personnel de l'utilisateur
 
-	"""
-	Membre du bureau
-	"""
-	BOARD_MEMBER
+	Page "perso" de l'utilisateur hébergée sur les serveurs d'ARISE.
 
+	Par exemple, `https://acier.perso.iiens.net`
 	"""
-	Président·e
-	"""
-	OWNER
-}
-
-enum GroupType {
-	ASSOCIATION
-	CLUB
-	COMMISSION
-	LIST
-	HOME
-	OTHER
-	UNKNOWN
-}
-
-input GroupTypeFilter {
-	isIn: [GroupType!]!
-}
-
-type Health {
-	db: String!
-}
-
-type HistoricalGroupOfMember {
-	group: Group!
-	role: GroupRole!
-	since: Date!
-}
-
-input HistoricalGroupOfMemberFilter {
-	role: GroupRole
-	since: NeverDateFilter
-	strictRole: Boolean! = false
-}
-
-type HistoricalMemberOfGroup {
-	user: User!
-	role: GroupRole!
-	since: Date!
-}
-
-scalar Identifier
-
-input Int16Filter {
-	gt: Int
-	eq: [Int!]
-	lt: Int
-}
-
-input LevenshteinFilter {
-	value: String!
-	threshold: Int
-}
-
-"""
-A local datetime without timezone offset.
-
-The input/output is a string in ISO 8601 format without timezone, including
-subseconds. E.g. "2022-01-12T07:30:19.12345".
-"""
-scalar LocalDateTime
-
-type Mutation {
-	"""
-	Création d'un utilisateur
-	### Erreurs possibles
-	- `NOT_FOUND`: La formation n'existe pas.
-	- `ID_GENERATION_FAILURE`: L'identifiant de l'utilisateur n'a pas pu être généré.
-	"""
-	createUser(user: CreateUser!): User!
-
-	"""
-	Mise à jour d'un utilisateur
-	### Erreurs possibles
-	- `NOT_FOUND`: L'utilisateur ou la formation n'existe pas.
-	"""
-	updateUser(user: UserId!, update: UpdateUser!): User!
-
-	"""
-	Suppression d'un utilisateur
-	### Erreurs possibles
-	- `NOT_FOUND`: L'utilisateur n'existe pas.
-	"""
-	deleteUser(user: UserId!): Int!
-
-	"""
-	Création d'un groupe
-	"""
-	createGroup(group: CreateGroup!): Group!
-
-	"""
-	Mise à jour d'un groupe
-	### Erreurs possibles
-	- `NOT_FOUND`: Le groupe n'existe pas.
-	"""
-	updateGroup(group: GroupId!, update: UpdateGroup!): Group!
-
-	"""
-	Suppression d'un groupe
-	### Erreurs possibles
-	- `NOT_FOUND`: Le groupe n'existe pas.
-	"""
-	deleteGroup(group: GroupId!): Boolean!
-	addGroupMemberRole(user: UserId!, group: GroupId!, role: GroupRole!): HistoricalMemberOfGroup!
-	createToken(token: CreateToken!): PlainToken!
-	updateToken(token: TokenId!, update: UpdateToken!): Token!
-	regenerateToken(token: TokenId!): PlainToken!
-	deleteClaims(token: TokenId!, claims: [String!]): Token!
-	addClaims(token: TokenId!, claims: [NewTokenClaim!]!): Token!
-	copyClaims(srcToken: TokenId!, dstToken: TokenId!): Token!
-	deleteToken(token: TokenId!): Int!
-	createUserUnixAccount(user: UserId!, account: CreateUnixAccount!): UnixAccount!
-	createGroupUnixAccount(group: GroupId!, account: CreateUnixAccount!): UnixAccount!
-	updateUnixAccount(unixAccount: UnixAccountId!, update: UpdateUnixAccount!): UnixAccount!
-	createTraining(training: CreateTraining!): Training!
-	updateTraining(training: TrainingId!, update: UpdateTraining!): Training!
-	deleteTraining(training: TrainingId!): Int!
-	newYear: Int!
-	evenSemester: Boolean!
-	endOfIntegration: Boolean!
-	status: Int!
-}
-
-input NeverDateFilter {
-	gt: Date
-	eq: [Date!]
-	lt: Date
-}
-
-input NewTokenClaim {
-	claim: String!
-	access: ClaimAccess!
-}
-
-input NullableDateFilter {
-	null: Boolean
-	day: Int
-	month: Int
-	gt: Date
-	eq: [Date!]
-	lt: Date
-}
-
-input NullableDateTimeFilter {
-	null: Boolean
-	gt: LocalDateTime
-	eq: [LocalDateTime!]
-	lt: LocalDateTime
-}
-
-input NullableFilter {
-	null: Boolean
-}
-
-input NullableTextFilter {
-	null: Boolean
-	like: [String!]
-	notLike: [String!]
-	similar: [SimilarFilter!]
-	levenshtein: [LevenshteinFilter!]
-}
-
-enum OrderByGroup {
-	UUID
-	ID
-	NAME
-	CREATED_AT
-	UPDATED_AT
-}
-
-enum OrderByUser {
-	UUID
-	ID
-	GIVEN_NAME
-	FAMILY_NAME
-	NICKNAME
-	BIRTH_DATE
-	PROMOTION
-	YEAR
-	CREATED_AT
-	UPDATED_AT
-	LAST_USED_AT
-}
-
-"""
-Information about pagination in a connection
-"""
-type PageInfo {
-	"""
-	When paginating backwards, are there more items?
-	"""
-	hasPreviousPage: Boolean!
-
-	"""
-	When paginating forwards, are there more items?
-	"""
-	hasNextPage: Boolean!
-
-	"""
-	When paginating backwards, the cursor to continue.
-	"""
-	startCursor: String
-
-	"""
-	When paginating forwards, the cursor to continue.
-	"""
-	endCursor: String
-}
-
-input Password {
-	hash: String
-	plain: String
-}
-
-type PlainToken {
-	raw: String!
-	base64: String!
-}
-
-"""
-Ensemble des requêtes possibles pour l'API Arise.
-Certaines peuvent être cachées, en fonction des permissions courantes.
-"""
-type Query {
-	user(user: UserId!): User
-	users(
-		after: String
-		before: String
-		first: Int
-		last: Int
-		filter: UserFilter
-		orderBy: [OrderByUser!]! = []
-	): UserConnection!
-	group(group: GroupId!): Group
-	groups(
-		after: String
-		before: String
-		first: Int
-		last: Int
-		filter: GroupFilter
-		orderBy: [OrderByGroup!]! = []
-	): GroupConnection!
-	account(account: AccountId!): Account
-	oAuthAppOwner: Account!
-	currentToken: Token!
-	token(token: TokenId!): Token
-	tokens: [Token!]!
-	trainings: [Training!]!
-	buildInfo: BuildInfo!
-	health: Health!
-	globalsValues: GlobalValues!
-}
-
-input SimilarFilter {
-	value: String!
-	threshold: Float
-}
-
-scalar SmolStr
-
-input TextFilter {
-	like: [String!]
-	notLike: [String!]
-	similar: [SimilarFilter!]
-	levenshtein: [LevenshteinFilter!]
-}
-
-type Token {
-	"""
-	# **ADMIN ONLY**
-	## UUID interne du jeton
-
-	Par exemple, `72c612f8-1d07-432e-8f71-60584be51f40`
-	"""
-	uuid: UUID!
-
-	"""
-	# **ADMIN ONLY**
-	## Identifiant du jeton
-	"""
-	id: String!
-
-	"""
-	# **ADMIN ONLY**
-	## Description du jeton
-	"""
-	description: String!
-
-	"""
-	# **ADMIN ONLY**
-	## Hash du jeton
-	Standard actuel : BLAKE3
-
-	Par exemple, `$blake3$1ChQCR0BrfBO42AkRogZaw$+COVVpcK/ptUTSckqIdI/rFF1JdIkvk9V++z56kLNf4'`
-	"""
-	tokenHash: String!
-	globalAccess: ClaimAccess
-	allowedIps: [String!]!
-	claims: [TokenClaim!]!
-}
-
-type TokenClaim {
-	claim: String!
-	access: ClaimAccess!
-}
-
-input TokenId {
-	id: SmolStr
-	uuid: UUID
-	globalAccess: ClaimAccess
-}
-
-type Training {
-	uuid: UUID!
-	id: Identifier!
-	name: String!
-	fullName: String
-}
-
-input TrainingId {
-	id: SmolStr
-	uuid: UUID
-}
-
-"""
-A UUID is a unique 128-bit number, stored as 16 octets. UUIDs are parsed as
-Strings within GraphQL. UUIDs are used to assign unique identifiers to
-entities without requiring a central allocating authority.
-
-# References
-
-* [Wikipedia: Universally Unique Identifier](http://en.wikipedia.org/wiki/Universally_unique_identifier)
-* [RFC4122: A Universally Unique IDentifier (UUID) URN Namespace](http://tools.ietf.org/html/rfc4122)
-"""
-scalar UUID
-
-type UnixAccount {
-	accountUuid: UUID!
-	uid: Int!
-	vhost: String
-
-	"""
-	URL du site personnel de l'utilisateur
-
-	Page "perso" de l'utilisateur hébergée sur les serveurs d'ARISE.
-
-	Par exemple, `https://acier.perso.iiens.net`
-	"""
-	website: Url
-}
-
-input UnixAccountFilter {
-	null: Boolean
-	uuid: UuidFilter
-	uid: Int16Filter
-	vhost: TextFilter
-}
-
-input UnixAccountId {
-	uid: Int
-	uuid: UUID
-}
-
-input UpdateGroup {
-	name: String
-	type: GroupType
-	shortDescription: String
-	description: String
-	active: Boolean
-	id: Identifier
-	email: String
-	emailVerified: Boolean
-	website: Url
-	hidden: Boolean
-}
-
-input UpdateToken {
-	id: String
-	description: String
-	allowedIps: [String!]
-}
-
-input UpdateTraining {
-	name: String
-	fullName: String
-}
-
-input UpdateUnixAccount {
-	uid: Int
-	vhost: String
-}
-
-input UpdateUser {
-	password: Password
-	givenNameAtBirth: String
-	givenNameInUse: String
-	middleName: String
-	familyName: String
-	nickname: String
-	gender: Gender
-	birthdate: Date
-	zoneinfo: String
-	locale: String
-	schoolLogin: String
-	phoneNumber: String
-	phoneNumberVerified: Boolean
-	initialPromotion: Int
-	gapYear: Int
-	diplomaYearDuration: Int
-	trainingId: SmolStr
-	extendedTrialPeriod: Boolean
-	aeiieMember: Boolean
-	suspended: Boolean
-	public: Boolean
-	lastUsedAt: LocalDateTime
-	id: Identifier
-	email: String
-	emailVerified: Boolean
-	website: Url
-	hidden: Boolean
+	website: Url
 }
 
 """
 URL is a String implementing the [URL Standard](http://url.spec.whatwg.org/)
 """
 scalar Url
-
-scalar Urn
-
-type User {
-	"""
-	UUID du compte de l'utilisateur
-	"""
-	uuid: UUID!
-
-	"""
-	Identifiant de l'utilisateur
-
-	Plus communément appelé AriseID, il est composé de 8 caractères maximum formés du nom
-	et du prénom, et de 4 chiffre représentant l'année d'arrivée pour arriver à un identifiant unique.
-
-	Par exemple, `acier2020` ou `dupontj2042`.
-	"""
-	id: Identifier!
-
-	"""
-	Hash du mot de passe de l'utilisateur
-
-	Standard actuel : Argon2id
-
-	Par exemple, `$argon2id$v=19$m=19456,t=2,p=1$XMBjfqZtpEyVxZbGNjKPCg$krFvSFSL3XUr6736galD8YVmGgXpqNSc02VyLqFesPY'`
-	"""
-	passwordHash: String
-
-	"""
-	Nom complet de l'utilisateur
-
-	Présenté sous une forme affichable, avec toutes les parties du nom, **Y COMPRIS** le surnom.
-
-	Par exemple, `Jean "Foobar" Dupont` ou `Jean Dupont`
-	"""
-	name: String!
-
-	"""
-	Nom complet administratif de l'utilisateur
-
-	Présenté sous une forme affichable, avec toutes les parties du nom, **SAUF** le surnom.
-
-	Par exemple, `Jean Dupont`
-	"""
-	civilName: String!
-
-	"""
-	Prénom(s) de l'utilisateur
-
-	Notez que dans certaines cultures, les personnes peuvent avoir plusieurs prénoms ;
-	tous peuvent être présents, les noms étant séparés par des caractères d'espacement.
-
-	Par exemple, `Jean` ou `Pierre Jacques`
-	"""
-	givenName: String!
-
-	"""
-	Prénom(s) de naissance de l'utilisateur
-
-	Notez que dans certaines cultures, les personnes peuvent avoir plusieurs prénoms ;
-	tous peuvent être présents, les noms étant séparés par des caractères d'espacement.
-
-	Par exemple, `Jean` ou `Pierre Jacques`
-	"""
-	givenNameAtBirth: String!
-
-	"""
-	Prénom(s) d'usage de l'utilisateur
-
-	Notez que dans certaines cultures, les personnes peuvent avoir plusieurs prénoms ;
-	tous peuvent être présents, les noms étant séparés par des caractères d'espacement.
-
-	Par exemple, `Jeanne` ou `Pierre Jacques`
-	"""
-	givenNameInUse: String
-
-	"""
-	Deuxième(s) prénom(s) de l'utilisateur
-
-	Notez que dans certaines cultures, les personnes peuvent avoir plusieurs seconds prénoms ;
-	tous peuvent être présents, les noms étant séparés par des caractères d'espacement.
-	Notez également que dans certaines cultures, les seconds prénoms ne sont pas utilisés.
-
-	Par exemple, `Robert`
-	"""
-	middleName: String
-
-	"""
-	Prénoms de l'utilisateur
-
-	Tous les prénoms de l'utilisateur concaténés ensembles.
-
-	Par exemple, `Jean Pierre-Jacques` ou `Robert`
-	"""
-	forenames: String!
-
-	"""
-	Nom(s) de famille de l'utilisateur
-
-	Notez que dans certaines cultures, les personnes peuvent avoir plusieurs noms de famille ou
-	aucun nom de famille ; tous peuvent être présents, les noms étant séparés par des caractères d'espacement.
-
-	Par exemple, `Leroy`
-	"""
-	familyName: String!
-
-	"""
-	Surnom de l'utilisateur
-
-	Le surnom qu'a choisi l'utilisateur.
-
-	Par exemple, `Foobar` ou `Jean`
-	"""
-	nickname: String
-
-	"""
-	Pseudo préféré
-
-	Pseudo abrégé non unique par lequel l'utilisateur souhaite être désigné.
-
-	Surnom si renseigné par l'utilisateur, sinon nom civil par défaut.
-
-	Par exemple, `Foobar` ou `dupontj2042`
-	"""
-	preferredNickname: String!
-
-	"""
-	Nom d'utilisateur préféré
-
-	Nom abrégé non unique par lequel l'utilisateur souhaite être désigné.
-
-	Surnom si renseigné par l'utilisateur, sinon identifiant ARISE par défaut.
-
-	Par exemple, `Foobar` ou `dupontj2042`
-	"""
-	preferredUsername: String!
-
-	"""
-	Genre de l'utilisateur
-
-	Par défaut à `UNKNOWN`.
-	"""
-	gender: Gender!
-
-	"""
-	Date de naissance de l'utilisateur
-	"""
-	birthdate: Date
-
-	"""
-	URL de la page de profil de l'utilisateur
-
-	Page de profil sur [www.iiens.net](https://www.iiens.net).
-
-	Par exemple, `https://www.iiens.net/eleve/acier2020`
-	"""
-	profile: Url!
-
-	"""
-	URL de l'image de profil de l'utilisateur
-
-	Cette URL fait référence à un fichier image (par exemple, un fichier image PNG,
-	JPEG ou GIF), plutôt qu'à une page Web contenant une image.
-
-	Par exemple, `https://api.iiens.net/picture/acier2020`
-	"""
-	picture: Url!
-
-	"""
-	Hash de la photo de profil de l'utilisateur
-	"""
-	pictureThumbnailHash: Base64!
-
-	"""
-	URL de l'image d'arrière plan de l'utilisateur
-
-	Cette URL fait référence à un fichier image (par exemple, un fichier image PNG,
-	JPEG ou GIF), plutôt qu'à une page Web contenant une image.
-
-	Par exemple, `https://api.iiens.net/picture/acier2020`
-	"""
-	backgroundImage: Url!
-
-	"""
-	Hash de l'image d'arrière plan de l'utilisateur
-	"""
-	backgroundImageThumbnailHash: Base64!
-
-	"""
-	URL de la photo de trombinoscope de l'utilisateur
-
-	Cette URL fait référence à un fichier image (par exemple, un fichier image PNG,
-	JPEG ou GIF), plutôt qu'à une page Web contenant une image.
-
-	Par exemple, `https://api.iiens.net/rest/v0/photo/acier2020`
-	"""
-	photo: Url
-
-	"""
-	Hash de la photo de trombinoscope de l'utilisateur
-	"""
-	photoThumbnailHash: Base64
-
-	"""
-	URL du site Web ou du blog de l'utilisateur
-
-	Par exemple, `https://foo.com`
-	"""
-	website: Url
-
-	"""
-	Fuseau horaire
-
-	Chaîne de caractères provenant de la base de données des fuseaux horaires zoneinfo
-	[zoneinfo] représentant le fuseau horaire de l'utilisateur.
-
-	Par exemple, `Europe/Paris` ou `Amérique/Los_Angeles`.
-	"""
-	zoneinfo: String!
-
-	"""
-	Langue
-
-	Les paramètres régionaux de l'utilisateur, représentés par une balise de
-	langue BCP47 [RFC5646]. Il s'agit généralement d'un code de langue ISO 639-1
-	Alpha-2 [ISO639-1] en minuscules et d'un code de pays ISO 3166-1 Alpha-2
-	[ISO3166-1] en majuscules, séparés par un tiret.
-
-	Par exemple, `en-US` ou `fr-CA`.
-	"""
-	locale: String!
-
-	"""
-	Adresse électronique de l'utilisateur
-
-	Un alias de l'adresse électronique véritable de l'utilisateur.
-	À utiliser en priorité pour la création de comptes.
-
-	Par exemple, `acier2020.e2e01581919c@alias.iiens.net`.
-	"""
-	email: String!
-
-	"""
-	Adresse électronique réelle de l'utilisateur
-
-	Sa valeur DOIT être conforme à la syntaxe addr-spec de la RFC 5322 [RFC5322].
-
-	Par exemple, `foo.bar@ensiie.fr` ou `dupont.jean@gmail.com`.
-	"""
-	emailForwardAddress: String
-
-	"""
-	Adresse électronique de l'utilisateur vérifiée
-
-	Vrai si l'adresse électronique préférée de l'utilisateur a été vérifiée, sinon faux.
-	Lorsque cette valeur d'allégation est vraie, cela signifie qu'ARISE a pris des mesures
-	positives pour s'assurer que l'adresse électronique était contrôlée par l'utilisateur
-	au moment où la vérification a été effectuée.
-	"""
-	emailVerified: Boolean!
-
-	"""
-	Identifiant de connexion scolaire de l'utilisateur
-
-	Habituellement sous la forme `prenom.nom`
-	"""
-	schoolLogin: String!
-
-	"""
-	Adresse électronique scolaire de l'utilisateur
-
-	Sa valeur DOIT être conforme à la syntaxe addr-spec de la RFC 5322 [RFC5322].
-
-	Par exemple, `mael.acier@ensiie.eu` ou `dupont.jean@ensiie.eu`.
-	"""
-	schoolEmail: String!
-
-	"""
-	Numéro de téléphone de l'utilisateur
-
-	E.164 [E.164] est le format adopté pour ce champ.
-
-	Par exemple, `+14255551212` ou `+5626872400`.
-	"""
-	phoneNumber: String
-
-	"""
-	Numéro de téléphone de l'utilisateur vérifié
-
-	Vrai si le numéro de téléphone de l'utilisateur a été vérifié, sinon faux.
-	Lorsque cette valeur d'allégation est vraie, cela signifie qu'ARISE a pris
-	des mesures positives pour s'assurer que ce numéro de téléphone était contrôlé
-	par l'utilisateur final au moment où la vérification a été effectuée. Les moyens
-	par lesquels un numéro de téléphone est vérifié sont spécifiques au contexte
-	et dépendent du cadre de confiance ou des accords contractuels dans lesquels
-	les parties opèrent.
-	"""
-	phoneNumberVerified: Boolean!
-
-	"""
-	Adresse de l'utilisateur
-	"""
-	address: Address
-
-	"""
-	Promotion d'origine de l'utilisateur
-
-	La promotion présupposée de l'utilisateur au moment où il rentre à l'école.
-
-	Habituellement `année d'entrée + 3`
-	"""
-	initialPromotion: Int!
-
-	"""
-	Promotion effective de l'utilisateur
-
-	Promotion de l'utilisateur en tenant compte des redoublements et autres facteurs.
-	"""
-	promotion: Int!
-
-	"""
-	Années d'étude d'écart de l'utilisateur
-
-	Désigne des périodes de temps où un utilisateur prend une pause ou un écart par
-	rapport à la norme. Cela peut être causé par une année sabbatique, une année de
-	redoublement ou pour d'autres raisons.
-
-	Par défaut cette valeur est de 0.
-	"""
-	gapYear: Int!
-
-	"""
-	Années d'études requises jusqu'au diplôme
-
-	Par défaut cette valeur est de 03.
-	"""
-	diplomaYearDuration: Int!
-
-	"""
-	Année en cours de l'utilisateur
-
-	Compteur d'années en fonction de l'année de promotion effective.
-	Les redoublements sont pris en compte dans l'évaluation de cette valeur.
-
-	Par exemple, `1A`, `2A`, `3A` *(Le `A` n'est pas ajouté automatiquement)*
-	"""
-	year: Int!
-
-	"""
-	Semestre actuel de l'utilisateur
-
-	Compteur de semestres en fonction de l'année de promotion effective.
-	Les redoublements sont pris en compte dans l'évaluation de cette valeur.
-
-	Par exemple, `S1`, `S2`, `S3` *(Le `S` n'est pas ajouté automatiquement)*
-	"""
-	semester: Int!
-
-	"""
-	## Parcours
-
-	Par exemple, "FISE", "FISA"
-	"""
-	training: Training!
-
-	"""
-	Groupe de l'utilisateur
-	"""
-	group(id: GroupId!): GroupOfMember
-
-	"""
-	Groupes de l'utilisateur
-
-	Les rôles passés ne seront pas renvoyés dans cette requête.
-	Pour cela, se référer à `group_history.`
-	"""
-	groups(filter: GroupOfMemberFilter): [GroupOfMember!]!
-
-	"""
-	Historique des groupes de l'utilisateur
-
-	Cet historique retrace tous les rôles que l'utilisateur à pu prendre au
-	sein des groups de l'école.
-	"""
-	groupHistory(filter: HistoricalGroupOfMemberFilter): [HistoricalGroupOfMember!]!
-
-	"""
-	Groupe courant de l'utilisateur
-
-	Retourne le propriétaire de l'application si ce dernier est un groupe.
-
-	Les rôles passés ne seront pas renvoyés dans cette requête.
-	Pour cela, se référer à `current_group_history.`
-	"""
-	oAuthGroup: GroupOfMember
-
-	"""
-	Adhérent de l'AEIIE
-
-	**VRAI** si l'utilisateur est membre de l'AEIIE. **FAUX** à la création du compte.
-	"""
-	aeiieMember: Boolean!
-
-	"""
-	Nombre de jours restants sur la période d'essai de l'utilisateur
-
-	**42** lors de la création du compte.
-	"""
-	trialPeriodDaysLeft: Int!
-
-	"""
-	Période d'essai étendue de l'utilisateur
-
-	**FAUX** lors de la création du compte.
-
-	Cette variable permet d'outrepasser le champ `restricted_access`.
-	"""
-	extendedTrialPeriod: Boolean!
-
-	"""
-	Accès restreint aux services d'ARISE
-
-	**VRAI** si la période d'essai est arrivée à terme (42 jours) et que l'utilisateur n'est pas
-	membre d'ARISE **ET** de l'AEIIE.
-	"""
-	restrictedAccess: Boolean!
-
-	"""
-	Compte caché
-
-	Le compte utilisateur sera invisible de toutes les requêtes, sauf admin si le filtre
-	de la requête le demande.
-	"""
-	hidden: Boolean!
-
-	"""
-	Compte suspendu
-
-	Le compte utilisateur ne sera plus utilisable pour se connecter aux services d'ARISE.
-	"""
-	suspended: Boolean!
-
-	"""
-	Compte UNIX
-	"""
-	unixAccount: UnixAccount
-
-	"""
-	Date de la création du compte de l'utilisateur
-
-	Sa valeur est un string JSON [RFC3339] représentant le temps  entre 1970-01-01T0:0:0Z,
-	mesuré en UTC, et la date/heure.
-	"""
-	createdAt: DateTime!
-
-	"""
-	Date de la dernière mise à jour des informations relatives à l'utilisateur
-
-	Sa valeur est un string JSON [RFC3339] représentant le temps entre 1970-01-01T0:0:0Z,
-	mesuré en UTC, et la date/heure.
-	"""
-	updatedAt: DateTime!
-
-	"""
-	Date de la dernière activité via l'API de l'utilisateur
-
-	Sa valeur est un string JSON [RFC3339] représentant le temps entre 1970-01-01T0:0:0Z,
-	mesuré en UTC, et la date/heure.
-	"""
-	lastUsedAt: DateTime
-}
-
-type UserConnection {
-	"""
-	Information to aid in pagination.
-	"""
-	pageInfo: PageInfo!
-
-	"""
-	A list of edges.
-	"""
-	edges: [UserEdge!]!
-
-	"""
-	A list of nodes.
-	"""
-	nodes: [User!]!
-	remainingCount: Int!
-}
-
-"""
-An edge in a connection.
-"""
-type UserEdge {
-	"""
-	The item at the end of the edge
-	"""
-	node: User!
-	remainingCount: Int!
-
-	"""
-	A cursor for use in pagination
-	"""
-	cursor: String!
-}
-
-input UserFilter {
-	uuid: UuidFilter
-	givenName: TextFilter
-	givenNameInUse: NullableTextFilter
-	givenNameAtBirth: TextFilter
-	middleName: NullableTextFilter
-	familyName: TextFilter
-	nickname: NullableTextFilter
-	gender: GenderFilter
-	birthdate: NullableDateFilter
-	zoneinfo: TextFilter
-	locale: TextFilter
-	pictureThumbnailHash: NullableFilter
-	backgroundThumbnailHash: NullableFilter
-	photoThumbnailHash: NullableFilter
-	phoneNumber: NullableTextFilter
-	phoneNumberVerified: BooleanFilter
-	schoolLogin: TextFilter
-	promotion: Int16Filter
-	initialPromotion: Int16Filter
-	gapYear: Int16Filter
-	year: Int16Filter
-	diplomaYearDuration: Int16Filter
-	semester: Int16Filter
-	training: TextFilter
-	aeiieMember: BooleanFilter
-	trialPeriodDaysLeft: Int16Filter
-	extendedTrialPeriod: BooleanFilter
-	restrictedAccess: BooleanFilter
-	suspended: BooleanFilter
-	public: BooleanFilter
-	lastUsedAt: NullableDateTimeFilter
-	groups: UserGroupsFilter
-	accountUuid: UuidFilter
-	unixAccount: UnixAccountFilter
-	id: TextFilter
-	email: TextFilter
-	emailVerified: BooleanFilter
-	website: NullableTextFilter
-	hidden: BooleanFilter
-	createdAt: DateTimeFilter
-	updatedAt: DateTimeFilter
-	or: [UserFilter!]
-}
-
-input UserGroupsFilter {
-	uuid: UuidFilter
-	id: TextFilter
-	name: TextFilter
-	type: GroupTypeFilter
-	active: BooleanFilter
-	hidden: BooleanFilter
-}
-
-input UserId {
-	uuid: UUID
-	id: SmolStr
-	personalEmail: String
-	urn: Urn
-}
-
-input UuidFilter {
-	isIn: [UUID!]!
-}
diff --git a/tsconfig.json b/tsconfig.json
index 431cb8bf2cca9092a5cbc75f3adebce0330f314c..1557f79d8ae96bf4c4fd9b8c22678e866144f368 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -14,7 +14,7 @@
 			{
 				"name": "gql.tada/ts-plugin",
 				"schema": "./src/lib/graphql/schema.gql",
-				"tadaOutputLocation": "./src/graphql-env.d.ts"
+				"tadaOutputLocation": "./src/graphql.d.ts"
 			}
 		]
 	}