Răsfoiți Sursa

backend running apollo server

Tomi Cvetic 5 ani în urmă
părinte
comite
b6ce1e94ea

+ 1 - 0
.gitignore

@@ -17,6 +17,7 @@ gql/index.tsx
 
 # production
 build
+dist
 
 # misc
 .DS_Store

+ 5 - 0
backend/.vscode/settings.json

@@ -0,0 +1,5 @@
+{
+    "prettier.jsxSingleQuote": true,
+    "prettier.semi": false,
+    "prettier.singleQuote": true
+}

+ 1 - 1
backend/Dockerfile

@@ -8,4 +8,4 @@ COPY package.json /app/package.json
 
 RUN npm install --silent
 
-CMD ["npm", "run", "dev"]
+CMD ["npm", "run", "start"]

+ 6 - 0
backend/babel.config.js

@@ -0,0 +1,6 @@
+module.exports = {
+  presets: [
+    // ['@babel/preset-env', { targets: { node: 'current' } }],
+    '@babel/preset-typescript'
+  ]
+}

+ 12 - 0
backend/codegen.yml

@@ -0,0 +1,12 @@
+overwrite: true
+schema:
+  - schema.graphql
+
+#documents: '/src/**/*.graphql'
+generates:
+  ./src/types.d.ts:
+    config:
+      - skipTypename: true
+
+    plugins:
+      - typescript

+ 4413 - 0
backend/database/generated/prisma-client/index.ts

@@ -0,0 +1,4413 @@
+// Code generated by Prisma (prisma@1.34.10). DO NOT EDIT.
+// Please don't change this file manually but run `prisma generate` to update it.
+// For more information, please read the docs: https://www.prisma.io/docs/prisma-client/
+
+import { DocumentNode } from "graphql";
+import {
+  makePrismaClientClass,
+  BaseClientOptions,
+  Model
+} from "prisma-client-lib";
+import { typeDefs } from "./prisma-schema";
+
+export type AtLeastOne<T, U = { [K in keyof T]: Pick<T, K> }> = Partial<T> &
+  U[keyof U];
+
+export type Maybe<T> = T | undefined | null;
+
+export interface Exists {
+  block: (where?: BlockWhereInput) => Promise<boolean>;
+  comment: (where?: CommentWhereInput) => Promise<boolean>;
+  exercise: (where?: ExerciseWhereInput) => Promise<boolean>;
+  exerciseInstance: (where?: ExerciseInstanceWhereInput) => Promise<boolean>;
+  format: (where?: FormatWhereInput) => Promise<boolean>;
+  rating: (where?: RatingWhereInput) => Promise<boolean>;
+  track: (where?: TrackWhereInput) => Promise<boolean>;
+  training: (where?: TrainingWhereInput) => Promise<boolean>;
+  trainingType: (where?: TrainingTypeWhereInput) => Promise<boolean>;
+  user: (where?: UserWhereInput) => Promise<boolean>;
+}
+
+export interface Node {}
+
+export type FragmentableArray<T> = Promise<Array<T>> & Fragmentable;
+
+export interface Fragmentable {
+  $fragment<T>(fragment: string | DocumentNode): Promise<T>;
+}
+
+export interface Prisma {
+  $exists: Exists;
+  $graphql: <T = any>(
+    query: string,
+    variables?: { [key: string]: any }
+  ) => Promise<T>;
+
+  /**
+   * Queries
+   */
+
+  block: (where: BlockWhereUniqueInput) => BlockNullablePromise;
+  blocks: (args?: {
+    where?: BlockWhereInput;
+    orderBy?: BlockOrderByInput;
+    skip?: Int;
+    after?: String;
+    before?: String;
+    first?: Int;
+    last?: Int;
+  }) => FragmentableArray<Block>;
+  blocksConnection: (args?: {
+    where?: BlockWhereInput;
+    orderBy?: BlockOrderByInput;
+    skip?: Int;
+    after?: String;
+    before?: String;
+    first?: Int;
+    last?: Int;
+  }) => BlockConnectionPromise;
+  comment: (where: CommentWhereUniqueInput) => CommentNullablePromise;
+  comments: (args?: {
+    where?: CommentWhereInput;
+    orderBy?: CommentOrderByInput;
+    skip?: Int;
+    after?: String;
+    before?: String;
+    first?: Int;
+    last?: Int;
+  }) => FragmentableArray<Comment>;
+  commentsConnection: (args?: {
+    where?: CommentWhereInput;
+    orderBy?: CommentOrderByInput;
+    skip?: Int;
+    after?: String;
+    before?: String;
+    first?: Int;
+    last?: Int;
+  }) => CommentConnectionPromise;
+  exercise: (where: ExerciseWhereUniqueInput) => ExerciseNullablePromise;
+  exercises: (args?: {
+    where?: ExerciseWhereInput;
+    orderBy?: ExerciseOrderByInput;
+    skip?: Int;
+    after?: String;
+    before?: String;
+    first?: Int;
+    last?: Int;
+  }) => FragmentableArray<Exercise>;
+  exercisesConnection: (args?: {
+    where?: ExerciseWhereInput;
+    orderBy?: ExerciseOrderByInput;
+    skip?: Int;
+    after?: String;
+    before?: String;
+    first?: Int;
+    last?: Int;
+  }) => ExerciseConnectionPromise;
+  exerciseInstance: (
+    where: ExerciseInstanceWhereUniqueInput
+  ) => ExerciseInstanceNullablePromise;
+  exerciseInstances: (args?: {
+    where?: ExerciseInstanceWhereInput;
+    orderBy?: ExerciseInstanceOrderByInput;
+    skip?: Int;
+    after?: String;
+    before?: String;
+    first?: Int;
+    last?: Int;
+  }) => FragmentableArray<ExerciseInstance>;
+  exerciseInstancesConnection: (args?: {
+    where?: ExerciseInstanceWhereInput;
+    orderBy?: ExerciseInstanceOrderByInput;
+    skip?: Int;
+    after?: String;
+    before?: String;
+    first?: Int;
+    last?: Int;
+  }) => ExerciseInstanceConnectionPromise;
+  format: (where: FormatWhereUniqueInput) => FormatNullablePromise;
+  formats: (args?: {
+    where?: FormatWhereInput;
+    orderBy?: FormatOrderByInput;
+    skip?: Int;
+    after?: String;
+    before?: String;
+    first?: Int;
+    last?: Int;
+  }) => FragmentableArray<Format>;
+  formatsConnection: (args?: {
+    where?: FormatWhereInput;
+    orderBy?: FormatOrderByInput;
+    skip?: Int;
+    after?: String;
+    before?: String;
+    first?: Int;
+    last?: Int;
+  }) => FormatConnectionPromise;
+  rating: (where: RatingWhereUniqueInput) => RatingNullablePromise;
+  ratings: (args?: {
+    where?: RatingWhereInput;
+    orderBy?: RatingOrderByInput;
+    skip?: Int;
+    after?: String;
+    before?: String;
+    first?: Int;
+    last?: Int;
+  }) => FragmentableArray<Rating>;
+  ratingsConnection: (args?: {
+    where?: RatingWhereInput;
+    orderBy?: RatingOrderByInput;
+    skip?: Int;
+    after?: String;
+    before?: String;
+    first?: Int;
+    last?: Int;
+  }) => RatingConnectionPromise;
+  track: (where: TrackWhereUniqueInput) => TrackNullablePromise;
+  tracks: (args?: {
+    where?: TrackWhereInput;
+    orderBy?: TrackOrderByInput;
+    skip?: Int;
+    after?: String;
+    before?: String;
+    first?: Int;
+    last?: Int;
+  }) => FragmentableArray<Track>;
+  tracksConnection: (args?: {
+    where?: TrackWhereInput;
+    orderBy?: TrackOrderByInput;
+    skip?: Int;
+    after?: String;
+    before?: String;
+    first?: Int;
+    last?: Int;
+  }) => TrackConnectionPromise;
+  training: (where: TrainingWhereUniqueInput) => TrainingNullablePromise;
+  trainings: (args?: {
+    where?: TrainingWhereInput;
+    orderBy?: TrainingOrderByInput;
+    skip?: Int;
+    after?: String;
+    before?: String;
+    first?: Int;
+    last?: Int;
+  }) => FragmentableArray<Training>;
+  trainingsConnection: (args?: {
+    where?: TrainingWhereInput;
+    orderBy?: TrainingOrderByInput;
+    skip?: Int;
+    after?: String;
+    before?: String;
+    first?: Int;
+    last?: Int;
+  }) => TrainingConnectionPromise;
+  trainingType: (
+    where: TrainingTypeWhereUniqueInput
+  ) => TrainingTypeNullablePromise;
+  trainingTypes: (args?: {
+    where?: TrainingTypeWhereInput;
+    orderBy?: TrainingTypeOrderByInput;
+    skip?: Int;
+    after?: String;
+    before?: String;
+    first?: Int;
+    last?: Int;
+  }) => FragmentableArray<TrainingType>;
+  trainingTypesConnection: (args?: {
+    where?: TrainingTypeWhereInput;
+    orderBy?: TrainingTypeOrderByInput;
+    skip?: Int;
+    after?: String;
+    before?: String;
+    first?: Int;
+    last?: Int;
+  }) => TrainingTypeConnectionPromise;
+  user: (where: UserWhereUniqueInput) => UserNullablePromise;
+  users: (args?: {
+    where?: UserWhereInput;
+    orderBy?: UserOrderByInput;
+    skip?: Int;
+    after?: String;
+    before?: String;
+    first?: Int;
+    last?: Int;
+  }) => FragmentableArray<User>;
+  usersConnection: (args?: {
+    where?: UserWhereInput;
+    orderBy?: UserOrderByInput;
+    skip?: Int;
+    after?: String;
+    before?: String;
+    first?: Int;
+    last?: Int;
+  }) => UserConnectionPromise;
+  node: (args: { id: ID_Output }) => Node;
+
+  /**
+   * Mutations
+   */
+
+  createBlock: (data: BlockCreateInput) => BlockPromise;
+  updateBlock: (args: {
+    data: BlockUpdateInput;
+    where: BlockWhereUniqueInput;
+  }) => BlockPromise;
+  updateManyBlocks: (args: {
+    data: BlockUpdateManyMutationInput;
+    where?: BlockWhereInput;
+  }) => BatchPayloadPromise;
+  upsertBlock: (args: {
+    where: BlockWhereUniqueInput;
+    create: BlockCreateInput;
+    update: BlockUpdateInput;
+  }) => BlockPromise;
+  deleteBlock: (where: BlockWhereUniqueInput) => BlockPromise;
+  deleteManyBlocks: (where?: BlockWhereInput) => BatchPayloadPromise;
+  createComment: (data: CommentCreateInput) => CommentPromise;
+  updateComment: (args: {
+    data: CommentUpdateInput;
+    where: CommentWhereUniqueInput;
+  }) => CommentPromise;
+  updateManyComments: (args: {
+    data: CommentUpdateManyMutationInput;
+    where?: CommentWhereInput;
+  }) => BatchPayloadPromise;
+  upsertComment: (args: {
+    where: CommentWhereUniqueInput;
+    create: CommentCreateInput;
+    update: CommentUpdateInput;
+  }) => CommentPromise;
+  deleteComment: (where: CommentWhereUniqueInput) => CommentPromise;
+  deleteManyComments: (where?: CommentWhereInput) => BatchPayloadPromise;
+  createExercise: (data: ExerciseCreateInput) => ExercisePromise;
+  updateExercise: (args: {
+    data: ExerciseUpdateInput;
+    where: ExerciseWhereUniqueInput;
+  }) => ExercisePromise;
+  updateManyExercises: (args: {
+    data: ExerciseUpdateManyMutationInput;
+    where?: ExerciseWhereInput;
+  }) => BatchPayloadPromise;
+  upsertExercise: (args: {
+    where: ExerciseWhereUniqueInput;
+    create: ExerciseCreateInput;
+    update: ExerciseUpdateInput;
+  }) => ExercisePromise;
+  deleteExercise: (where: ExerciseWhereUniqueInput) => ExercisePromise;
+  deleteManyExercises: (where?: ExerciseWhereInput) => BatchPayloadPromise;
+  createExerciseInstance: (
+    data: ExerciseInstanceCreateInput
+  ) => ExerciseInstancePromise;
+  updateExerciseInstance: (args: {
+    data: ExerciseInstanceUpdateInput;
+    where: ExerciseInstanceWhereUniqueInput;
+  }) => ExerciseInstancePromise;
+  updateManyExerciseInstances: (args: {
+    data: ExerciseInstanceUpdateManyMutationInput;
+    where?: ExerciseInstanceWhereInput;
+  }) => BatchPayloadPromise;
+  upsertExerciseInstance: (args: {
+    where: ExerciseInstanceWhereUniqueInput;
+    create: ExerciseInstanceCreateInput;
+    update: ExerciseInstanceUpdateInput;
+  }) => ExerciseInstancePromise;
+  deleteExerciseInstance: (
+    where: ExerciseInstanceWhereUniqueInput
+  ) => ExerciseInstancePromise;
+  deleteManyExerciseInstances: (
+    where?: ExerciseInstanceWhereInput
+  ) => BatchPayloadPromise;
+  createFormat: (data: FormatCreateInput) => FormatPromise;
+  updateFormat: (args: {
+    data: FormatUpdateInput;
+    where: FormatWhereUniqueInput;
+  }) => FormatPromise;
+  updateManyFormats: (args: {
+    data: FormatUpdateManyMutationInput;
+    where?: FormatWhereInput;
+  }) => BatchPayloadPromise;
+  upsertFormat: (args: {
+    where: FormatWhereUniqueInput;
+    create: FormatCreateInput;
+    update: FormatUpdateInput;
+  }) => FormatPromise;
+  deleteFormat: (where: FormatWhereUniqueInput) => FormatPromise;
+  deleteManyFormats: (where?: FormatWhereInput) => BatchPayloadPromise;
+  createRating: (data: RatingCreateInput) => RatingPromise;
+  updateRating: (args: {
+    data: RatingUpdateInput;
+    where: RatingWhereUniqueInput;
+  }) => RatingPromise;
+  updateManyRatings: (args: {
+    data: RatingUpdateManyMutationInput;
+    where?: RatingWhereInput;
+  }) => BatchPayloadPromise;
+  upsertRating: (args: {
+    where: RatingWhereUniqueInput;
+    create: RatingCreateInput;
+    update: RatingUpdateInput;
+  }) => RatingPromise;
+  deleteRating: (where: RatingWhereUniqueInput) => RatingPromise;
+  deleteManyRatings: (where?: RatingWhereInput) => BatchPayloadPromise;
+  createTrack: (data: TrackCreateInput) => TrackPromise;
+  updateTrack: (args: {
+    data: TrackUpdateInput;
+    where: TrackWhereUniqueInput;
+  }) => TrackPromise;
+  updateManyTracks: (args: {
+    data: TrackUpdateManyMutationInput;
+    where?: TrackWhereInput;
+  }) => BatchPayloadPromise;
+  upsertTrack: (args: {
+    where: TrackWhereUniqueInput;
+    create: TrackCreateInput;
+    update: TrackUpdateInput;
+  }) => TrackPromise;
+  deleteTrack: (where: TrackWhereUniqueInput) => TrackPromise;
+  deleteManyTracks: (where?: TrackWhereInput) => BatchPayloadPromise;
+  createTraining: (data: TrainingCreateInput) => TrainingPromise;
+  updateTraining: (args: {
+    data: TrainingUpdateInput;
+    where: TrainingWhereUniqueInput;
+  }) => TrainingPromise;
+  updateManyTrainings: (args: {
+    data: TrainingUpdateManyMutationInput;
+    where?: TrainingWhereInput;
+  }) => BatchPayloadPromise;
+  upsertTraining: (args: {
+    where: TrainingWhereUniqueInput;
+    create: TrainingCreateInput;
+    update: TrainingUpdateInput;
+  }) => TrainingPromise;
+  deleteTraining: (where: TrainingWhereUniqueInput) => TrainingPromise;
+  deleteManyTrainings: (where?: TrainingWhereInput) => BatchPayloadPromise;
+  createTrainingType: (data: TrainingTypeCreateInput) => TrainingTypePromise;
+  updateTrainingType: (args: {
+    data: TrainingTypeUpdateInput;
+    where: TrainingTypeWhereUniqueInput;
+  }) => TrainingTypePromise;
+  updateManyTrainingTypes: (args: {
+    data: TrainingTypeUpdateManyMutationInput;
+    where?: TrainingTypeWhereInput;
+  }) => BatchPayloadPromise;
+  upsertTrainingType: (args: {
+    where: TrainingTypeWhereUniqueInput;
+    create: TrainingTypeCreateInput;
+    update: TrainingTypeUpdateInput;
+  }) => TrainingTypePromise;
+  deleteTrainingType: (
+    where: TrainingTypeWhereUniqueInput
+  ) => TrainingTypePromise;
+  deleteManyTrainingTypes: (
+    where?: TrainingTypeWhereInput
+  ) => BatchPayloadPromise;
+  createUser: (data: UserCreateInput) => UserPromise;
+  updateUser: (args: {
+    data: UserUpdateInput;
+    where: UserWhereUniqueInput;
+  }) => UserPromise;
+  updateManyUsers: (args: {
+    data: UserUpdateManyMutationInput;
+    where?: UserWhereInput;
+  }) => BatchPayloadPromise;
+  upsertUser: (args: {
+    where: UserWhereUniqueInput;
+    create: UserCreateInput;
+    update: UserUpdateInput;
+  }) => UserPromise;
+  deleteUser: (where: UserWhereUniqueInput) => UserPromise;
+  deleteManyUsers: (where?: UserWhereInput) => BatchPayloadPromise;
+
+  /**
+   * Subscriptions
+   */
+
+  $subscribe: Subscription;
+}
+
+export interface Subscription {
+  block: (
+    where?: BlockSubscriptionWhereInput
+  ) => BlockSubscriptionPayloadSubscription;
+  comment: (
+    where?: CommentSubscriptionWhereInput
+  ) => CommentSubscriptionPayloadSubscription;
+  exercise: (
+    where?: ExerciseSubscriptionWhereInput
+  ) => ExerciseSubscriptionPayloadSubscription;
+  exerciseInstance: (
+    where?: ExerciseInstanceSubscriptionWhereInput
+  ) => ExerciseInstanceSubscriptionPayloadSubscription;
+  format: (
+    where?: FormatSubscriptionWhereInput
+  ) => FormatSubscriptionPayloadSubscription;
+  rating: (
+    where?: RatingSubscriptionWhereInput
+  ) => RatingSubscriptionPayloadSubscription;
+  track: (
+    where?: TrackSubscriptionWhereInput
+  ) => TrackSubscriptionPayloadSubscription;
+  training: (
+    where?: TrainingSubscriptionWhereInput
+  ) => TrainingSubscriptionPayloadSubscription;
+  trainingType: (
+    where?: TrainingTypeSubscriptionWhereInput
+  ) => TrainingTypeSubscriptionPayloadSubscription;
+  user: (
+    where?: UserSubscriptionWhereInput
+  ) => UserSubscriptionPayloadSubscription;
+}
+
+export interface ClientConstructor<T> {
+  new (options?: BaseClientOptions): T;
+}
+
+/**
+ * Types
+ */
+
+export type TrackOrderByInput =
+  | "id_ASC"
+  | "id_DESC"
+  | "title_ASC"
+  | "title_DESC"
+  | "artist_ASC"
+  | "artist_DESC"
+  | "duration_ASC"
+  | "duration_DESC"
+  | "link_ASC"
+  | "link_DESC";
+
+export type BlockOrderByInput =
+  | "id_ASC"
+  | "id_DESC"
+  | "sequence_ASC"
+  | "sequence_DESC"
+  | "title_ASC"
+  | "title_DESC"
+  | "description_ASC"
+  | "description_DESC"
+  | "duration_ASC"
+  | "duration_DESC"
+  | "rounds_ASC"
+  | "rounds_DESC"
+  | "rest_ASC"
+  | "rest_DESC";
+
+export type ExerciseInstanceOrderByInput =
+  | "id_ASC"
+  | "id_DESC"
+  | "repetitions_ASC"
+  | "repetitions_DESC";
+
+export type CommentOrderByInput =
+  | "id_ASC"
+  | "id_DESC"
+  | "text_ASC"
+  | "text_DESC"
+  | "createdAt_ASC"
+  | "createdAt_DESC";
+
+export type RatingOrderByInput =
+  | "id_ASC"
+  | "id_DESC"
+  | "value_ASC"
+  | "value_DESC"
+  | "comment_ASC"
+  | "comment_DESC"
+  | "createdAt_ASC"
+  | "createdAt_DESC";
+
+export type Permission = "ADMIN" | "INSTRUCTOR";
+
+export type ExerciseOrderByInput =
+  | "id_ASC"
+  | "id_DESC"
+  | "name_ASC"
+  | "name_DESC"
+  | "description_ASC"
+  | "description_DESC"
+  | "video_ASC"
+  | "video_DESC";
+
+export type FormatOrderByInput =
+  | "id_ASC"
+  | "id_DESC"
+  | "name_ASC"
+  | "name_DESC"
+  | "description_ASC"
+  | "description_DESC";
+
+export type UserOrderByInput =
+  | "id_ASC"
+  | "id_DESC"
+  | "email_ASC"
+  | "email_DESC"
+  | "name_ASC"
+  | "name_DESC"
+  | "password_ASC"
+  | "password_DESC"
+  | "resetToken_ASC"
+  | "resetToken_DESC"
+  | "resetTokenExpiry_ASC"
+  | "resetTokenExpiry_DESC"
+  | "createdAt_ASC"
+  | "createdAt_DESC";
+
+export type TrainingOrderByInput =
+  | "id_ASC"
+  | "id_DESC"
+  | "title_ASC"
+  | "title_DESC"
+  | "createdAt_ASC"
+  | "createdAt_DESC"
+  | "trainingDate_ASC"
+  | "trainingDate_DESC"
+  | "location_ASC"
+  | "location_DESC"
+  | "attendance_ASC"
+  | "attendance_DESC"
+  | "published_ASC"
+  | "published_DESC";
+
+export type TrainingTypeOrderByInput =
+  | "id_ASC"
+  | "id_DESC"
+  | "name_ASC"
+  | "name_DESC"
+  | "description_ASC"
+  | "description_DESC";
+
+export type MutationType = "CREATED" | "UPDATED" | "DELETED";
+
+export type BlockWhereUniqueInput = AtLeastOne<{
+  id: Maybe<ID_Input>;
+}>;
+
+export interface TrackWhereInput {
+  id?: Maybe<ID_Input>;
+  id_not?: Maybe<ID_Input>;
+  id_in?: Maybe<ID_Input[] | ID_Input>;
+  id_not_in?: Maybe<ID_Input[] | ID_Input>;
+  id_lt?: Maybe<ID_Input>;
+  id_lte?: Maybe<ID_Input>;
+  id_gt?: Maybe<ID_Input>;
+  id_gte?: Maybe<ID_Input>;
+  id_contains?: Maybe<ID_Input>;
+  id_not_contains?: Maybe<ID_Input>;
+  id_starts_with?: Maybe<ID_Input>;
+  id_not_starts_with?: Maybe<ID_Input>;
+  id_ends_with?: Maybe<ID_Input>;
+  id_not_ends_with?: Maybe<ID_Input>;
+  title?: Maybe<String>;
+  title_not?: Maybe<String>;
+  title_in?: Maybe<String[] | String>;
+  title_not_in?: Maybe<String[] | String>;
+  title_lt?: Maybe<String>;
+  title_lte?: Maybe<String>;
+  title_gt?: Maybe<String>;
+  title_gte?: Maybe<String>;
+  title_contains?: Maybe<String>;
+  title_not_contains?: Maybe<String>;
+  title_starts_with?: Maybe<String>;
+  title_not_starts_with?: Maybe<String>;
+  title_ends_with?: Maybe<String>;
+  title_not_ends_with?: Maybe<String>;
+  artist?: Maybe<String>;
+  artist_not?: Maybe<String>;
+  artist_in?: Maybe<String[] | String>;
+  artist_not_in?: Maybe<String[] | String>;
+  artist_lt?: Maybe<String>;
+  artist_lte?: Maybe<String>;
+  artist_gt?: Maybe<String>;
+  artist_gte?: Maybe<String>;
+  artist_contains?: Maybe<String>;
+  artist_not_contains?: Maybe<String>;
+  artist_starts_with?: Maybe<String>;
+  artist_not_starts_with?: Maybe<String>;
+  artist_ends_with?: Maybe<String>;
+  artist_not_ends_with?: Maybe<String>;
+  duration?: Maybe<Int>;
+  duration_not?: Maybe<Int>;
+  duration_in?: Maybe<Int[] | Int>;
+  duration_not_in?: Maybe<Int[] | Int>;
+  duration_lt?: Maybe<Int>;
+  duration_lte?: Maybe<Int>;
+  duration_gt?: Maybe<Int>;
+  duration_gte?: Maybe<Int>;
+  link?: Maybe<String>;
+  link_not?: Maybe<String>;
+  link_in?: Maybe<String[] | String>;
+  link_not_in?: Maybe<String[] | String>;
+  link_lt?: Maybe<String>;
+  link_lte?: Maybe<String>;
+  link_gt?: Maybe<String>;
+  link_gte?: Maybe<String>;
+  link_contains?: Maybe<String>;
+  link_not_contains?: Maybe<String>;
+  link_starts_with?: Maybe<String>;
+  link_not_starts_with?: Maybe<String>;
+  link_ends_with?: Maybe<String>;
+  link_not_ends_with?: Maybe<String>;
+  AND?: Maybe<TrackWhereInput[] | TrackWhereInput>;
+  OR?: Maybe<TrackWhereInput[] | TrackWhereInput>;
+  NOT?: Maybe<TrackWhereInput[] | TrackWhereInput>;
+}
+
+export interface BlockWhereInput {
+  id?: Maybe<ID_Input>;
+  id_not?: Maybe<ID_Input>;
+  id_in?: Maybe<ID_Input[] | ID_Input>;
+  id_not_in?: Maybe<ID_Input[] | ID_Input>;
+  id_lt?: Maybe<ID_Input>;
+  id_lte?: Maybe<ID_Input>;
+  id_gt?: Maybe<ID_Input>;
+  id_gte?: Maybe<ID_Input>;
+  id_contains?: Maybe<ID_Input>;
+  id_not_contains?: Maybe<ID_Input>;
+  id_starts_with?: Maybe<ID_Input>;
+  id_not_starts_with?: Maybe<ID_Input>;
+  id_ends_with?: Maybe<ID_Input>;
+  id_not_ends_with?: Maybe<ID_Input>;
+  sequence?: Maybe<Int>;
+  sequence_not?: Maybe<Int>;
+  sequence_in?: Maybe<Int[] | Int>;
+  sequence_not_in?: Maybe<Int[] | Int>;
+  sequence_lt?: Maybe<Int>;
+  sequence_lte?: Maybe<Int>;
+  sequence_gt?: Maybe<Int>;
+  sequence_gte?: Maybe<Int>;
+  title?: Maybe<String>;
+  title_not?: Maybe<String>;
+  title_in?: Maybe<String[] | String>;
+  title_not_in?: Maybe<String[] | String>;
+  title_lt?: Maybe<String>;
+  title_lte?: Maybe<String>;
+  title_gt?: Maybe<String>;
+  title_gte?: Maybe<String>;
+  title_contains?: Maybe<String>;
+  title_not_contains?: Maybe<String>;
+  title_starts_with?: Maybe<String>;
+  title_not_starts_with?: Maybe<String>;
+  title_ends_with?: Maybe<String>;
+  title_not_ends_with?: Maybe<String>;
+  description?: Maybe<String>;
+  description_not?: Maybe<String>;
+  description_in?: Maybe<String[] | String>;
+  description_not_in?: Maybe<String[] | String>;
+  description_lt?: Maybe<String>;
+  description_lte?: Maybe<String>;
+  description_gt?: Maybe<String>;
+  description_gte?: Maybe<String>;
+  description_contains?: Maybe<String>;
+  description_not_contains?: Maybe<String>;
+  description_starts_with?: Maybe<String>;
+  description_not_starts_with?: Maybe<String>;
+  description_ends_with?: Maybe<String>;
+  description_not_ends_with?: Maybe<String>;
+  duration?: Maybe<Int>;
+  duration_not?: Maybe<Int>;
+  duration_in?: Maybe<Int[] | Int>;
+  duration_not_in?: Maybe<Int[] | Int>;
+  duration_lt?: Maybe<Int>;
+  duration_lte?: Maybe<Int>;
+  duration_gt?: Maybe<Int>;
+  duration_gte?: Maybe<Int>;
+  rounds?: Maybe<Int>;
+  rounds_not?: Maybe<Int>;
+  rounds_in?: Maybe<Int[] | Int>;
+  rounds_not_in?: Maybe<Int[] | Int>;
+  rounds_lt?: Maybe<Int>;
+  rounds_lte?: Maybe<Int>;
+  rounds_gt?: Maybe<Int>;
+  rounds_gte?: Maybe<Int>;
+  format?: Maybe<FormatWhereInput>;
+  rest?: Maybe<Int>;
+  rest_not?: Maybe<Int>;
+  rest_in?: Maybe<Int[] | Int>;
+  rest_not_in?: Maybe<Int[] | Int>;
+  rest_lt?: Maybe<Int>;
+  rest_lte?: Maybe<Int>;
+  rest_gt?: Maybe<Int>;
+  rest_gte?: Maybe<Int>;
+  tracks_every?: Maybe<TrackWhereInput>;
+  tracks_some?: Maybe<TrackWhereInput>;
+  tracks_none?: Maybe<TrackWhereInput>;
+  blocks_every?: Maybe<BlockWhereInput>;
+  blocks_some?: Maybe<BlockWhereInput>;
+  blocks_none?: Maybe<BlockWhereInput>;
+  exercises_every?: Maybe<ExerciseInstanceWhereInput>;
+  exercises_some?: Maybe<ExerciseInstanceWhereInput>;
+  exercises_none?: Maybe<ExerciseInstanceWhereInput>;
+  AND?: Maybe<BlockWhereInput[] | BlockWhereInput>;
+  OR?: Maybe<BlockWhereInput[] | BlockWhereInput>;
+  NOT?: Maybe<BlockWhereInput[] | BlockWhereInput>;
+}
+
+export interface FormatWhereInput {
+  id?: Maybe<ID_Input>;
+  id_not?: Maybe<ID_Input>;
+  id_in?: Maybe<ID_Input[] | ID_Input>;
+  id_not_in?: Maybe<ID_Input[] | ID_Input>;
+  id_lt?: Maybe<ID_Input>;
+  id_lte?: Maybe<ID_Input>;
+  id_gt?: Maybe<ID_Input>;
+  id_gte?: Maybe<ID_Input>;
+  id_contains?: Maybe<ID_Input>;
+  id_not_contains?: Maybe<ID_Input>;
+  id_starts_with?: Maybe<ID_Input>;
+  id_not_starts_with?: Maybe<ID_Input>;
+  id_ends_with?: Maybe<ID_Input>;
+  id_not_ends_with?: Maybe<ID_Input>;
+  name?: Maybe<String>;
+  name_not?: Maybe<String>;
+  name_in?: Maybe<String[] | String>;
+  name_not_in?: Maybe<String[] | String>;
+  name_lt?: Maybe<String>;
+  name_lte?: Maybe<String>;
+  name_gt?: Maybe<String>;
+  name_gte?: Maybe<String>;
+  name_contains?: Maybe<String>;
+  name_not_contains?: Maybe<String>;
+  name_starts_with?: Maybe<String>;
+  name_not_starts_with?: Maybe<String>;
+  name_ends_with?: Maybe<String>;
+  name_not_ends_with?: Maybe<String>;
+  description?: Maybe<String>;
+  description_not?: Maybe<String>;
+  description_in?: Maybe<String[] | String>;
+  description_not_in?: Maybe<String[] | String>;
+  description_lt?: Maybe<String>;
+  description_lte?: Maybe<String>;
+  description_gt?: Maybe<String>;
+  description_gte?: Maybe<String>;
+  description_contains?: Maybe<String>;
+  description_not_contains?: Maybe<String>;
+  description_starts_with?: Maybe<String>;
+  description_not_starts_with?: Maybe<String>;
+  description_ends_with?: Maybe<String>;
+  description_not_ends_with?: Maybe<String>;
+  AND?: Maybe<FormatWhereInput[] | FormatWhereInput>;
+  OR?: Maybe<FormatWhereInput[] | FormatWhereInput>;
+  NOT?: Maybe<FormatWhereInput[] | FormatWhereInput>;
+}
+
+export interface ExerciseInstanceWhereInput {
+  id?: Maybe<ID_Input>;
+  id_not?: Maybe<ID_Input>;
+  id_in?: Maybe<ID_Input[] | ID_Input>;
+  id_not_in?: Maybe<ID_Input[] | ID_Input>;
+  id_lt?: Maybe<ID_Input>;
+  id_lte?: Maybe<ID_Input>;
+  id_gt?: Maybe<ID_Input>;
+  id_gte?: Maybe<ID_Input>;
+  id_contains?: Maybe<ID_Input>;
+  id_not_contains?: Maybe<ID_Input>;
+  id_starts_with?: Maybe<ID_Input>;
+  id_not_starts_with?: Maybe<ID_Input>;
+  id_ends_with?: Maybe<ID_Input>;
+  id_not_ends_with?: Maybe<ID_Input>;
+  exercise?: Maybe<ExerciseWhereInput>;
+  repetitions?: Maybe<Int>;
+  repetitions_not?: Maybe<Int>;
+  repetitions_in?: Maybe<Int[] | Int>;
+  repetitions_not_in?: Maybe<Int[] | Int>;
+  repetitions_lt?: Maybe<Int>;
+  repetitions_lte?: Maybe<Int>;
+  repetitions_gt?: Maybe<Int>;
+  repetitions_gte?: Maybe<Int>;
+  AND?: Maybe<ExerciseInstanceWhereInput[] | ExerciseInstanceWhereInput>;
+  OR?: Maybe<ExerciseInstanceWhereInput[] | ExerciseInstanceWhereInput>;
+  NOT?: Maybe<ExerciseInstanceWhereInput[] | ExerciseInstanceWhereInput>;
+}
+
+export interface ExerciseWhereInput {
+  id?: Maybe<ID_Input>;
+  id_not?: Maybe<ID_Input>;
+  id_in?: Maybe<ID_Input[] | ID_Input>;
+  id_not_in?: Maybe<ID_Input[] | ID_Input>;
+  id_lt?: Maybe<ID_Input>;
+  id_lte?: Maybe<ID_Input>;
+  id_gt?: Maybe<ID_Input>;
+  id_gte?: Maybe<ID_Input>;
+  id_contains?: Maybe<ID_Input>;
+  id_not_contains?: Maybe<ID_Input>;
+  id_starts_with?: Maybe<ID_Input>;
+  id_not_starts_with?: Maybe<ID_Input>;
+  id_ends_with?: Maybe<ID_Input>;
+  id_not_ends_with?: Maybe<ID_Input>;
+  name?: Maybe<String>;
+  name_not?: Maybe<String>;
+  name_in?: Maybe<String[] | String>;
+  name_not_in?: Maybe<String[] | String>;
+  name_lt?: Maybe<String>;
+  name_lte?: Maybe<String>;
+  name_gt?: Maybe<String>;
+  name_gte?: Maybe<String>;
+  name_contains?: Maybe<String>;
+  name_not_contains?: Maybe<String>;
+  name_starts_with?: Maybe<String>;
+  name_not_starts_with?: Maybe<String>;
+  name_ends_with?: Maybe<String>;
+  name_not_ends_with?: Maybe<String>;
+  description?: Maybe<String>;
+  description_not?: Maybe<String>;
+  description_in?: Maybe<String[] | String>;
+  description_not_in?: Maybe<String[] | String>;
+  description_lt?: Maybe<String>;
+  description_lte?: Maybe<String>;
+  description_gt?: Maybe<String>;
+  description_gte?: Maybe<String>;
+  description_contains?: Maybe<String>;
+  description_not_contains?: Maybe<String>;
+  description_starts_with?: Maybe<String>;
+  description_not_starts_with?: Maybe<String>;
+  description_ends_with?: Maybe<String>;
+  description_not_ends_with?: Maybe<String>;
+  video?: Maybe<String>;
+  video_not?: Maybe<String>;
+  video_in?: Maybe<String[] | String>;
+  video_not_in?: Maybe<String[] | String>;
+  video_lt?: Maybe<String>;
+  video_lte?: Maybe<String>;
+  video_gt?: Maybe<String>;
+  video_gte?: Maybe<String>;
+  video_contains?: Maybe<String>;
+  video_not_contains?: Maybe<String>;
+  video_starts_with?: Maybe<String>;
+  video_not_starts_with?: Maybe<String>;
+  video_ends_with?: Maybe<String>;
+  video_not_ends_with?: Maybe<String>;
+  AND?: Maybe<ExerciseWhereInput[] | ExerciseWhereInput>;
+  OR?: Maybe<ExerciseWhereInput[] | ExerciseWhereInput>;
+  NOT?: Maybe<ExerciseWhereInput[] | ExerciseWhereInput>;
+}
+
+export type CommentWhereUniqueInput = AtLeastOne<{
+  id: Maybe<ID_Input>;
+}>;
+
+export interface CommentWhereInput {
+  id?: Maybe<ID_Input>;
+  id_not?: Maybe<ID_Input>;
+  id_in?: Maybe<ID_Input[] | ID_Input>;
+  id_not_in?: Maybe<ID_Input[] | ID_Input>;
+  id_lt?: Maybe<ID_Input>;
+  id_lte?: Maybe<ID_Input>;
+  id_gt?: Maybe<ID_Input>;
+  id_gte?: Maybe<ID_Input>;
+  id_contains?: Maybe<ID_Input>;
+  id_not_contains?: Maybe<ID_Input>;
+  id_starts_with?: Maybe<ID_Input>;
+  id_not_starts_with?: Maybe<ID_Input>;
+  id_ends_with?: Maybe<ID_Input>;
+  id_not_ends_with?: Maybe<ID_Input>;
+  text?: Maybe<String>;
+  text_not?: Maybe<String>;
+  text_in?: Maybe<String[] | String>;
+  text_not_in?: Maybe<String[] | String>;
+  text_lt?: Maybe<String>;
+  text_lte?: Maybe<String>;
+  text_gt?: Maybe<String>;
+  text_gte?: Maybe<String>;
+  text_contains?: Maybe<String>;
+  text_not_contains?: Maybe<String>;
+  text_starts_with?: Maybe<String>;
+  text_not_starts_with?: Maybe<String>;
+  text_ends_with?: Maybe<String>;
+  text_not_ends_with?: Maybe<String>;
+  author?: Maybe<UserWhereInput>;
+  createdAt?: Maybe<DateTimeInput>;
+  createdAt_not?: Maybe<DateTimeInput>;
+  createdAt_in?: Maybe<DateTimeInput[] | DateTimeInput>;
+  createdAt_not_in?: Maybe<DateTimeInput[] | DateTimeInput>;
+  createdAt_lt?: Maybe<DateTimeInput>;
+  createdAt_lte?: Maybe<DateTimeInput>;
+  createdAt_gt?: Maybe<DateTimeInput>;
+  createdAt_gte?: Maybe<DateTimeInput>;
+  AND?: Maybe<CommentWhereInput[] | CommentWhereInput>;
+  OR?: Maybe<CommentWhereInput[] | CommentWhereInput>;
+  NOT?: Maybe<CommentWhereInput[] | CommentWhereInput>;
+}
+
+export interface UserWhereInput {
+  id?: Maybe<ID_Input>;
+  id_not?: Maybe<ID_Input>;
+  id_in?: Maybe<ID_Input[] | ID_Input>;
+  id_not_in?: Maybe<ID_Input[] | ID_Input>;
+  id_lt?: Maybe<ID_Input>;
+  id_lte?: Maybe<ID_Input>;
+  id_gt?: Maybe<ID_Input>;
+  id_gte?: Maybe<ID_Input>;
+  id_contains?: Maybe<ID_Input>;
+  id_not_contains?: Maybe<ID_Input>;
+  id_starts_with?: Maybe<ID_Input>;
+  id_not_starts_with?: Maybe<ID_Input>;
+  id_ends_with?: Maybe<ID_Input>;
+  id_not_ends_with?: Maybe<ID_Input>;
+  email?: Maybe<String>;
+  email_not?: Maybe<String>;
+  email_in?: Maybe<String[] | String>;
+  email_not_in?: Maybe<String[] | String>;
+  email_lt?: Maybe<String>;
+  email_lte?: Maybe<String>;
+  email_gt?: Maybe<String>;
+  email_gte?: Maybe<String>;
+  email_contains?: Maybe<String>;
+  email_not_contains?: Maybe<String>;
+  email_starts_with?: Maybe<String>;
+  email_not_starts_with?: Maybe<String>;
+  email_ends_with?: Maybe<String>;
+  email_not_ends_with?: Maybe<String>;
+  name?: Maybe<String>;
+  name_not?: Maybe<String>;
+  name_in?: Maybe<String[] | String>;
+  name_not_in?: Maybe<String[] | String>;
+  name_lt?: Maybe<String>;
+  name_lte?: Maybe<String>;
+  name_gt?: Maybe<String>;
+  name_gte?: Maybe<String>;
+  name_contains?: Maybe<String>;
+  name_not_contains?: Maybe<String>;
+  name_starts_with?: Maybe<String>;
+  name_not_starts_with?: Maybe<String>;
+  name_ends_with?: Maybe<String>;
+  name_not_ends_with?: Maybe<String>;
+  password?: Maybe<String>;
+  password_not?: Maybe<String>;
+  password_in?: Maybe<String[] | String>;
+  password_not_in?: Maybe<String[] | String>;
+  password_lt?: Maybe<String>;
+  password_lte?: Maybe<String>;
+  password_gt?: Maybe<String>;
+  password_gte?: Maybe<String>;
+  password_contains?: Maybe<String>;
+  password_not_contains?: Maybe<String>;
+  password_starts_with?: Maybe<String>;
+  password_not_starts_with?: Maybe<String>;
+  password_ends_with?: Maybe<String>;
+  password_not_ends_with?: Maybe<String>;
+  resetToken?: Maybe<String>;
+  resetToken_not?: Maybe<String>;
+  resetToken_in?: Maybe<String[] | String>;
+  resetToken_not_in?: Maybe<String[] | String>;
+  resetToken_lt?: Maybe<String>;
+  resetToken_lte?: Maybe<String>;
+  resetToken_gt?: Maybe<String>;
+  resetToken_gte?: Maybe<String>;
+  resetToken_contains?: Maybe<String>;
+  resetToken_not_contains?: Maybe<String>;
+  resetToken_starts_with?: Maybe<String>;
+  resetToken_not_starts_with?: Maybe<String>;
+  resetToken_ends_with?: Maybe<String>;
+  resetToken_not_ends_with?: Maybe<String>;
+  resetTokenExpiry?: Maybe<Float>;
+  resetTokenExpiry_not?: Maybe<Float>;
+  resetTokenExpiry_in?: Maybe<Float[] | Float>;
+  resetTokenExpiry_not_in?: Maybe<Float[] | Float>;
+  resetTokenExpiry_lt?: Maybe<Float>;
+  resetTokenExpiry_lte?: Maybe<Float>;
+  resetTokenExpiry_gt?: Maybe<Float>;
+  resetTokenExpiry_gte?: Maybe<Float>;
+  createdAt?: Maybe<DateTimeInput>;
+  createdAt_not?: Maybe<DateTimeInput>;
+  createdAt_in?: Maybe<DateTimeInput[] | DateTimeInput>;
+  createdAt_not_in?: Maybe<DateTimeInput[] | DateTimeInput>;
+  createdAt_lt?: Maybe<DateTimeInput>;
+  createdAt_lte?: Maybe<DateTimeInput>;
+  createdAt_gt?: Maybe<DateTimeInput>;
+  createdAt_gte?: Maybe<DateTimeInput>;
+  comments_every?: Maybe<CommentWhereInput>;
+  comments_some?: Maybe<CommentWhereInput>;
+  comments_none?: Maybe<CommentWhereInput>;
+  ratings_every?: Maybe<RatingWhereInput>;
+  ratings_some?: Maybe<RatingWhereInput>;
+  ratings_none?: Maybe<RatingWhereInput>;
+  AND?: Maybe<UserWhereInput[] | UserWhereInput>;
+  OR?: Maybe<UserWhereInput[] | UserWhereInput>;
+  NOT?: Maybe<UserWhereInput[] | UserWhereInput>;
+}
+
+export interface RatingWhereInput {
+  id?: Maybe<ID_Input>;
+  id_not?: Maybe<ID_Input>;
+  id_in?: Maybe<ID_Input[] | ID_Input>;
+  id_not_in?: Maybe<ID_Input[] | ID_Input>;
+  id_lt?: Maybe<ID_Input>;
+  id_lte?: Maybe<ID_Input>;
+  id_gt?: Maybe<ID_Input>;
+  id_gte?: Maybe<ID_Input>;
+  id_contains?: Maybe<ID_Input>;
+  id_not_contains?: Maybe<ID_Input>;
+  id_starts_with?: Maybe<ID_Input>;
+  id_not_starts_with?: Maybe<ID_Input>;
+  id_ends_with?: Maybe<ID_Input>;
+  id_not_ends_with?: Maybe<ID_Input>;
+  user?: Maybe<UserWhereInput>;
+  value?: Maybe<Int>;
+  value_not?: Maybe<Int>;
+  value_in?: Maybe<Int[] | Int>;
+  value_not_in?: Maybe<Int[] | Int>;
+  value_lt?: Maybe<Int>;
+  value_lte?: Maybe<Int>;
+  value_gt?: Maybe<Int>;
+  value_gte?: Maybe<Int>;
+  comment?: Maybe<String>;
+  comment_not?: Maybe<String>;
+  comment_in?: Maybe<String[] | String>;
+  comment_not_in?: Maybe<String[] | String>;
+  comment_lt?: Maybe<String>;
+  comment_lte?: Maybe<String>;
+  comment_gt?: Maybe<String>;
+  comment_gte?: Maybe<String>;
+  comment_contains?: Maybe<String>;
+  comment_not_contains?: Maybe<String>;
+  comment_starts_with?: Maybe<String>;
+  comment_not_starts_with?: Maybe<String>;
+  comment_ends_with?: Maybe<String>;
+  comment_not_ends_with?: Maybe<String>;
+  createdAt?: Maybe<DateTimeInput>;
+  createdAt_not?: Maybe<DateTimeInput>;
+  createdAt_in?: Maybe<DateTimeInput[] | DateTimeInput>;
+  createdAt_not_in?: Maybe<DateTimeInput[] | DateTimeInput>;
+  createdAt_lt?: Maybe<DateTimeInput>;
+  createdAt_lte?: Maybe<DateTimeInput>;
+  createdAt_gt?: Maybe<DateTimeInput>;
+  createdAt_gte?: Maybe<DateTimeInput>;
+  AND?: Maybe<RatingWhereInput[] | RatingWhereInput>;
+  OR?: Maybe<RatingWhereInput[] | RatingWhereInput>;
+  NOT?: Maybe<RatingWhereInput[] | RatingWhereInput>;
+}
+
+export type ExerciseWhereUniqueInput = AtLeastOne<{
+  id: Maybe<ID_Input>;
+}>;
+
+export type ExerciseInstanceWhereUniqueInput = AtLeastOne<{
+  id: Maybe<ID_Input>;
+}>;
+
+export type FormatWhereUniqueInput = AtLeastOne<{
+  id: Maybe<ID_Input>;
+}>;
+
+export type RatingWhereUniqueInput = AtLeastOne<{
+  id: Maybe<ID_Input>;
+}>;
+
+export type TrackWhereUniqueInput = AtLeastOne<{
+  id: Maybe<ID_Input>;
+}>;
+
+export type TrainingWhereUniqueInput = AtLeastOne<{
+  id: Maybe<ID_Input>;
+}>;
+
+export interface TrainingWhereInput {
+  id?: Maybe<ID_Input>;
+  id_not?: Maybe<ID_Input>;
+  id_in?: Maybe<ID_Input[] | ID_Input>;
+  id_not_in?: Maybe<ID_Input[] | ID_Input>;
+  id_lt?: Maybe<ID_Input>;
+  id_lte?: Maybe<ID_Input>;
+  id_gt?: Maybe<ID_Input>;
+  id_gte?: Maybe<ID_Input>;
+  id_contains?: Maybe<ID_Input>;
+  id_not_contains?: Maybe<ID_Input>;
+  id_starts_with?: Maybe<ID_Input>;
+  id_not_starts_with?: Maybe<ID_Input>;
+  id_ends_with?: Maybe<ID_Input>;
+  id_not_ends_with?: Maybe<ID_Input>;
+  title?: Maybe<String>;
+  title_not?: Maybe<String>;
+  title_in?: Maybe<String[] | String>;
+  title_not_in?: Maybe<String[] | String>;
+  title_lt?: Maybe<String>;
+  title_lte?: Maybe<String>;
+  title_gt?: Maybe<String>;
+  title_gte?: Maybe<String>;
+  title_contains?: Maybe<String>;
+  title_not_contains?: Maybe<String>;
+  title_starts_with?: Maybe<String>;
+  title_not_starts_with?: Maybe<String>;
+  title_ends_with?: Maybe<String>;
+  title_not_ends_with?: Maybe<String>;
+  type?: Maybe<TrainingTypeWhereInput>;
+  createdAt?: Maybe<DateTimeInput>;
+  createdAt_not?: Maybe<DateTimeInput>;
+  createdAt_in?: Maybe<DateTimeInput[] | DateTimeInput>;
+  createdAt_not_in?: Maybe<DateTimeInput[] | DateTimeInput>;
+  createdAt_lt?: Maybe<DateTimeInput>;
+  createdAt_lte?: Maybe<DateTimeInput>;
+  createdAt_gt?: Maybe<DateTimeInput>;
+  createdAt_gte?: Maybe<DateTimeInput>;
+  trainingDate?: Maybe<DateTimeInput>;
+  trainingDate_not?: Maybe<DateTimeInput>;
+  trainingDate_in?: Maybe<DateTimeInput[] | DateTimeInput>;
+  trainingDate_not_in?: Maybe<DateTimeInput[] | DateTimeInput>;
+  trainingDate_lt?: Maybe<DateTimeInput>;
+  trainingDate_lte?: Maybe<DateTimeInput>;
+  trainingDate_gt?: Maybe<DateTimeInput>;
+  trainingDate_gte?: Maybe<DateTimeInput>;
+  location?: Maybe<String>;
+  location_not?: Maybe<String>;
+  location_in?: Maybe<String[] | String>;
+  location_not_in?: Maybe<String[] | String>;
+  location_lt?: Maybe<String>;
+  location_lte?: Maybe<String>;
+  location_gt?: Maybe<String>;
+  location_gte?: Maybe<String>;
+  location_contains?: Maybe<String>;
+  location_not_contains?: Maybe<String>;
+  location_starts_with?: Maybe<String>;
+  location_not_starts_with?: Maybe<String>;
+  location_ends_with?: Maybe<String>;
+  location_not_ends_with?: Maybe<String>;
+  registrations_every?: Maybe<UserWhereInput>;
+  registrations_some?: Maybe<UserWhereInput>;
+  registrations_none?: Maybe<UserWhereInput>;
+  attendance?: Maybe<Int>;
+  attendance_not?: Maybe<Int>;
+  attendance_in?: Maybe<Int[] | Int>;
+  attendance_not_in?: Maybe<Int[] | Int>;
+  attendance_lt?: Maybe<Int>;
+  attendance_lte?: Maybe<Int>;
+  attendance_gt?: Maybe<Int>;
+  attendance_gte?: Maybe<Int>;
+  ratings_every?: Maybe<RatingWhereInput>;
+  ratings_some?: Maybe<RatingWhereInput>;
+  ratings_none?: Maybe<RatingWhereInput>;
+  published?: Maybe<Boolean>;
+  published_not?: Maybe<Boolean>;
+  blocks_every?: Maybe<BlockWhereInput>;
+  blocks_some?: Maybe<BlockWhereInput>;
+  blocks_none?: Maybe<BlockWhereInput>;
+  AND?: Maybe<TrainingWhereInput[] | TrainingWhereInput>;
+  OR?: Maybe<TrainingWhereInput[] | TrainingWhereInput>;
+  NOT?: Maybe<TrainingWhereInput[] | TrainingWhereInput>;
+}
+
+export interface TrainingTypeWhereInput {
+  id?: Maybe<ID_Input>;
+  id_not?: Maybe<ID_Input>;
+  id_in?: Maybe<ID_Input[] | ID_Input>;
+  id_not_in?: Maybe<ID_Input[] | ID_Input>;
+  id_lt?: Maybe<ID_Input>;
+  id_lte?: Maybe<ID_Input>;
+  id_gt?: Maybe<ID_Input>;
+  id_gte?: Maybe<ID_Input>;
+  id_contains?: Maybe<ID_Input>;
+  id_not_contains?: Maybe<ID_Input>;
+  id_starts_with?: Maybe<ID_Input>;
+  id_not_starts_with?: Maybe<ID_Input>;
+  id_ends_with?: Maybe<ID_Input>;
+  id_not_ends_with?: Maybe<ID_Input>;
+  name?: Maybe<String>;
+  name_not?: Maybe<String>;
+  name_in?: Maybe<String[] | String>;
+  name_not_in?: Maybe<String[] | String>;
+  name_lt?: Maybe<String>;
+  name_lte?: Maybe<String>;
+  name_gt?: Maybe<String>;
+  name_gte?: Maybe<String>;
+  name_contains?: Maybe<String>;
+  name_not_contains?: Maybe<String>;
+  name_starts_with?: Maybe<String>;
+  name_not_starts_with?: Maybe<String>;
+  name_ends_with?: Maybe<String>;
+  name_not_ends_with?: Maybe<String>;
+  description?: Maybe<String>;
+  description_not?: Maybe<String>;
+  description_in?: Maybe<String[] | String>;
+  description_not_in?: Maybe<String[] | String>;
+  description_lt?: Maybe<String>;
+  description_lte?: Maybe<String>;
+  description_gt?: Maybe<String>;
+  description_gte?: Maybe<String>;
+  description_contains?: Maybe<String>;
+  description_not_contains?: Maybe<String>;
+  description_starts_with?: Maybe<String>;
+  description_not_starts_with?: Maybe<String>;
+  description_ends_with?: Maybe<String>;
+  description_not_ends_with?: Maybe<String>;
+  AND?: Maybe<TrainingTypeWhereInput[] | TrainingTypeWhereInput>;
+  OR?: Maybe<TrainingTypeWhereInput[] | TrainingTypeWhereInput>;
+  NOT?: Maybe<TrainingTypeWhereInput[] | TrainingTypeWhereInput>;
+}
+
+export type TrainingTypeWhereUniqueInput = AtLeastOne<{
+  id: Maybe<ID_Input>;
+  name?: Maybe<String>;
+}>;
+
+export type UserWhereUniqueInput = AtLeastOne<{
+  id: Maybe<ID_Input>;
+  email?: Maybe<String>;
+}>;
+
+export interface BlockCreateInput {
+  id?: Maybe<ID_Input>;
+  sequence: Int;
+  title: String;
+  description?: Maybe<String>;
+  videos?: Maybe<BlockCreatevideosInput>;
+  pictures?: Maybe<BlockCreatepicturesInput>;
+  duration?: Maybe<Int>;
+  rounds?: Maybe<Int>;
+  format: FormatCreateOneInput;
+  rest?: Maybe<Int>;
+  tracks?: Maybe<TrackCreateManyInput>;
+  blocks?: Maybe<BlockCreateManyInput>;
+  exercises?: Maybe<ExerciseInstanceCreateManyInput>;
+}
+
+export interface BlockCreatevideosInput {
+  set?: Maybe<String[] | String>;
+}
+
+export interface BlockCreatepicturesInput {
+  set?: Maybe<String[] | String>;
+}
+
+export interface FormatCreateOneInput {
+  create?: Maybe<FormatCreateInput>;
+  connect?: Maybe<FormatWhereUniqueInput>;
+}
+
+export interface FormatCreateInput {
+  id?: Maybe<ID_Input>;
+  name: String;
+  description: String;
+}
+
+export interface TrackCreateManyInput {
+  create?: Maybe<TrackCreateInput[] | TrackCreateInput>;
+  connect?: Maybe<TrackWhereUniqueInput[] | TrackWhereUniqueInput>;
+}
+
+export interface TrackCreateInput {
+  id?: Maybe<ID_Input>;
+  title: String;
+  artist: String;
+  duration: Int;
+  link: String;
+}
+
+export interface BlockCreateManyInput {
+  create?: Maybe<BlockCreateInput[] | BlockCreateInput>;
+  connect?: Maybe<BlockWhereUniqueInput[] | BlockWhereUniqueInput>;
+}
+
+export interface ExerciseInstanceCreateManyInput {
+  create?: Maybe<ExerciseInstanceCreateInput[] | ExerciseInstanceCreateInput>;
+  connect?: Maybe<
+    ExerciseInstanceWhereUniqueInput[] | ExerciseInstanceWhereUniqueInput
+  >;
+}
+
+export interface ExerciseInstanceCreateInput {
+  id?: Maybe<ID_Input>;
+  exercise: ExerciseCreateOneInput;
+  repetitions?: Maybe<Int>;
+}
+
+export interface ExerciseCreateOneInput {
+  create?: Maybe<ExerciseCreateInput>;
+  connect?: Maybe<ExerciseWhereUniqueInput>;
+}
+
+export interface ExerciseCreateInput {
+  id?: Maybe<ID_Input>;
+  name: String;
+  description: String;
+  video: String;
+  targets?: Maybe<ExerciseCreatetargetsInput>;
+  baseExercise?: Maybe<ExerciseCreatebaseExerciseInput>;
+}
+
+export interface ExerciseCreatetargetsInput {
+  set?: Maybe<String[] | String>;
+}
+
+export interface ExerciseCreatebaseExerciseInput {
+  set?: Maybe<String[] | String>;
+}
+
+export interface BlockUpdateInput {
+  sequence?: Maybe<Int>;
+  title?: Maybe<String>;
+  description?: Maybe<String>;
+  videos?: Maybe<BlockUpdatevideosInput>;
+  pictures?: Maybe<BlockUpdatepicturesInput>;
+  duration?: Maybe<Int>;
+  rounds?: Maybe<Int>;
+  format?: Maybe<FormatUpdateOneRequiredInput>;
+  rest?: Maybe<Int>;
+  tracks?: Maybe<TrackUpdateManyInput>;
+  blocks?: Maybe<BlockUpdateManyInput>;
+  exercises?: Maybe<ExerciseInstanceUpdateManyInput>;
+}
+
+export interface BlockUpdatevideosInput {
+  set?: Maybe<String[] | String>;
+}
+
+export interface BlockUpdatepicturesInput {
+  set?: Maybe<String[] | String>;
+}
+
+export interface FormatUpdateOneRequiredInput {
+  create?: Maybe<FormatCreateInput>;
+  update?: Maybe<FormatUpdateDataInput>;
+  upsert?: Maybe<FormatUpsertNestedInput>;
+  connect?: Maybe<FormatWhereUniqueInput>;
+}
+
+export interface FormatUpdateDataInput {
+  name?: Maybe<String>;
+  description?: Maybe<String>;
+}
+
+export interface FormatUpsertNestedInput {
+  update: FormatUpdateDataInput;
+  create: FormatCreateInput;
+}
+
+export interface TrackUpdateManyInput {
+  create?: Maybe<TrackCreateInput[] | TrackCreateInput>;
+  update?: Maybe<
+    | TrackUpdateWithWhereUniqueNestedInput[]
+    | TrackUpdateWithWhereUniqueNestedInput
+  >;
+  upsert?: Maybe<
+    | TrackUpsertWithWhereUniqueNestedInput[]
+    | TrackUpsertWithWhereUniqueNestedInput
+  >;
+  delete?: Maybe<TrackWhereUniqueInput[] | TrackWhereUniqueInput>;
+  connect?: Maybe<TrackWhereUniqueInput[] | TrackWhereUniqueInput>;
+  set?: Maybe<TrackWhereUniqueInput[] | TrackWhereUniqueInput>;
+  disconnect?: Maybe<TrackWhereUniqueInput[] | TrackWhereUniqueInput>;
+  deleteMany?: Maybe<TrackScalarWhereInput[] | TrackScalarWhereInput>;
+  updateMany?: Maybe<
+    TrackUpdateManyWithWhereNestedInput[] | TrackUpdateManyWithWhereNestedInput
+  >;
+}
+
+export interface TrackUpdateWithWhereUniqueNestedInput {
+  where: TrackWhereUniqueInput;
+  data: TrackUpdateDataInput;
+}
+
+export interface TrackUpdateDataInput {
+  title?: Maybe<String>;
+  artist?: Maybe<String>;
+  duration?: Maybe<Int>;
+  link?: Maybe<String>;
+}
+
+export interface TrackUpsertWithWhereUniqueNestedInput {
+  where: TrackWhereUniqueInput;
+  update: TrackUpdateDataInput;
+  create: TrackCreateInput;
+}
+
+export interface TrackScalarWhereInput {
+  id?: Maybe<ID_Input>;
+  id_not?: Maybe<ID_Input>;
+  id_in?: Maybe<ID_Input[] | ID_Input>;
+  id_not_in?: Maybe<ID_Input[] | ID_Input>;
+  id_lt?: Maybe<ID_Input>;
+  id_lte?: Maybe<ID_Input>;
+  id_gt?: Maybe<ID_Input>;
+  id_gte?: Maybe<ID_Input>;
+  id_contains?: Maybe<ID_Input>;
+  id_not_contains?: Maybe<ID_Input>;
+  id_starts_with?: Maybe<ID_Input>;
+  id_not_starts_with?: Maybe<ID_Input>;
+  id_ends_with?: Maybe<ID_Input>;
+  id_not_ends_with?: Maybe<ID_Input>;
+  title?: Maybe<String>;
+  title_not?: Maybe<String>;
+  title_in?: Maybe<String[] | String>;
+  title_not_in?: Maybe<String[] | String>;
+  title_lt?: Maybe<String>;
+  title_lte?: Maybe<String>;
+  title_gt?: Maybe<String>;
+  title_gte?: Maybe<String>;
+  title_contains?: Maybe<String>;
+  title_not_contains?: Maybe<String>;
+  title_starts_with?: Maybe<String>;
+  title_not_starts_with?: Maybe<String>;
+  title_ends_with?: Maybe<String>;
+  title_not_ends_with?: Maybe<String>;
+  artist?: Maybe<String>;
+  artist_not?: Maybe<String>;
+  artist_in?: Maybe<String[] | String>;
+  artist_not_in?: Maybe<String[] | String>;
+  artist_lt?: Maybe<String>;
+  artist_lte?: Maybe<String>;
+  artist_gt?: Maybe<String>;
+  artist_gte?: Maybe<String>;
+  artist_contains?: Maybe<String>;
+  artist_not_contains?: Maybe<String>;
+  artist_starts_with?: Maybe<String>;
+  artist_not_starts_with?: Maybe<String>;
+  artist_ends_with?: Maybe<String>;
+  artist_not_ends_with?: Maybe<String>;
+  duration?: Maybe<Int>;
+  duration_not?: Maybe<Int>;
+  duration_in?: Maybe<Int[] | Int>;
+  duration_not_in?: Maybe<Int[] | Int>;
+  duration_lt?: Maybe<Int>;
+  duration_lte?: Maybe<Int>;
+  duration_gt?: Maybe<Int>;
+  duration_gte?: Maybe<Int>;
+  link?: Maybe<String>;
+  link_not?: Maybe<String>;
+  link_in?: Maybe<String[] | String>;
+  link_not_in?: Maybe<String[] | String>;
+  link_lt?: Maybe<String>;
+  link_lte?: Maybe<String>;
+  link_gt?: Maybe<String>;
+  link_gte?: Maybe<String>;
+  link_contains?: Maybe<String>;
+  link_not_contains?: Maybe<String>;
+  link_starts_with?: Maybe<String>;
+  link_not_starts_with?: Maybe<String>;
+  link_ends_with?: Maybe<String>;
+  link_not_ends_with?: Maybe<String>;
+  AND?: Maybe<TrackScalarWhereInput[] | TrackScalarWhereInput>;
+  OR?: Maybe<TrackScalarWhereInput[] | TrackScalarWhereInput>;
+  NOT?: Maybe<TrackScalarWhereInput[] | TrackScalarWhereInput>;
+}
+
+export interface TrackUpdateManyWithWhereNestedInput {
+  where: TrackScalarWhereInput;
+  data: TrackUpdateManyDataInput;
+}
+
+export interface TrackUpdateManyDataInput {
+  title?: Maybe<String>;
+  artist?: Maybe<String>;
+  duration?: Maybe<Int>;
+  link?: Maybe<String>;
+}
+
+export interface BlockUpdateManyInput {
+  create?: Maybe<BlockCreateInput[] | BlockCreateInput>;
+  update?: Maybe<
+    | BlockUpdateWithWhereUniqueNestedInput[]
+    | BlockUpdateWithWhereUniqueNestedInput
+  >;
+  upsert?: Maybe<
+    | BlockUpsertWithWhereUniqueNestedInput[]
+    | BlockUpsertWithWhereUniqueNestedInput
+  >;
+  delete?: Maybe<BlockWhereUniqueInput[] | BlockWhereUniqueInput>;
+  connect?: Maybe<BlockWhereUniqueInput[] | BlockWhereUniqueInput>;
+  set?: Maybe<BlockWhereUniqueInput[] | BlockWhereUniqueInput>;
+  disconnect?: Maybe<BlockWhereUniqueInput[] | BlockWhereUniqueInput>;
+  deleteMany?: Maybe<BlockScalarWhereInput[] | BlockScalarWhereInput>;
+  updateMany?: Maybe<
+    BlockUpdateManyWithWhereNestedInput[] | BlockUpdateManyWithWhereNestedInput
+  >;
+}
+
+export interface BlockUpdateWithWhereUniqueNestedInput {
+  where: BlockWhereUniqueInput;
+  data: BlockUpdateDataInput;
+}
+
+export interface BlockUpdateDataInput {
+  sequence?: Maybe<Int>;
+  title?: Maybe<String>;
+  description?: Maybe<String>;
+  videos?: Maybe<BlockUpdatevideosInput>;
+  pictures?: Maybe<BlockUpdatepicturesInput>;
+  duration?: Maybe<Int>;
+  rounds?: Maybe<Int>;
+  format?: Maybe<FormatUpdateOneRequiredInput>;
+  rest?: Maybe<Int>;
+  tracks?: Maybe<TrackUpdateManyInput>;
+  blocks?: Maybe<BlockUpdateManyInput>;
+  exercises?: Maybe<ExerciseInstanceUpdateManyInput>;
+}
+
+export interface ExerciseInstanceUpdateManyInput {
+  create?: Maybe<ExerciseInstanceCreateInput[] | ExerciseInstanceCreateInput>;
+  update?: Maybe<
+    | ExerciseInstanceUpdateWithWhereUniqueNestedInput[]
+    | ExerciseInstanceUpdateWithWhereUniqueNestedInput
+  >;
+  upsert?: Maybe<
+    | ExerciseInstanceUpsertWithWhereUniqueNestedInput[]
+    | ExerciseInstanceUpsertWithWhereUniqueNestedInput
+  >;
+  delete?: Maybe<
+    ExerciseInstanceWhereUniqueInput[] | ExerciseInstanceWhereUniqueInput
+  >;
+  connect?: Maybe<
+    ExerciseInstanceWhereUniqueInput[] | ExerciseInstanceWhereUniqueInput
+  >;
+  set?: Maybe<
+    ExerciseInstanceWhereUniqueInput[] | ExerciseInstanceWhereUniqueInput
+  >;
+  disconnect?: Maybe<
+    ExerciseInstanceWhereUniqueInput[] | ExerciseInstanceWhereUniqueInput
+  >;
+  deleteMany?: Maybe<
+    ExerciseInstanceScalarWhereInput[] | ExerciseInstanceScalarWhereInput
+  >;
+  updateMany?: Maybe<
+    | ExerciseInstanceUpdateManyWithWhereNestedInput[]
+    | ExerciseInstanceUpdateManyWithWhereNestedInput
+  >;
+}
+
+export interface ExerciseInstanceUpdateWithWhereUniqueNestedInput {
+  where: ExerciseInstanceWhereUniqueInput;
+  data: ExerciseInstanceUpdateDataInput;
+}
+
+export interface ExerciseInstanceUpdateDataInput {
+  exercise?: Maybe<ExerciseUpdateOneRequiredInput>;
+  repetitions?: Maybe<Int>;
+}
+
+export interface ExerciseUpdateOneRequiredInput {
+  create?: Maybe<ExerciseCreateInput>;
+  update?: Maybe<ExerciseUpdateDataInput>;
+  upsert?: Maybe<ExerciseUpsertNestedInput>;
+  connect?: Maybe<ExerciseWhereUniqueInput>;
+}
+
+export interface ExerciseUpdateDataInput {
+  name?: Maybe<String>;
+  description?: Maybe<String>;
+  video?: Maybe<String>;
+  targets?: Maybe<ExerciseUpdatetargetsInput>;
+  baseExercise?: Maybe<ExerciseUpdatebaseExerciseInput>;
+}
+
+export interface ExerciseUpdatetargetsInput {
+  set?: Maybe<String[] | String>;
+}
+
+export interface ExerciseUpdatebaseExerciseInput {
+  set?: Maybe<String[] | String>;
+}
+
+export interface ExerciseUpsertNestedInput {
+  update: ExerciseUpdateDataInput;
+  create: ExerciseCreateInput;
+}
+
+export interface ExerciseInstanceUpsertWithWhereUniqueNestedInput {
+  where: ExerciseInstanceWhereUniqueInput;
+  update: ExerciseInstanceUpdateDataInput;
+  create: ExerciseInstanceCreateInput;
+}
+
+export interface ExerciseInstanceScalarWhereInput {
+  id?: Maybe<ID_Input>;
+  id_not?: Maybe<ID_Input>;
+  id_in?: Maybe<ID_Input[] | ID_Input>;
+  id_not_in?: Maybe<ID_Input[] | ID_Input>;
+  id_lt?: Maybe<ID_Input>;
+  id_lte?: Maybe<ID_Input>;
+  id_gt?: Maybe<ID_Input>;
+  id_gte?: Maybe<ID_Input>;
+  id_contains?: Maybe<ID_Input>;
+  id_not_contains?: Maybe<ID_Input>;
+  id_starts_with?: Maybe<ID_Input>;
+  id_not_starts_with?: Maybe<ID_Input>;
+  id_ends_with?: Maybe<ID_Input>;
+  id_not_ends_with?: Maybe<ID_Input>;
+  repetitions?: Maybe<Int>;
+  repetitions_not?: Maybe<Int>;
+  repetitions_in?: Maybe<Int[] | Int>;
+  repetitions_not_in?: Maybe<Int[] | Int>;
+  repetitions_lt?: Maybe<Int>;
+  repetitions_lte?: Maybe<Int>;
+  repetitions_gt?: Maybe<Int>;
+  repetitions_gte?: Maybe<Int>;
+  AND?: Maybe<
+    ExerciseInstanceScalarWhereInput[] | ExerciseInstanceScalarWhereInput
+  >;
+  OR?: Maybe<
+    ExerciseInstanceScalarWhereInput[] | ExerciseInstanceScalarWhereInput
+  >;
+  NOT?: Maybe<
+    ExerciseInstanceScalarWhereInput[] | ExerciseInstanceScalarWhereInput
+  >;
+}
+
+export interface ExerciseInstanceUpdateManyWithWhereNestedInput {
+  where: ExerciseInstanceScalarWhereInput;
+  data: ExerciseInstanceUpdateManyDataInput;
+}
+
+export interface ExerciseInstanceUpdateManyDataInput {
+  repetitions?: Maybe<Int>;
+}
+
+export interface BlockUpsertWithWhereUniqueNestedInput {
+  where: BlockWhereUniqueInput;
+  update: BlockUpdateDataInput;
+  create: BlockCreateInput;
+}
+
+export interface BlockScalarWhereInput {
+  id?: Maybe<ID_Input>;
+  id_not?: Maybe<ID_Input>;
+  id_in?: Maybe<ID_Input[] | ID_Input>;
+  id_not_in?: Maybe<ID_Input[] | ID_Input>;
+  id_lt?: Maybe<ID_Input>;
+  id_lte?: Maybe<ID_Input>;
+  id_gt?: Maybe<ID_Input>;
+  id_gte?: Maybe<ID_Input>;
+  id_contains?: Maybe<ID_Input>;
+  id_not_contains?: Maybe<ID_Input>;
+  id_starts_with?: Maybe<ID_Input>;
+  id_not_starts_with?: Maybe<ID_Input>;
+  id_ends_with?: Maybe<ID_Input>;
+  id_not_ends_with?: Maybe<ID_Input>;
+  sequence?: Maybe<Int>;
+  sequence_not?: Maybe<Int>;
+  sequence_in?: Maybe<Int[] | Int>;
+  sequence_not_in?: Maybe<Int[] | Int>;
+  sequence_lt?: Maybe<Int>;
+  sequence_lte?: Maybe<Int>;
+  sequence_gt?: Maybe<Int>;
+  sequence_gte?: Maybe<Int>;
+  title?: Maybe<String>;
+  title_not?: Maybe<String>;
+  title_in?: Maybe<String[] | String>;
+  title_not_in?: Maybe<String[] | String>;
+  title_lt?: Maybe<String>;
+  title_lte?: Maybe<String>;
+  title_gt?: Maybe<String>;
+  title_gte?: Maybe<String>;
+  title_contains?: Maybe<String>;
+  title_not_contains?: Maybe<String>;
+  title_starts_with?: Maybe<String>;
+  title_not_starts_with?: Maybe<String>;
+  title_ends_with?: Maybe<String>;
+  title_not_ends_with?: Maybe<String>;
+  description?: Maybe<String>;
+  description_not?: Maybe<String>;
+  description_in?: Maybe<String[] | String>;
+  description_not_in?: Maybe<String[] | String>;
+  description_lt?: Maybe<String>;
+  description_lte?: Maybe<String>;
+  description_gt?: Maybe<String>;
+  description_gte?: Maybe<String>;
+  description_contains?: Maybe<String>;
+  description_not_contains?: Maybe<String>;
+  description_starts_with?: Maybe<String>;
+  description_not_starts_with?: Maybe<String>;
+  description_ends_with?: Maybe<String>;
+  description_not_ends_with?: Maybe<String>;
+  duration?: Maybe<Int>;
+  duration_not?: Maybe<Int>;
+  duration_in?: Maybe<Int[] | Int>;
+  duration_not_in?: Maybe<Int[] | Int>;
+  duration_lt?: Maybe<Int>;
+  duration_lte?: Maybe<Int>;
+  duration_gt?: Maybe<Int>;
+  duration_gte?: Maybe<Int>;
+  rounds?: Maybe<Int>;
+  rounds_not?: Maybe<Int>;
+  rounds_in?: Maybe<Int[] | Int>;
+  rounds_not_in?: Maybe<Int[] | Int>;
+  rounds_lt?: Maybe<Int>;
+  rounds_lte?: Maybe<Int>;
+  rounds_gt?: Maybe<Int>;
+  rounds_gte?: Maybe<Int>;
+  rest?: Maybe<Int>;
+  rest_not?: Maybe<Int>;
+  rest_in?: Maybe<Int[] | Int>;
+  rest_not_in?: Maybe<Int[] | Int>;
+  rest_lt?: Maybe<Int>;
+  rest_lte?: Maybe<Int>;
+  rest_gt?: Maybe<Int>;
+  rest_gte?: Maybe<Int>;
+  AND?: Maybe<BlockScalarWhereInput[] | BlockScalarWhereInput>;
+  OR?: Maybe<BlockScalarWhereInput[] | BlockScalarWhereInput>;
+  NOT?: Maybe<BlockScalarWhereInput[] | BlockScalarWhereInput>;
+}
+
+export interface BlockUpdateManyWithWhereNestedInput {
+  where: BlockScalarWhereInput;
+  data: BlockUpdateManyDataInput;
+}
+
+export interface BlockUpdateManyDataInput {
+  sequence?: Maybe<Int>;
+  title?: Maybe<String>;
+  description?: Maybe<String>;
+  videos?: Maybe<BlockUpdatevideosInput>;
+  pictures?: Maybe<BlockUpdatepicturesInput>;
+  duration?: Maybe<Int>;
+  rounds?: Maybe<Int>;
+  rest?: Maybe<Int>;
+}
+
+export interface BlockUpdateManyMutationInput {
+  sequence?: Maybe<Int>;
+  title?: Maybe<String>;
+  description?: Maybe<String>;
+  videos?: Maybe<BlockUpdatevideosInput>;
+  pictures?: Maybe<BlockUpdatepicturesInput>;
+  duration?: Maybe<Int>;
+  rounds?: Maybe<Int>;
+  rest?: Maybe<Int>;
+}
+
+export interface CommentCreateInput {
+  id?: Maybe<ID_Input>;
+  text: String;
+  author: UserCreateOneWithoutCommentsInput;
+}
+
+export interface UserCreateOneWithoutCommentsInput {
+  create?: Maybe<UserCreateWithoutCommentsInput>;
+  connect?: Maybe<UserWhereUniqueInput>;
+}
+
+export interface UserCreateWithoutCommentsInput {
+  id?: Maybe<ID_Input>;
+  email: String;
+  name: String;
+  password: String;
+  resetToken?: Maybe<String>;
+  resetTokenExpiry?: Maybe<Float>;
+  ratings?: Maybe<RatingCreateManyWithoutUserInput>;
+  permissions?: Maybe<UserCreatepermissionsInput>;
+  interests?: Maybe<UserCreateinterestsInput>;
+}
+
+export interface RatingCreateManyWithoutUserInput {
+  create?: Maybe<RatingCreateWithoutUserInput[] | RatingCreateWithoutUserInput>;
+  connect?: Maybe<RatingWhereUniqueInput[] | RatingWhereUniqueInput>;
+}
+
+export interface RatingCreateWithoutUserInput {
+  id?: Maybe<ID_Input>;
+  value: Int;
+  comment: String;
+}
+
+export interface UserCreatepermissionsInput {
+  set?: Maybe<Permission[] | Permission>;
+}
+
+export interface UserCreateinterestsInput {
+  set?: Maybe<String[] | String>;
+}
+
+export interface CommentUpdateInput {
+  text?: Maybe<String>;
+  author?: Maybe<UserUpdateOneRequiredWithoutCommentsInput>;
+}
+
+export interface UserUpdateOneRequiredWithoutCommentsInput {
+  create?: Maybe<UserCreateWithoutCommentsInput>;
+  update?: Maybe<UserUpdateWithoutCommentsDataInput>;
+  upsert?: Maybe<UserUpsertWithoutCommentsInput>;
+  connect?: Maybe<UserWhereUniqueInput>;
+}
+
+export interface UserUpdateWithoutCommentsDataInput {
+  email?: Maybe<String>;
+  name?: Maybe<String>;
+  password?: Maybe<String>;
+  resetToken?: Maybe<String>;
+  resetTokenExpiry?: Maybe<Float>;
+  ratings?: Maybe<RatingUpdateManyWithoutUserInput>;
+  permissions?: Maybe<UserUpdatepermissionsInput>;
+  interests?: Maybe<UserUpdateinterestsInput>;
+}
+
+export interface RatingUpdateManyWithoutUserInput {
+  create?: Maybe<RatingCreateWithoutUserInput[] | RatingCreateWithoutUserInput>;
+  delete?: Maybe<RatingWhereUniqueInput[] | RatingWhereUniqueInput>;
+  connect?: Maybe<RatingWhereUniqueInput[] | RatingWhereUniqueInput>;
+  set?: Maybe<RatingWhereUniqueInput[] | RatingWhereUniqueInput>;
+  disconnect?: Maybe<RatingWhereUniqueInput[] | RatingWhereUniqueInput>;
+  update?: Maybe<
+    | RatingUpdateWithWhereUniqueWithoutUserInput[]
+    | RatingUpdateWithWhereUniqueWithoutUserInput
+  >;
+  upsert?: Maybe<
+    | RatingUpsertWithWhereUniqueWithoutUserInput[]
+    | RatingUpsertWithWhereUniqueWithoutUserInput
+  >;
+  deleteMany?: Maybe<RatingScalarWhereInput[] | RatingScalarWhereInput>;
+  updateMany?: Maybe<
+    | RatingUpdateManyWithWhereNestedInput[]
+    | RatingUpdateManyWithWhereNestedInput
+  >;
+}
+
+export interface RatingUpdateWithWhereUniqueWithoutUserInput {
+  where: RatingWhereUniqueInput;
+  data: RatingUpdateWithoutUserDataInput;
+}
+
+export interface RatingUpdateWithoutUserDataInput {
+  value?: Maybe<Int>;
+  comment?: Maybe<String>;
+}
+
+export interface RatingUpsertWithWhereUniqueWithoutUserInput {
+  where: RatingWhereUniqueInput;
+  update: RatingUpdateWithoutUserDataInput;
+  create: RatingCreateWithoutUserInput;
+}
+
+export interface RatingScalarWhereInput {
+  id?: Maybe<ID_Input>;
+  id_not?: Maybe<ID_Input>;
+  id_in?: Maybe<ID_Input[] | ID_Input>;
+  id_not_in?: Maybe<ID_Input[] | ID_Input>;
+  id_lt?: Maybe<ID_Input>;
+  id_lte?: Maybe<ID_Input>;
+  id_gt?: Maybe<ID_Input>;
+  id_gte?: Maybe<ID_Input>;
+  id_contains?: Maybe<ID_Input>;
+  id_not_contains?: Maybe<ID_Input>;
+  id_starts_with?: Maybe<ID_Input>;
+  id_not_starts_with?: Maybe<ID_Input>;
+  id_ends_with?: Maybe<ID_Input>;
+  id_not_ends_with?: Maybe<ID_Input>;
+  value?: Maybe<Int>;
+  value_not?: Maybe<Int>;
+  value_in?: Maybe<Int[] | Int>;
+  value_not_in?: Maybe<Int[] | Int>;
+  value_lt?: Maybe<Int>;
+  value_lte?: Maybe<Int>;
+  value_gt?: Maybe<Int>;
+  value_gte?: Maybe<Int>;
+  comment?: Maybe<String>;
+  comment_not?: Maybe<String>;
+  comment_in?: Maybe<String[] | String>;
+  comment_not_in?: Maybe<String[] | String>;
+  comment_lt?: Maybe<String>;
+  comment_lte?: Maybe<String>;
+  comment_gt?: Maybe<String>;
+  comment_gte?: Maybe<String>;
+  comment_contains?: Maybe<String>;
+  comment_not_contains?: Maybe<String>;
+  comment_starts_with?: Maybe<String>;
+  comment_not_starts_with?: Maybe<String>;
+  comment_ends_with?: Maybe<String>;
+  comment_not_ends_with?: Maybe<String>;
+  createdAt?: Maybe<DateTimeInput>;
+  createdAt_not?: Maybe<DateTimeInput>;
+  createdAt_in?: Maybe<DateTimeInput[] | DateTimeInput>;
+  createdAt_not_in?: Maybe<DateTimeInput[] | DateTimeInput>;
+  createdAt_lt?: Maybe<DateTimeInput>;
+  createdAt_lte?: Maybe<DateTimeInput>;
+  createdAt_gt?: Maybe<DateTimeInput>;
+  createdAt_gte?: Maybe<DateTimeInput>;
+  AND?: Maybe<RatingScalarWhereInput[] | RatingScalarWhereInput>;
+  OR?: Maybe<RatingScalarWhereInput[] | RatingScalarWhereInput>;
+  NOT?: Maybe<RatingScalarWhereInput[] | RatingScalarWhereInput>;
+}
+
+export interface RatingUpdateManyWithWhereNestedInput {
+  where: RatingScalarWhereInput;
+  data: RatingUpdateManyDataInput;
+}
+
+export interface RatingUpdateManyDataInput {
+  value?: Maybe<Int>;
+  comment?: Maybe<String>;
+}
+
+export interface UserUpdatepermissionsInput {
+  set?: Maybe<Permission[] | Permission>;
+}
+
+export interface UserUpdateinterestsInput {
+  set?: Maybe<String[] | String>;
+}
+
+export interface UserUpsertWithoutCommentsInput {
+  update: UserUpdateWithoutCommentsDataInput;
+  create: UserCreateWithoutCommentsInput;
+}
+
+export interface CommentUpdateManyMutationInput {
+  text?: Maybe<String>;
+}
+
+export interface ExerciseUpdateInput {
+  name?: Maybe<String>;
+  description?: Maybe<String>;
+  video?: Maybe<String>;
+  targets?: Maybe<ExerciseUpdatetargetsInput>;
+  baseExercise?: Maybe<ExerciseUpdatebaseExerciseInput>;
+}
+
+export interface ExerciseUpdateManyMutationInput {
+  name?: Maybe<String>;
+  description?: Maybe<String>;
+  video?: Maybe<String>;
+  targets?: Maybe<ExerciseUpdatetargetsInput>;
+  baseExercise?: Maybe<ExerciseUpdatebaseExerciseInput>;
+}
+
+export interface ExerciseInstanceUpdateInput {
+  exercise?: Maybe<ExerciseUpdateOneRequiredInput>;
+  repetitions?: Maybe<Int>;
+}
+
+export interface ExerciseInstanceUpdateManyMutationInput {
+  repetitions?: Maybe<Int>;
+}
+
+export interface FormatUpdateInput {
+  name?: Maybe<String>;
+  description?: Maybe<String>;
+}
+
+export interface FormatUpdateManyMutationInput {
+  name?: Maybe<String>;
+  description?: Maybe<String>;
+}
+
+export interface RatingCreateInput {
+  id?: Maybe<ID_Input>;
+  user: UserCreateOneWithoutRatingsInput;
+  value: Int;
+  comment: String;
+}
+
+export interface UserCreateOneWithoutRatingsInput {
+  create?: Maybe<UserCreateWithoutRatingsInput>;
+  connect?: Maybe<UserWhereUniqueInput>;
+}
+
+export interface UserCreateWithoutRatingsInput {
+  id?: Maybe<ID_Input>;
+  email: String;
+  name: String;
+  password: String;
+  resetToken?: Maybe<String>;
+  resetTokenExpiry?: Maybe<Float>;
+  comments?: Maybe<CommentCreateManyWithoutAuthorInput>;
+  permissions?: Maybe<UserCreatepermissionsInput>;
+  interests?: Maybe<UserCreateinterestsInput>;
+}
+
+export interface CommentCreateManyWithoutAuthorInput {
+  create?: Maybe<
+    CommentCreateWithoutAuthorInput[] | CommentCreateWithoutAuthorInput
+  >;
+  connect?: Maybe<CommentWhereUniqueInput[] | CommentWhereUniqueInput>;
+}
+
+export interface CommentCreateWithoutAuthorInput {
+  id?: Maybe<ID_Input>;
+  text: String;
+}
+
+export interface RatingUpdateInput {
+  user?: Maybe<UserUpdateOneRequiredWithoutRatingsInput>;
+  value?: Maybe<Int>;
+  comment?: Maybe<String>;
+}
+
+export interface UserUpdateOneRequiredWithoutRatingsInput {
+  create?: Maybe<UserCreateWithoutRatingsInput>;
+  update?: Maybe<UserUpdateWithoutRatingsDataInput>;
+  upsert?: Maybe<UserUpsertWithoutRatingsInput>;
+  connect?: Maybe<UserWhereUniqueInput>;
+}
+
+export interface UserUpdateWithoutRatingsDataInput {
+  email?: Maybe<String>;
+  name?: Maybe<String>;
+  password?: Maybe<String>;
+  resetToken?: Maybe<String>;
+  resetTokenExpiry?: Maybe<Float>;
+  comments?: Maybe<CommentUpdateManyWithoutAuthorInput>;
+  permissions?: Maybe<UserUpdatepermissionsInput>;
+  interests?: Maybe<UserUpdateinterestsInput>;
+}
+
+export interface CommentUpdateManyWithoutAuthorInput {
+  create?: Maybe<
+    CommentCreateWithoutAuthorInput[] | CommentCreateWithoutAuthorInput
+  >;
+  delete?: Maybe<CommentWhereUniqueInput[] | CommentWhereUniqueInput>;
+  connect?: Maybe<CommentWhereUniqueInput[] | CommentWhereUniqueInput>;
+  set?: Maybe<CommentWhereUniqueInput[] | CommentWhereUniqueInput>;
+  disconnect?: Maybe<CommentWhereUniqueInput[] | CommentWhereUniqueInput>;
+  update?: Maybe<
+    | CommentUpdateWithWhereUniqueWithoutAuthorInput[]
+    | CommentUpdateWithWhereUniqueWithoutAuthorInput
+  >;
+  upsert?: Maybe<
+    | CommentUpsertWithWhereUniqueWithoutAuthorInput[]
+    | CommentUpsertWithWhereUniqueWithoutAuthorInput
+  >;
+  deleteMany?: Maybe<CommentScalarWhereInput[] | CommentScalarWhereInput>;
+  updateMany?: Maybe<
+    | CommentUpdateManyWithWhereNestedInput[]
+    | CommentUpdateManyWithWhereNestedInput
+  >;
+}
+
+export interface CommentUpdateWithWhereUniqueWithoutAuthorInput {
+  where: CommentWhereUniqueInput;
+  data: CommentUpdateWithoutAuthorDataInput;
+}
+
+export interface CommentUpdateWithoutAuthorDataInput {
+  text?: Maybe<String>;
+}
+
+export interface CommentUpsertWithWhereUniqueWithoutAuthorInput {
+  where: CommentWhereUniqueInput;
+  update: CommentUpdateWithoutAuthorDataInput;
+  create: CommentCreateWithoutAuthorInput;
+}
+
+export interface CommentScalarWhereInput {
+  id?: Maybe<ID_Input>;
+  id_not?: Maybe<ID_Input>;
+  id_in?: Maybe<ID_Input[] | ID_Input>;
+  id_not_in?: Maybe<ID_Input[] | ID_Input>;
+  id_lt?: Maybe<ID_Input>;
+  id_lte?: Maybe<ID_Input>;
+  id_gt?: Maybe<ID_Input>;
+  id_gte?: Maybe<ID_Input>;
+  id_contains?: Maybe<ID_Input>;
+  id_not_contains?: Maybe<ID_Input>;
+  id_starts_with?: Maybe<ID_Input>;
+  id_not_starts_with?: Maybe<ID_Input>;
+  id_ends_with?: Maybe<ID_Input>;
+  id_not_ends_with?: Maybe<ID_Input>;
+  text?: Maybe<String>;
+  text_not?: Maybe<String>;
+  text_in?: Maybe<String[] | String>;
+  text_not_in?: Maybe<String[] | String>;
+  text_lt?: Maybe<String>;
+  text_lte?: Maybe<String>;
+  text_gt?: Maybe<String>;
+  text_gte?: Maybe<String>;
+  text_contains?: Maybe<String>;
+  text_not_contains?: Maybe<String>;
+  text_starts_with?: Maybe<String>;
+  text_not_starts_with?: Maybe<String>;
+  text_ends_with?: Maybe<String>;
+  text_not_ends_with?: Maybe<String>;
+  createdAt?: Maybe<DateTimeInput>;
+  createdAt_not?: Maybe<DateTimeInput>;
+  createdAt_in?: Maybe<DateTimeInput[] | DateTimeInput>;
+  createdAt_not_in?: Maybe<DateTimeInput[] | DateTimeInput>;
+  createdAt_lt?: Maybe<DateTimeInput>;
+  createdAt_lte?: Maybe<DateTimeInput>;
+  createdAt_gt?: Maybe<DateTimeInput>;
+  createdAt_gte?: Maybe<DateTimeInput>;
+  AND?: Maybe<CommentScalarWhereInput[] | CommentScalarWhereInput>;
+  OR?: Maybe<CommentScalarWhereInput[] | CommentScalarWhereInput>;
+  NOT?: Maybe<CommentScalarWhereInput[] | CommentScalarWhereInput>;
+}
+
+export interface CommentUpdateManyWithWhereNestedInput {
+  where: CommentScalarWhereInput;
+  data: CommentUpdateManyDataInput;
+}
+
+export interface CommentUpdateManyDataInput {
+  text?: Maybe<String>;
+}
+
+export interface UserUpsertWithoutRatingsInput {
+  update: UserUpdateWithoutRatingsDataInput;
+  create: UserCreateWithoutRatingsInput;
+}
+
+export interface RatingUpdateManyMutationInput {
+  value?: Maybe<Int>;
+  comment?: Maybe<String>;
+}
+
+export interface TrackUpdateInput {
+  title?: Maybe<String>;
+  artist?: Maybe<String>;
+  duration?: Maybe<Int>;
+  link?: Maybe<String>;
+}
+
+export interface TrackUpdateManyMutationInput {
+  title?: Maybe<String>;
+  artist?: Maybe<String>;
+  duration?: Maybe<Int>;
+  link?: Maybe<String>;
+}
+
+export interface TrainingCreateInput {
+  id?: Maybe<ID_Input>;
+  title: String;
+  type: TrainingTypeCreateOneInput;
+  trainingDate?: Maybe<DateTimeInput>;
+  location?: Maybe<String>;
+  registrations?: Maybe<UserCreateManyInput>;
+  attendance?: Maybe<Int>;
+  ratings?: Maybe<RatingCreateManyInput>;
+  published: Boolean;
+  blocks?: Maybe<BlockCreateManyInput>;
+}
+
+export interface TrainingTypeCreateOneInput {
+  create?: Maybe<TrainingTypeCreateInput>;
+  connect?: Maybe<TrainingTypeWhereUniqueInput>;
+}
+
+export interface TrainingTypeCreateInput {
+  id?: Maybe<ID_Input>;
+  name: String;
+  description: String;
+}
+
+export interface UserCreateManyInput {
+  create?: Maybe<UserCreateInput[] | UserCreateInput>;
+  connect?: Maybe<UserWhereUniqueInput[] | UserWhereUniqueInput>;
+}
+
+export interface UserCreateInput {
+  id?: Maybe<ID_Input>;
+  email: String;
+  name: String;
+  password: String;
+  resetToken?: Maybe<String>;
+  resetTokenExpiry?: Maybe<Float>;
+  comments?: Maybe<CommentCreateManyWithoutAuthorInput>;
+  ratings?: Maybe<RatingCreateManyWithoutUserInput>;
+  permissions?: Maybe<UserCreatepermissionsInput>;
+  interests?: Maybe<UserCreateinterestsInput>;
+}
+
+export interface RatingCreateManyInput {
+  create?: Maybe<RatingCreateInput[] | RatingCreateInput>;
+  connect?: Maybe<RatingWhereUniqueInput[] | RatingWhereUniqueInput>;
+}
+
+export interface TrainingUpdateInput {
+  title?: Maybe<String>;
+  type?: Maybe<TrainingTypeUpdateOneRequiredInput>;
+  trainingDate?: Maybe<DateTimeInput>;
+  location?: Maybe<String>;
+  registrations?: Maybe<UserUpdateManyInput>;
+  attendance?: Maybe<Int>;
+  ratings?: Maybe<RatingUpdateManyInput>;
+  published?: Maybe<Boolean>;
+  blocks?: Maybe<BlockUpdateManyInput>;
+}
+
+export interface TrainingTypeUpdateOneRequiredInput {
+  create?: Maybe<TrainingTypeCreateInput>;
+  update?: Maybe<TrainingTypeUpdateDataInput>;
+  upsert?: Maybe<TrainingTypeUpsertNestedInput>;
+  connect?: Maybe<TrainingTypeWhereUniqueInput>;
+}
+
+export interface TrainingTypeUpdateDataInput {
+  name?: Maybe<String>;
+  description?: Maybe<String>;
+}
+
+export interface TrainingTypeUpsertNestedInput {
+  update: TrainingTypeUpdateDataInput;
+  create: TrainingTypeCreateInput;
+}
+
+export interface UserUpdateManyInput {
+  create?: Maybe<UserCreateInput[] | UserCreateInput>;
+  update?: Maybe<
+    | UserUpdateWithWhereUniqueNestedInput[]
+    | UserUpdateWithWhereUniqueNestedInput
+  >;
+  upsert?: Maybe<
+    | UserUpsertWithWhereUniqueNestedInput[]
+    | UserUpsertWithWhereUniqueNestedInput
+  >;
+  delete?: Maybe<UserWhereUniqueInput[] | UserWhereUniqueInput>;
+  connect?: Maybe<UserWhereUniqueInput[] | UserWhereUniqueInput>;
+  set?: Maybe<UserWhereUniqueInput[] | UserWhereUniqueInput>;
+  disconnect?: Maybe<UserWhereUniqueInput[] | UserWhereUniqueInput>;
+  deleteMany?: Maybe<UserScalarWhereInput[] | UserScalarWhereInput>;
+  updateMany?: Maybe<
+    UserUpdateManyWithWhereNestedInput[] | UserUpdateManyWithWhereNestedInput
+  >;
+}
+
+export interface UserUpdateWithWhereUniqueNestedInput {
+  where: UserWhereUniqueInput;
+  data: UserUpdateDataInput;
+}
+
+export interface UserUpdateDataInput {
+  email?: Maybe<String>;
+  name?: Maybe<String>;
+  password?: Maybe<String>;
+  resetToken?: Maybe<String>;
+  resetTokenExpiry?: Maybe<Float>;
+  comments?: Maybe<CommentUpdateManyWithoutAuthorInput>;
+  ratings?: Maybe<RatingUpdateManyWithoutUserInput>;
+  permissions?: Maybe<UserUpdatepermissionsInput>;
+  interests?: Maybe<UserUpdateinterestsInput>;
+}
+
+export interface UserUpsertWithWhereUniqueNestedInput {
+  where: UserWhereUniqueInput;
+  update: UserUpdateDataInput;
+  create: UserCreateInput;
+}
+
+export interface UserScalarWhereInput {
+  id?: Maybe<ID_Input>;
+  id_not?: Maybe<ID_Input>;
+  id_in?: Maybe<ID_Input[] | ID_Input>;
+  id_not_in?: Maybe<ID_Input[] | ID_Input>;
+  id_lt?: Maybe<ID_Input>;
+  id_lte?: Maybe<ID_Input>;
+  id_gt?: Maybe<ID_Input>;
+  id_gte?: Maybe<ID_Input>;
+  id_contains?: Maybe<ID_Input>;
+  id_not_contains?: Maybe<ID_Input>;
+  id_starts_with?: Maybe<ID_Input>;
+  id_not_starts_with?: Maybe<ID_Input>;
+  id_ends_with?: Maybe<ID_Input>;
+  id_not_ends_with?: Maybe<ID_Input>;
+  email?: Maybe<String>;
+  email_not?: Maybe<String>;
+  email_in?: Maybe<String[] | String>;
+  email_not_in?: Maybe<String[] | String>;
+  email_lt?: Maybe<String>;
+  email_lte?: Maybe<String>;
+  email_gt?: Maybe<String>;
+  email_gte?: Maybe<String>;
+  email_contains?: Maybe<String>;
+  email_not_contains?: Maybe<String>;
+  email_starts_with?: Maybe<String>;
+  email_not_starts_with?: Maybe<String>;
+  email_ends_with?: Maybe<String>;
+  email_not_ends_with?: Maybe<String>;
+  name?: Maybe<String>;
+  name_not?: Maybe<String>;
+  name_in?: Maybe<String[] | String>;
+  name_not_in?: Maybe<String[] | String>;
+  name_lt?: Maybe<String>;
+  name_lte?: Maybe<String>;
+  name_gt?: Maybe<String>;
+  name_gte?: Maybe<String>;
+  name_contains?: Maybe<String>;
+  name_not_contains?: Maybe<String>;
+  name_starts_with?: Maybe<String>;
+  name_not_starts_with?: Maybe<String>;
+  name_ends_with?: Maybe<String>;
+  name_not_ends_with?: Maybe<String>;
+  password?: Maybe<String>;
+  password_not?: Maybe<String>;
+  password_in?: Maybe<String[] | String>;
+  password_not_in?: Maybe<String[] | String>;
+  password_lt?: Maybe<String>;
+  password_lte?: Maybe<String>;
+  password_gt?: Maybe<String>;
+  password_gte?: Maybe<String>;
+  password_contains?: Maybe<String>;
+  password_not_contains?: Maybe<String>;
+  password_starts_with?: Maybe<String>;
+  password_not_starts_with?: Maybe<String>;
+  password_ends_with?: Maybe<String>;
+  password_not_ends_with?: Maybe<String>;
+  resetToken?: Maybe<String>;
+  resetToken_not?: Maybe<String>;
+  resetToken_in?: Maybe<String[] | String>;
+  resetToken_not_in?: Maybe<String[] | String>;
+  resetToken_lt?: Maybe<String>;
+  resetToken_lte?: Maybe<String>;
+  resetToken_gt?: Maybe<String>;
+  resetToken_gte?: Maybe<String>;
+  resetToken_contains?: Maybe<String>;
+  resetToken_not_contains?: Maybe<String>;
+  resetToken_starts_with?: Maybe<String>;
+  resetToken_not_starts_with?: Maybe<String>;
+  resetToken_ends_with?: Maybe<String>;
+  resetToken_not_ends_with?: Maybe<String>;
+  resetTokenExpiry?: Maybe<Float>;
+  resetTokenExpiry_not?: Maybe<Float>;
+  resetTokenExpiry_in?: Maybe<Float[] | Float>;
+  resetTokenExpiry_not_in?: Maybe<Float[] | Float>;
+  resetTokenExpiry_lt?: Maybe<Float>;
+  resetTokenExpiry_lte?: Maybe<Float>;
+  resetTokenExpiry_gt?: Maybe<Float>;
+  resetTokenExpiry_gte?: Maybe<Float>;
+  createdAt?: Maybe<DateTimeInput>;
+  createdAt_not?: Maybe<DateTimeInput>;
+  createdAt_in?: Maybe<DateTimeInput[] | DateTimeInput>;
+  createdAt_not_in?: Maybe<DateTimeInput[] | DateTimeInput>;
+  createdAt_lt?: Maybe<DateTimeInput>;
+  createdAt_lte?: Maybe<DateTimeInput>;
+  createdAt_gt?: Maybe<DateTimeInput>;
+  createdAt_gte?: Maybe<DateTimeInput>;
+  AND?: Maybe<UserScalarWhereInput[] | UserScalarWhereInput>;
+  OR?: Maybe<UserScalarWhereInput[] | UserScalarWhereInput>;
+  NOT?: Maybe<UserScalarWhereInput[] | UserScalarWhereInput>;
+}
+
+export interface UserUpdateManyWithWhereNestedInput {
+  where: UserScalarWhereInput;
+  data: UserUpdateManyDataInput;
+}
+
+export interface UserUpdateManyDataInput {
+  email?: Maybe<String>;
+  name?: Maybe<String>;
+  password?: Maybe<String>;
+  resetToken?: Maybe<String>;
+  resetTokenExpiry?: Maybe<Float>;
+  permissions?: Maybe<UserUpdatepermissionsInput>;
+  interests?: Maybe<UserUpdateinterestsInput>;
+}
+
+export interface RatingUpdateManyInput {
+  create?: Maybe<RatingCreateInput[] | RatingCreateInput>;
+  update?: Maybe<
+    | RatingUpdateWithWhereUniqueNestedInput[]
+    | RatingUpdateWithWhereUniqueNestedInput
+  >;
+  upsert?: Maybe<
+    | RatingUpsertWithWhereUniqueNestedInput[]
+    | RatingUpsertWithWhereUniqueNestedInput
+  >;
+  delete?: Maybe<RatingWhereUniqueInput[] | RatingWhereUniqueInput>;
+  connect?: Maybe<RatingWhereUniqueInput[] | RatingWhereUniqueInput>;
+  set?: Maybe<RatingWhereUniqueInput[] | RatingWhereUniqueInput>;
+  disconnect?: Maybe<RatingWhereUniqueInput[] | RatingWhereUniqueInput>;
+  deleteMany?: Maybe<RatingScalarWhereInput[] | RatingScalarWhereInput>;
+  updateMany?: Maybe<
+    | RatingUpdateManyWithWhereNestedInput[]
+    | RatingUpdateManyWithWhereNestedInput
+  >;
+}
+
+export interface RatingUpdateWithWhereUniqueNestedInput {
+  where: RatingWhereUniqueInput;
+  data: RatingUpdateDataInput;
+}
+
+export interface RatingUpdateDataInput {
+  user?: Maybe<UserUpdateOneRequiredWithoutRatingsInput>;
+  value?: Maybe<Int>;
+  comment?: Maybe<String>;
+}
+
+export interface RatingUpsertWithWhereUniqueNestedInput {
+  where: RatingWhereUniqueInput;
+  update: RatingUpdateDataInput;
+  create: RatingCreateInput;
+}
+
+export interface TrainingUpdateManyMutationInput {
+  title?: Maybe<String>;
+  trainingDate?: Maybe<DateTimeInput>;
+  location?: Maybe<String>;
+  attendance?: Maybe<Int>;
+  published?: Maybe<Boolean>;
+}
+
+export interface TrainingTypeUpdateInput {
+  name?: Maybe<String>;
+  description?: Maybe<String>;
+}
+
+export interface TrainingTypeUpdateManyMutationInput {
+  name?: Maybe<String>;
+  description?: Maybe<String>;
+}
+
+export interface UserUpdateInput {
+  email?: Maybe<String>;
+  name?: Maybe<String>;
+  password?: Maybe<String>;
+  resetToken?: Maybe<String>;
+  resetTokenExpiry?: Maybe<Float>;
+  comments?: Maybe<CommentUpdateManyWithoutAuthorInput>;
+  ratings?: Maybe<RatingUpdateManyWithoutUserInput>;
+  permissions?: Maybe<UserUpdatepermissionsInput>;
+  interests?: Maybe<UserUpdateinterestsInput>;
+}
+
+export interface UserUpdateManyMutationInput {
+  email?: Maybe<String>;
+  name?: Maybe<String>;
+  password?: Maybe<String>;
+  resetToken?: Maybe<String>;
+  resetTokenExpiry?: Maybe<Float>;
+  permissions?: Maybe<UserUpdatepermissionsInput>;
+  interests?: Maybe<UserUpdateinterestsInput>;
+}
+
+export interface BlockSubscriptionWhereInput {
+  mutation_in?: Maybe<MutationType[] | MutationType>;
+  updatedFields_contains?: Maybe<String>;
+  updatedFields_contains_every?: Maybe<String[] | String>;
+  updatedFields_contains_some?: Maybe<String[] | String>;
+  node?: Maybe<BlockWhereInput>;
+  AND?: Maybe<BlockSubscriptionWhereInput[] | BlockSubscriptionWhereInput>;
+  OR?: Maybe<BlockSubscriptionWhereInput[] | BlockSubscriptionWhereInput>;
+  NOT?: Maybe<BlockSubscriptionWhereInput[] | BlockSubscriptionWhereInput>;
+}
+
+export interface CommentSubscriptionWhereInput {
+  mutation_in?: Maybe<MutationType[] | MutationType>;
+  updatedFields_contains?: Maybe<String>;
+  updatedFields_contains_every?: Maybe<String[] | String>;
+  updatedFields_contains_some?: Maybe<String[] | String>;
+  node?: Maybe<CommentWhereInput>;
+  AND?: Maybe<CommentSubscriptionWhereInput[] | CommentSubscriptionWhereInput>;
+  OR?: Maybe<CommentSubscriptionWhereInput[] | CommentSubscriptionWhereInput>;
+  NOT?: Maybe<CommentSubscriptionWhereInput[] | CommentSubscriptionWhereInput>;
+}
+
+export interface ExerciseSubscriptionWhereInput {
+  mutation_in?: Maybe<MutationType[] | MutationType>;
+  updatedFields_contains?: Maybe<String>;
+  updatedFields_contains_every?: Maybe<String[] | String>;
+  updatedFields_contains_some?: Maybe<String[] | String>;
+  node?: Maybe<ExerciseWhereInput>;
+  AND?: Maybe<
+    ExerciseSubscriptionWhereInput[] | ExerciseSubscriptionWhereInput
+  >;
+  OR?: Maybe<ExerciseSubscriptionWhereInput[] | ExerciseSubscriptionWhereInput>;
+  NOT?: Maybe<
+    ExerciseSubscriptionWhereInput[] | ExerciseSubscriptionWhereInput
+  >;
+}
+
+export interface ExerciseInstanceSubscriptionWhereInput {
+  mutation_in?: Maybe<MutationType[] | MutationType>;
+  updatedFields_contains?: Maybe<String>;
+  updatedFields_contains_every?: Maybe<String[] | String>;
+  updatedFields_contains_some?: Maybe<String[] | String>;
+  node?: Maybe<ExerciseInstanceWhereInput>;
+  AND?: Maybe<
+    | ExerciseInstanceSubscriptionWhereInput[]
+    | ExerciseInstanceSubscriptionWhereInput
+  >;
+  OR?: Maybe<
+    | ExerciseInstanceSubscriptionWhereInput[]
+    | ExerciseInstanceSubscriptionWhereInput
+  >;
+  NOT?: Maybe<
+    | ExerciseInstanceSubscriptionWhereInput[]
+    | ExerciseInstanceSubscriptionWhereInput
+  >;
+}
+
+export interface FormatSubscriptionWhereInput {
+  mutation_in?: Maybe<MutationType[] | MutationType>;
+  updatedFields_contains?: Maybe<String>;
+  updatedFields_contains_every?: Maybe<String[] | String>;
+  updatedFields_contains_some?: Maybe<String[] | String>;
+  node?: Maybe<FormatWhereInput>;
+  AND?: Maybe<FormatSubscriptionWhereInput[] | FormatSubscriptionWhereInput>;
+  OR?: Maybe<FormatSubscriptionWhereInput[] | FormatSubscriptionWhereInput>;
+  NOT?: Maybe<FormatSubscriptionWhereInput[] | FormatSubscriptionWhereInput>;
+}
+
+export interface RatingSubscriptionWhereInput {
+  mutation_in?: Maybe<MutationType[] | MutationType>;
+  updatedFields_contains?: Maybe<String>;
+  updatedFields_contains_every?: Maybe<String[] | String>;
+  updatedFields_contains_some?: Maybe<String[] | String>;
+  node?: Maybe<RatingWhereInput>;
+  AND?: Maybe<RatingSubscriptionWhereInput[] | RatingSubscriptionWhereInput>;
+  OR?: Maybe<RatingSubscriptionWhereInput[] | RatingSubscriptionWhereInput>;
+  NOT?: Maybe<RatingSubscriptionWhereInput[] | RatingSubscriptionWhereInput>;
+}
+
+export interface TrackSubscriptionWhereInput {
+  mutation_in?: Maybe<MutationType[] | MutationType>;
+  updatedFields_contains?: Maybe<String>;
+  updatedFields_contains_every?: Maybe<String[] | String>;
+  updatedFields_contains_some?: Maybe<String[] | String>;
+  node?: Maybe<TrackWhereInput>;
+  AND?: Maybe<TrackSubscriptionWhereInput[] | TrackSubscriptionWhereInput>;
+  OR?: Maybe<TrackSubscriptionWhereInput[] | TrackSubscriptionWhereInput>;
+  NOT?: Maybe<TrackSubscriptionWhereInput[] | TrackSubscriptionWhereInput>;
+}
+
+export interface TrainingSubscriptionWhereInput {
+  mutation_in?: Maybe<MutationType[] | MutationType>;
+  updatedFields_contains?: Maybe<String>;
+  updatedFields_contains_every?: Maybe<String[] | String>;
+  updatedFields_contains_some?: Maybe<String[] | String>;
+  node?: Maybe<TrainingWhereInput>;
+  AND?: Maybe<
+    TrainingSubscriptionWhereInput[] | TrainingSubscriptionWhereInput
+  >;
+  OR?: Maybe<TrainingSubscriptionWhereInput[] | TrainingSubscriptionWhereInput>;
+  NOT?: Maybe<
+    TrainingSubscriptionWhereInput[] | TrainingSubscriptionWhereInput
+  >;
+}
+
+export interface TrainingTypeSubscriptionWhereInput {
+  mutation_in?: Maybe<MutationType[] | MutationType>;
+  updatedFields_contains?: Maybe<String>;
+  updatedFields_contains_every?: Maybe<String[] | String>;
+  updatedFields_contains_some?: Maybe<String[] | String>;
+  node?: Maybe<TrainingTypeWhereInput>;
+  AND?: Maybe<
+    TrainingTypeSubscriptionWhereInput[] | TrainingTypeSubscriptionWhereInput
+  >;
+  OR?: Maybe<
+    TrainingTypeSubscriptionWhereInput[] | TrainingTypeSubscriptionWhereInput
+  >;
+  NOT?: Maybe<
+    TrainingTypeSubscriptionWhereInput[] | TrainingTypeSubscriptionWhereInput
+  >;
+}
+
+export interface UserSubscriptionWhereInput {
+  mutation_in?: Maybe<MutationType[] | MutationType>;
+  updatedFields_contains?: Maybe<String>;
+  updatedFields_contains_every?: Maybe<String[] | String>;
+  updatedFields_contains_some?: Maybe<String[] | String>;
+  node?: Maybe<UserWhereInput>;
+  AND?: Maybe<UserSubscriptionWhereInput[] | UserSubscriptionWhereInput>;
+  OR?: Maybe<UserSubscriptionWhereInput[] | UserSubscriptionWhereInput>;
+  NOT?: Maybe<UserSubscriptionWhereInput[] | UserSubscriptionWhereInput>;
+}
+
+export interface NodeNode {
+  id: ID_Output;
+}
+
+export interface Block {
+  id: ID_Output;
+  sequence: Int;
+  title: String;
+  description?: String;
+  videos: String[];
+  pictures: String[];
+  duration?: Int;
+  rounds?: Int;
+  rest?: Int;
+}
+
+export interface BlockPromise extends Promise<Block>, Fragmentable {
+  id: () => Promise<ID_Output>;
+  sequence: () => Promise<Int>;
+  title: () => Promise<String>;
+  description: () => Promise<String>;
+  videos: () => Promise<String[]>;
+  pictures: () => Promise<String[]>;
+  duration: () => Promise<Int>;
+  rounds: () => Promise<Int>;
+  format: <T = FormatPromise>() => T;
+  rest: () => Promise<Int>;
+  tracks: <T = FragmentableArray<Track>>(args?: {
+    where?: TrackWhereInput;
+    orderBy?: TrackOrderByInput;
+    skip?: Int;
+    after?: String;
+    before?: String;
+    first?: Int;
+    last?: Int;
+  }) => T;
+  blocks: <T = FragmentableArray<Block>>(args?: {
+    where?: BlockWhereInput;
+    orderBy?: BlockOrderByInput;
+    skip?: Int;
+    after?: String;
+    before?: String;
+    first?: Int;
+    last?: Int;
+  }) => T;
+  exercises: <T = FragmentableArray<ExerciseInstance>>(args?: {
+    where?: ExerciseInstanceWhereInput;
+    orderBy?: ExerciseInstanceOrderByInput;
+    skip?: Int;
+    after?: String;
+    before?: String;
+    first?: Int;
+    last?: Int;
+  }) => T;
+}
+
+export interface BlockSubscription
+  extends Promise<AsyncIterator<Block>>,
+    Fragmentable {
+  id: () => Promise<AsyncIterator<ID_Output>>;
+  sequence: () => Promise<AsyncIterator<Int>>;
+  title: () => Promise<AsyncIterator<String>>;
+  description: () => Promise<AsyncIterator<String>>;
+  videos: () => Promise<AsyncIterator<String[]>>;
+  pictures: () => Promise<AsyncIterator<String[]>>;
+  duration: () => Promise<AsyncIterator<Int>>;
+  rounds: () => Promise<AsyncIterator<Int>>;
+  format: <T = FormatSubscription>() => T;
+  rest: () => Promise<AsyncIterator<Int>>;
+  tracks: <T = Promise<AsyncIterator<TrackSubscription>>>(args?: {
+    where?: TrackWhereInput;
+    orderBy?: TrackOrderByInput;
+    skip?: Int;
+    after?: String;
+    before?: String;
+    first?: Int;
+    last?: Int;
+  }) => T;
+  blocks: <T = Promise<AsyncIterator<BlockSubscription>>>(args?: {
+    where?: BlockWhereInput;
+    orderBy?: BlockOrderByInput;
+    skip?: Int;
+    after?: String;
+    before?: String;
+    first?: Int;
+    last?: Int;
+  }) => T;
+  exercises: <T = Promise<AsyncIterator<ExerciseInstanceSubscription>>>(args?: {
+    where?: ExerciseInstanceWhereInput;
+    orderBy?: ExerciseInstanceOrderByInput;
+    skip?: Int;
+    after?: String;
+    before?: String;
+    first?: Int;
+    last?: Int;
+  }) => T;
+}
+
+export interface BlockNullablePromise
+  extends Promise<Block | null>,
+    Fragmentable {
+  id: () => Promise<ID_Output>;
+  sequence: () => Promise<Int>;
+  title: () => Promise<String>;
+  description: () => Promise<String>;
+  videos: () => Promise<String[]>;
+  pictures: () => Promise<String[]>;
+  duration: () => Promise<Int>;
+  rounds: () => Promise<Int>;
+  format: <T = FormatPromise>() => T;
+  rest: () => Promise<Int>;
+  tracks: <T = FragmentableArray<Track>>(args?: {
+    where?: TrackWhereInput;
+    orderBy?: TrackOrderByInput;
+    skip?: Int;
+    after?: String;
+    before?: String;
+    first?: Int;
+    last?: Int;
+  }) => T;
+  blocks: <T = FragmentableArray<Block>>(args?: {
+    where?: BlockWhereInput;
+    orderBy?: BlockOrderByInput;
+    skip?: Int;
+    after?: String;
+    before?: String;
+    first?: Int;
+    last?: Int;
+  }) => T;
+  exercises: <T = FragmentableArray<ExerciseInstance>>(args?: {
+    where?: ExerciseInstanceWhereInput;
+    orderBy?: ExerciseInstanceOrderByInput;
+    skip?: Int;
+    after?: String;
+    before?: String;
+    first?: Int;
+    last?: Int;
+  }) => T;
+}
+
+export interface Format {
+  id: ID_Output;
+  name: String;
+  description: String;
+}
+
+export interface FormatPromise extends Promise<Format>, Fragmentable {
+  id: () => Promise<ID_Output>;
+  name: () => Promise<String>;
+  description: () => Promise<String>;
+}
+
+export interface FormatSubscription
+  extends Promise<AsyncIterator<Format>>,
+    Fragmentable {
+  id: () => Promise<AsyncIterator<ID_Output>>;
+  name: () => Promise<AsyncIterator<String>>;
+  description: () => Promise<AsyncIterator<String>>;
+}
+
+export interface FormatNullablePromise
+  extends Promise<Format | null>,
+    Fragmentable {
+  id: () => Promise<ID_Output>;
+  name: () => Promise<String>;
+  description: () => Promise<String>;
+}
+
+export interface Track {
+  id: ID_Output;
+  title: String;
+  artist: String;
+  duration: Int;
+  link: String;
+}
+
+export interface TrackPromise extends Promise<Track>, Fragmentable {
+  id: () => Promise<ID_Output>;
+  title: () => Promise<String>;
+  artist: () => Promise<String>;
+  duration: () => Promise<Int>;
+  link: () => Promise<String>;
+}
+
+export interface TrackSubscription
+  extends Promise<AsyncIterator<Track>>,
+    Fragmentable {
+  id: () => Promise<AsyncIterator<ID_Output>>;
+  title: () => Promise<AsyncIterator<String>>;
+  artist: () => Promise<AsyncIterator<String>>;
+  duration: () => Promise<AsyncIterator<Int>>;
+  link: () => Promise<AsyncIterator<String>>;
+}
+
+export interface TrackNullablePromise
+  extends Promise<Track | null>,
+    Fragmentable {
+  id: () => Promise<ID_Output>;
+  title: () => Promise<String>;
+  artist: () => Promise<String>;
+  duration: () => Promise<Int>;
+  link: () => Promise<String>;
+}
+
+export interface ExerciseInstance {
+  id: ID_Output;
+  repetitions?: Int;
+}
+
+export interface ExerciseInstancePromise
+  extends Promise<ExerciseInstance>,
+    Fragmentable {
+  id: () => Promise<ID_Output>;
+  exercise: <T = ExercisePromise>() => T;
+  repetitions: () => Promise<Int>;
+}
+
+export interface ExerciseInstanceSubscription
+  extends Promise<AsyncIterator<ExerciseInstance>>,
+    Fragmentable {
+  id: () => Promise<AsyncIterator<ID_Output>>;
+  exercise: <T = ExerciseSubscription>() => T;
+  repetitions: () => Promise<AsyncIterator<Int>>;
+}
+
+export interface ExerciseInstanceNullablePromise
+  extends Promise<ExerciseInstance | null>,
+    Fragmentable {
+  id: () => Promise<ID_Output>;
+  exercise: <T = ExercisePromise>() => T;
+  repetitions: () => Promise<Int>;
+}
+
+export interface Exercise {
+  id: ID_Output;
+  name: String;
+  description: String;
+  video: String;
+  targets: String[];
+  baseExercise: String[];
+}
+
+export interface ExercisePromise extends Promise<Exercise>, Fragmentable {
+  id: () => Promise<ID_Output>;
+  name: () => Promise<String>;
+  description: () => Promise<String>;
+  video: () => Promise<String>;
+  targets: () => Promise<String[]>;
+  baseExercise: () => Promise<String[]>;
+}
+
+export interface ExerciseSubscription
+  extends Promise<AsyncIterator<Exercise>>,
+    Fragmentable {
+  id: () => Promise<AsyncIterator<ID_Output>>;
+  name: () => Promise<AsyncIterator<String>>;
+  description: () => Promise<AsyncIterator<String>>;
+  video: () => Promise<AsyncIterator<String>>;
+  targets: () => Promise<AsyncIterator<String[]>>;
+  baseExercise: () => Promise<AsyncIterator<String[]>>;
+}
+
+export interface ExerciseNullablePromise
+  extends Promise<Exercise | null>,
+    Fragmentable {
+  id: () => Promise<ID_Output>;
+  name: () => Promise<String>;
+  description: () => Promise<String>;
+  video: () => Promise<String>;
+  targets: () => Promise<String[]>;
+  baseExercise: () => Promise<String[]>;
+}
+
+export interface BlockConnection {
+  pageInfo: PageInfo;
+  edges: BlockEdge[];
+}
+
+export interface BlockConnectionPromise
+  extends Promise<BlockConnection>,
+    Fragmentable {
+  pageInfo: <T = PageInfoPromise>() => T;
+  edges: <T = FragmentableArray<BlockEdge>>() => T;
+  aggregate: <T = AggregateBlockPromise>() => T;
+}
+
+export interface BlockConnectionSubscription
+  extends Promise<AsyncIterator<BlockConnection>>,
+    Fragmentable {
+  pageInfo: <T = PageInfoSubscription>() => T;
+  edges: <T = Promise<AsyncIterator<BlockEdgeSubscription>>>() => T;
+  aggregate: <T = AggregateBlockSubscription>() => T;
+}
+
+export interface PageInfo {
+  hasNextPage: Boolean;
+  hasPreviousPage: Boolean;
+  startCursor?: String;
+  endCursor?: String;
+}
+
+export interface PageInfoPromise extends Promise<PageInfo>, Fragmentable {
+  hasNextPage: () => Promise<Boolean>;
+  hasPreviousPage: () => Promise<Boolean>;
+  startCursor: () => Promise<String>;
+  endCursor: () => Promise<String>;
+}
+
+export interface PageInfoSubscription
+  extends Promise<AsyncIterator<PageInfo>>,
+    Fragmentable {
+  hasNextPage: () => Promise<AsyncIterator<Boolean>>;
+  hasPreviousPage: () => Promise<AsyncIterator<Boolean>>;
+  startCursor: () => Promise<AsyncIterator<String>>;
+  endCursor: () => Promise<AsyncIterator<String>>;
+}
+
+export interface BlockEdge {
+  node: Block;
+  cursor: String;
+}
+
+export interface BlockEdgePromise extends Promise<BlockEdge>, Fragmentable {
+  node: <T = BlockPromise>() => T;
+  cursor: () => Promise<String>;
+}
+
+export interface BlockEdgeSubscription
+  extends Promise<AsyncIterator<BlockEdge>>,
+    Fragmentable {
+  node: <T = BlockSubscription>() => T;
+  cursor: () => Promise<AsyncIterator<String>>;
+}
+
+export interface AggregateBlock {
+  count: Int;
+}
+
+export interface AggregateBlockPromise
+  extends Promise<AggregateBlock>,
+    Fragmentable {
+  count: () => Promise<Int>;
+}
+
+export interface AggregateBlockSubscription
+  extends Promise<AsyncIterator<AggregateBlock>>,
+    Fragmentable {
+  count: () => Promise<AsyncIterator<Int>>;
+}
+
+export interface Comment {
+  id: ID_Output;
+  text: String;
+  createdAt: DateTimeOutput;
+}
+
+export interface CommentPromise extends Promise<Comment>, Fragmentable {
+  id: () => Promise<ID_Output>;
+  text: () => Promise<String>;
+  author: <T = UserPromise>() => T;
+  createdAt: () => Promise<DateTimeOutput>;
+}
+
+export interface CommentSubscription
+  extends Promise<AsyncIterator<Comment>>,
+    Fragmentable {
+  id: () => Promise<AsyncIterator<ID_Output>>;
+  text: () => Promise<AsyncIterator<String>>;
+  author: <T = UserSubscription>() => T;
+  createdAt: () => Promise<AsyncIterator<DateTimeOutput>>;
+}
+
+export interface CommentNullablePromise
+  extends Promise<Comment | null>,
+    Fragmentable {
+  id: () => Promise<ID_Output>;
+  text: () => Promise<String>;
+  author: <T = UserPromise>() => T;
+  createdAt: () => Promise<DateTimeOutput>;
+}
+
+export interface User {
+  id: ID_Output;
+  email: String;
+  name: String;
+  password: String;
+  resetToken?: String;
+  resetTokenExpiry?: Float;
+  createdAt: DateTimeOutput;
+  permissions: Permission[];
+  interests: String[];
+}
+
+export interface UserPromise extends Promise<User>, Fragmentable {
+  id: () => Promise<ID_Output>;
+  email: () => Promise<String>;
+  name: () => Promise<String>;
+  password: () => Promise<String>;
+  resetToken: () => Promise<String>;
+  resetTokenExpiry: () => Promise<Float>;
+  createdAt: () => Promise<DateTimeOutput>;
+  comments: <T = FragmentableArray<Comment>>(args?: {
+    where?: CommentWhereInput;
+    orderBy?: CommentOrderByInput;
+    skip?: Int;
+    after?: String;
+    before?: String;
+    first?: Int;
+    last?: Int;
+  }) => T;
+  ratings: <T = FragmentableArray<Rating>>(args?: {
+    where?: RatingWhereInput;
+    orderBy?: RatingOrderByInput;
+    skip?: Int;
+    after?: String;
+    before?: String;
+    first?: Int;
+    last?: Int;
+  }) => T;
+  permissions: () => Promise<Permission[]>;
+  interests: () => Promise<String[]>;
+}
+
+export interface UserSubscription
+  extends Promise<AsyncIterator<User>>,
+    Fragmentable {
+  id: () => Promise<AsyncIterator<ID_Output>>;
+  email: () => Promise<AsyncIterator<String>>;
+  name: () => Promise<AsyncIterator<String>>;
+  password: () => Promise<AsyncIterator<String>>;
+  resetToken: () => Promise<AsyncIterator<String>>;
+  resetTokenExpiry: () => Promise<AsyncIterator<Float>>;
+  createdAt: () => Promise<AsyncIterator<DateTimeOutput>>;
+  comments: <T = Promise<AsyncIterator<CommentSubscription>>>(args?: {
+    where?: CommentWhereInput;
+    orderBy?: CommentOrderByInput;
+    skip?: Int;
+    after?: String;
+    before?: String;
+    first?: Int;
+    last?: Int;
+  }) => T;
+  ratings: <T = Promise<AsyncIterator<RatingSubscription>>>(args?: {
+    where?: RatingWhereInput;
+    orderBy?: RatingOrderByInput;
+    skip?: Int;
+    after?: String;
+    before?: String;
+    first?: Int;
+    last?: Int;
+  }) => T;
+  permissions: () => Promise<AsyncIterator<Permission[]>>;
+  interests: () => Promise<AsyncIterator<String[]>>;
+}
+
+export interface UserNullablePromise
+  extends Promise<User | null>,
+    Fragmentable {
+  id: () => Promise<ID_Output>;
+  email: () => Promise<String>;
+  name: () => Promise<String>;
+  password: () => Promise<String>;
+  resetToken: () => Promise<String>;
+  resetTokenExpiry: () => Promise<Float>;
+  createdAt: () => Promise<DateTimeOutput>;
+  comments: <T = FragmentableArray<Comment>>(args?: {
+    where?: CommentWhereInput;
+    orderBy?: CommentOrderByInput;
+    skip?: Int;
+    after?: String;
+    before?: String;
+    first?: Int;
+    last?: Int;
+  }) => T;
+  ratings: <T = FragmentableArray<Rating>>(args?: {
+    where?: RatingWhereInput;
+    orderBy?: RatingOrderByInput;
+    skip?: Int;
+    after?: String;
+    before?: String;
+    first?: Int;
+    last?: Int;
+  }) => T;
+  permissions: () => Promise<Permission[]>;
+  interests: () => Promise<String[]>;
+}
+
+export interface Rating {
+  id: ID_Output;
+  value: Int;
+  comment: String;
+  createdAt: DateTimeOutput;
+}
+
+export interface RatingPromise extends Promise<Rating>, Fragmentable {
+  id: () => Promise<ID_Output>;
+  user: <T = UserPromise>() => T;
+  value: () => Promise<Int>;
+  comment: () => Promise<String>;
+  createdAt: () => Promise<DateTimeOutput>;
+}
+
+export interface RatingSubscription
+  extends Promise<AsyncIterator<Rating>>,
+    Fragmentable {
+  id: () => Promise<AsyncIterator<ID_Output>>;
+  user: <T = UserSubscription>() => T;
+  value: () => Promise<AsyncIterator<Int>>;
+  comment: () => Promise<AsyncIterator<String>>;
+  createdAt: () => Promise<AsyncIterator<DateTimeOutput>>;
+}
+
+export interface RatingNullablePromise
+  extends Promise<Rating | null>,
+    Fragmentable {
+  id: () => Promise<ID_Output>;
+  user: <T = UserPromise>() => T;
+  value: () => Promise<Int>;
+  comment: () => Promise<String>;
+  createdAt: () => Promise<DateTimeOutput>;
+}
+
+export interface CommentConnection {
+  pageInfo: PageInfo;
+  edges: CommentEdge[];
+}
+
+export interface CommentConnectionPromise
+  extends Promise<CommentConnection>,
+    Fragmentable {
+  pageInfo: <T = PageInfoPromise>() => T;
+  edges: <T = FragmentableArray<CommentEdge>>() => T;
+  aggregate: <T = AggregateCommentPromise>() => T;
+}
+
+export interface CommentConnectionSubscription
+  extends Promise<AsyncIterator<CommentConnection>>,
+    Fragmentable {
+  pageInfo: <T = PageInfoSubscription>() => T;
+  edges: <T = Promise<AsyncIterator<CommentEdgeSubscription>>>() => T;
+  aggregate: <T = AggregateCommentSubscription>() => T;
+}
+
+export interface CommentEdge {
+  node: Comment;
+  cursor: String;
+}
+
+export interface CommentEdgePromise extends Promise<CommentEdge>, Fragmentable {
+  node: <T = CommentPromise>() => T;
+  cursor: () => Promise<String>;
+}
+
+export interface CommentEdgeSubscription
+  extends Promise<AsyncIterator<CommentEdge>>,
+    Fragmentable {
+  node: <T = CommentSubscription>() => T;
+  cursor: () => Promise<AsyncIterator<String>>;
+}
+
+export interface AggregateComment {
+  count: Int;
+}
+
+export interface AggregateCommentPromise
+  extends Promise<AggregateComment>,
+    Fragmentable {
+  count: () => Promise<Int>;
+}
+
+export interface AggregateCommentSubscription
+  extends Promise<AsyncIterator<AggregateComment>>,
+    Fragmentable {
+  count: () => Promise<AsyncIterator<Int>>;
+}
+
+export interface ExerciseConnection {
+  pageInfo: PageInfo;
+  edges: ExerciseEdge[];
+}
+
+export interface ExerciseConnectionPromise
+  extends Promise<ExerciseConnection>,
+    Fragmentable {
+  pageInfo: <T = PageInfoPromise>() => T;
+  edges: <T = FragmentableArray<ExerciseEdge>>() => T;
+  aggregate: <T = AggregateExercisePromise>() => T;
+}
+
+export interface ExerciseConnectionSubscription
+  extends Promise<AsyncIterator<ExerciseConnection>>,
+    Fragmentable {
+  pageInfo: <T = PageInfoSubscription>() => T;
+  edges: <T = Promise<AsyncIterator<ExerciseEdgeSubscription>>>() => T;
+  aggregate: <T = AggregateExerciseSubscription>() => T;
+}
+
+export interface ExerciseEdge {
+  node: Exercise;
+  cursor: String;
+}
+
+export interface ExerciseEdgePromise
+  extends Promise<ExerciseEdge>,
+    Fragmentable {
+  node: <T = ExercisePromise>() => T;
+  cursor: () => Promise<String>;
+}
+
+export interface ExerciseEdgeSubscription
+  extends Promise<AsyncIterator<ExerciseEdge>>,
+    Fragmentable {
+  node: <T = ExerciseSubscription>() => T;
+  cursor: () => Promise<AsyncIterator<String>>;
+}
+
+export interface AggregateExercise {
+  count: Int;
+}
+
+export interface AggregateExercisePromise
+  extends Promise<AggregateExercise>,
+    Fragmentable {
+  count: () => Promise<Int>;
+}
+
+export interface AggregateExerciseSubscription
+  extends Promise<AsyncIterator<AggregateExercise>>,
+    Fragmentable {
+  count: () => Promise<AsyncIterator<Int>>;
+}
+
+export interface ExerciseInstanceConnection {
+  pageInfo: PageInfo;
+  edges: ExerciseInstanceEdge[];
+}
+
+export interface ExerciseInstanceConnectionPromise
+  extends Promise<ExerciseInstanceConnection>,
+    Fragmentable {
+  pageInfo: <T = PageInfoPromise>() => T;
+  edges: <T = FragmentableArray<ExerciseInstanceEdge>>() => T;
+  aggregate: <T = AggregateExerciseInstancePromise>() => T;
+}
+
+export interface ExerciseInstanceConnectionSubscription
+  extends Promise<AsyncIterator<ExerciseInstanceConnection>>,
+    Fragmentable {
+  pageInfo: <T = PageInfoSubscription>() => T;
+  edges: <T = Promise<AsyncIterator<ExerciseInstanceEdgeSubscription>>>() => T;
+  aggregate: <T = AggregateExerciseInstanceSubscription>() => T;
+}
+
+export interface ExerciseInstanceEdge {
+  node: ExerciseInstance;
+  cursor: String;
+}
+
+export interface ExerciseInstanceEdgePromise
+  extends Promise<ExerciseInstanceEdge>,
+    Fragmentable {
+  node: <T = ExerciseInstancePromise>() => T;
+  cursor: () => Promise<String>;
+}
+
+export interface ExerciseInstanceEdgeSubscription
+  extends Promise<AsyncIterator<ExerciseInstanceEdge>>,
+    Fragmentable {
+  node: <T = ExerciseInstanceSubscription>() => T;
+  cursor: () => Promise<AsyncIterator<String>>;
+}
+
+export interface AggregateExerciseInstance {
+  count: Int;
+}
+
+export interface AggregateExerciseInstancePromise
+  extends Promise<AggregateExerciseInstance>,
+    Fragmentable {
+  count: () => Promise<Int>;
+}
+
+export interface AggregateExerciseInstanceSubscription
+  extends Promise<AsyncIterator<AggregateExerciseInstance>>,
+    Fragmentable {
+  count: () => Promise<AsyncIterator<Int>>;
+}
+
+export interface FormatConnection {
+  pageInfo: PageInfo;
+  edges: FormatEdge[];
+}
+
+export interface FormatConnectionPromise
+  extends Promise<FormatConnection>,
+    Fragmentable {
+  pageInfo: <T = PageInfoPromise>() => T;
+  edges: <T = FragmentableArray<FormatEdge>>() => T;
+  aggregate: <T = AggregateFormatPromise>() => T;
+}
+
+export interface FormatConnectionSubscription
+  extends Promise<AsyncIterator<FormatConnection>>,
+    Fragmentable {
+  pageInfo: <T = PageInfoSubscription>() => T;
+  edges: <T = Promise<AsyncIterator<FormatEdgeSubscription>>>() => T;
+  aggregate: <T = AggregateFormatSubscription>() => T;
+}
+
+export interface FormatEdge {
+  node: Format;
+  cursor: String;
+}
+
+export interface FormatEdgePromise extends Promise<FormatEdge>, Fragmentable {
+  node: <T = FormatPromise>() => T;
+  cursor: () => Promise<String>;
+}
+
+export interface FormatEdgeSubscription
+  extends Promise<AsyncIterator<FormatEdge>>,
+    Fragmentable {
+  node: <T = FormatSubscription>() => T;
+  cursor: () => Promise<AsyncIterator<String>>;
+}
+
+export interface AggregateFormat {
+  count: Int;
+}
+
+export interface AggregateFormatPromise
+  extends Promise<AggregateFormat>,
+    Fragmentable {
+  count: () => Promise<Int>;
+}
+
+export interface AggregateFormatSubscription
+  extends Promise<AsyncIterator<AggregateFormat>>,
+    Fragmentable {
+  count: () => Promise<AsyncIterator<Int>>;
+}
+
+export interface RatingConnection {
+  pageInfo: PageInfo;
+  edges: RatingEdge[];
+}
+
+export interface RatingConnectionPromise
+  extends Promise<RatingConnection>,
+    Fragmentable {
+  pageInfo: <T = PageInfoPromise>() => T;
+  edges: <T = FragmentableArray<RatingEdge>>() => T;
+  aggregate: <T = AggregateRatingPromise>() => T;
+}
+
+export interface RatingConnectionSubscription
+  extends Promise<AsyncIterator<RatingConnection>>,
+    Fragmentable {
+  pageInfo: <T = PageInfoSubscription>() => T;
+  edges: <T = Promise<AsyncIterator<RatingEdgeSubscription>>>() => T;
+  aggregate: <T = AggregateRatingSubscription>() => T;
+}
+
+export interface RatingEdge {
+  node: Rating;
+  cursor: String;
+}
+
+export interface RatingEdgePromise extends Promise<RatingEdge>, Fragmentable {
+  node: <T = RatingPromise>() => T;
+  cursor: () => Promise<String>;
+}
+
+export interface RatingEdgeSubscription
+  extends Promise<AsyncIterator<RatingEdge>>,
+    Fragmentable {
+  node: <T = RatingSubscription>() => T;
+  cursor: () => Promise<AsyncIterator<String>>;
+}
+
+export interface AggregateRating {
+  count: Int;
+}
+
+export interface AggregateRatingPromise
+  extends Promise<AggregateRating>,
+    Fragmentable {
+  count: () => Promise<Int>;
+}
+
+export interface AggregateRatingSubscription
+  extends Promise<AsyncIterator<AggregateRating>>,
+    Fragmentable {
+  count: () => Promise<AsyncIterator<Int>>;
+}
+
+export interface TrackConnection {
+  pageInfo: PageInfo;
+  edges: TrackEdge[];
+}
+
+export interface TrackConnectionPromise
+  extends Promise<TrackConnection>,
+    Fragmentable {
+  pageInfo: <T = PageInfoPromise>() => T;
+  edges: <T = FragmentableArray<TrackEdge>>() => T;
+  aggregate: <T = AggregateTrackPromise>() => T;
+}
+
+export interface TrackConnectionSubscription
+  extends Promise<AsyncIterator<TrackConnection>>,
+    Fragmentable {
+  pageInfo: <T = PageInfoSubscription>() => T;
+  edges: <T = Promise<AsyncIterator<TrackEdgeSubscription>>>() => T;
+  aggregate: <T = AggregateTrackSubscription>() => T;
+}
+
+export interface TrackEdge {
+  node: Track;
+  cursor: String;
+}
+
+export interface TrackEdgePromise extends Promise<TrackEdge>, Fragmentable {
+  node: <T = TrackPromise>() => T;
+  cursor: () => Promise<String>;
+}
+
+export interface TrackEdgeSubscription
+  extends Promise<AsyncIterator<TrackEdge>>,
+    Fragmentable {
+  node: <T = TrackSubscription>() => T;
+  cursor: () => Promise<AsyncIterator<String>>;
+}
+
+export interface AggregateTrack {
+  count: Int;
+}
+
+export interface AggregateTrackPromise
+  extends Promise<AggregateTrack>,
+    Fragmentable {
+  count: () => Promise<Int>;
+}
+
+export interface AggregateTrackSubscription
+  extends Promise<AsyncIterator<AggregateTrack>>,
+    Fragmentable {
+  count: () => Promise<AsyncIterator<Int>>;
+}
+
+export interface Training {
+  id: ID_Output;
+  title: String;
+  createdAt: DateTimeOutput;
+  trainingDate?: DateTimeOutput;
+  location?: String;
+  attendance?: Int;
+  published: Boolean;
+}
+
+export interface TrainingPromise extends Promise<Training>, Fragmentable {
+  id: () => Promise<ID_Output>;
+  title: () => Promise<String>;
+  type: <T = TrainingTypePromise>() => T;
+  createdAt: () => Promise<DateTimeOutput>;
+  trainingDate: () => Promise<DateTimeOutput>;
+  location: () => Promise<String>;
+  registrations: <T = FragmentableArray<User>>(args?: {
+    where?: UserWhereInput;
+    orderBy?: UserOrderByInput;
+    skip?: Int;
+    after?: String;
+    before?: String;
+    first?: Int;
+    last?: Int;
+  }) => T;
+  attendance: () => Promise<Int>;
+  ratings: <T = FragmentableArray<Rating>>(args?: {
+    where?: RatingWhereInput;
+    orderBy?: RatingOrderByInput;
+    skip?: Int;
+    after?: String;
+    before?: String;
+    first?: Int;
+    last?: Int;
+  }) => T;
+  published: () => Promise<Boolean>;
+  blocks: <T = FragmentableArray<Block>>(args?: {
+    where?: BlockWhereInput;
+    orderBy?: BlockOrderByInput;
+    skip?: Int;
+    after?: String;
+    before?: String;
+    first?: Int;
+    last?: Int;
+  }) => T;
+}
+
+export interface TrainingSubscription
+  extends Promise<AsyncIterator<Training>>,
+    Fragmentable {
+  id: () => Promise<AsyncIterator<ID_Output>>;
+  title: () => Promise<AsyncIterator<String>>;
+  type: <T = TrainingTypeSubscription>() => T;
+  createdAt: () => Promise<AsyncIterator<DateTimeOutput>>;
+  trainingDate: () => Promise<AsyncIterator<DateTimeOutput>>;
+  location: () => Promise<AsyncIterator<String>>;
+  registrations: <T = Promise<AsyncIterator<UserSubscription>>>(args?: {
+    where?: UserWhereInput;
+    orderBy?: UserOrderByInput;
+    skip?: Int;
+    after?: String;
+    before?: String;
+    first?: Int;
+    last?: Int;
+  }) => T;
+  attendance: () => Promise<AsyncIterator<Int>>;
+  ratings: <T = Promise<AsyncIterator<RatingSubscription>>>(args?: {
+    where?: RatingWhereInput;
+    orderBy?: RatingOrderByInput;
+    skip?: Int;
+    after?: String;
+    before?: String;
+    first?: Int;
+    last?: Int;
+  }) => T;
+  published: () => Promise<AsyncIterator<Boolean>>;
+  blocks: <T = Promise<AsyncIterator<BlockSubscription>>>(args?: {
+    where?: BlockWhereInput;
+    orderBy?: BlockOrderByInput;
+    skip?: Int;
+    after?: String;
+    before?: String;
+    first?: Int;
+    last?: Int;
+  }) => T;
+}
+
+export interface TrainingNullablePromise
+  extends Promise<Training | null>,
+    Fragmentable {
+  id: () => Promise<ID_Output>;
+  title: () => Promise<String>;
+  type: <T = TrainingTypePromise>() => T;
+  createdAt: () => Promise<DateTimeOutput>;
+  trainingDate: () => Promise<DateTimeOutput>;
+  location: () => Promise<String>;
+  registrations: <T = FragmentableArray<User>>(args?: {
+    where?: UserWhereInput;
+    orderBy?: UserOrderByInput;
+    skip?: Int;
+    after?: String;
+    before?: String;
+    first?: Int;
+    last?: Int;
+  }) => T;
+  attendance: () => Promise<Int>;
+  ratings: <T = FragmentableArray<Rating>>(args?: {
+    where?: RatingWhereInput;
+    orderBy?: RatingOrderByInput;
+    skip?: Int;
+    after?: String;
+    before?: String;
+    first?: Int;
+    last?: Int;
+  }) => T;
+  published: () => Promise<Boolean>;
+  blocks: <T = FragmentableArray<Block>>(args?: {
+    where?: BlockWhereInput;
+    orderBy?: BlockOrderByInput;
+    skip?: Int;
+    after?: String;
+    before?: String;
+    first?: Int;
+    last?: Int;
+  }) => T;
+}
+
+export interface TrainingType {
+  id: ID_Output;
+  name: String;
+  description: String;
+}
+
+export interface TrainingTypePromise
+  extends Promise<TrainingType>,
+    Fragmentable {
+  id: () => Promise<ID_Output>;
+  name: () => Promise<String>;
+  description: () => Promise<String>;
+}
+
+export interface TrainingTypeSubscription
+  extends Promise<AsyncIterator<TrainingType>>,
+    Fragmentable {
+  id: () => Promise<AsyncIterator<ID_Output>>;
+  name: () => Promise<AsyncIterator<String>>;
+  description: () => Promise<AsyncIterator<String>>;
+}
+
+export interface TrainingTypeNullablePromise
+  extends Promise<TrainingType | null>,
+    Fragmentable {
+  id: () => Promise<ID_Output>;
+  name: () => Promise<String>;
+  description: () => Promise<String>;
+}
+
+export interface TrainingConnection {
+  pageInfo: PageInfo;
+  edges: TrainingEdge[];
+}
+
+export interface TrainingConnectionPromise
+  extends Promise<TrainingConnection>,
+    Fragmentable {
+  pageInfo: <T = PageInfoPromise>() => T;
+  edges: <T = FragmentableArray<TrainingEdge>>() => T;
+  aggregate: <T = AggregateTrainingPromise>() => T;
+}
+
+export interface TrainingConnectionSubscription
+  extends Promise<AsyncIterator<TrainingConnection>>,
+    Fragmentable {
+  pageInfo: <T = PageInfoSubscription>() => T;
+  edges: <T = Promise<AsyncIterator<TrainingEdgeSubscription>>>() => T;
+  aggregate: <T = AggregateTrainingSubscription>() => T;
+}
+
+export interface TrainingEdge {
+  node: Training;
+  cursor: String;
+}
+
+export interface TrainingEdgePromise
+  extends Promise<TrainingEdge>,
+    Fragmentable {
+  node: <T = TrainingPromise>() => T;
+  cursor: () => Promise<String>;
+}
+
+export interface TrainingEdgeSubscription
+  extends Promise<AsyncIterator<TrainingEdge>>,
+    Fragmentable {
+  node: <T = TrainingSubscription>() => T;
+  cursor: () => Promise<AsyncIterator<String>>;
+}
+
+export interface AggregateTraining {
+  count: Int;
+}
+
+export interface AggregateTrainingPromise
+  extends Promise<AggregateTraining>,
+    Fragmentable {
+  count: () => Promise<Int>;
+}
+
+export interface AggregateTrainingSubscription
+  extends Promise<AsyncIterator<AggregateTraining>>,
+    Fragmentable {
+  count: () => Promise<AsyncIterator<Int>>;
+}
+
+export interface TrainingTypeConnection {
+  pageInfo: PageInfo;
+  edges: TrainingTypeEdge[];
+}
+
+export interface TrainingTypeConnectionPromise
+  extends Promise<TrainingTypeConnection>,
+    Fragmentable {
+  pageInfo: <T = PageInfoPromise>() => T;
+  edges: <T = FragmentableArray<TrainingTypeEdge>>() => T;
+  aggregate: <T = AggregateTrainingTypePromise>() => T;
+}
+
+export interface TrainingTypeConnectionSubscription
+  extends Promise<AsyncIterator<TrainingTypeConnection>>,
+    Fragmentable {
+  pageInfo: <T = PageInfoSubscription>() => T;
+  edges: <T = Promise<AsyncIterator<TrainingTypeEdgeSubscription>>>() => T;
+  aggregate: <T = AggregateTrainingTypeSubscription>() => T;
+}
+
+export interface TrainingTypeEdge {
+  node: TrainingType;
+  cursor: String;
+}
+
+export interface TrainingTypeEdgePromise
+  extends Promise<TrainingTypeEdge>,
+    Fragmentable {
+  node: <T = TrainingTypePromise>() => T;
+  cursor: () => Promise<String>;
+}
+
+export interface TrainingTypeEdgeSubscription
+  extends Promise<AsyncIterator<TrainingTypeEdge>>,
+    Fragmentable {
+  node: <T = TrainingTypeSubscription>() => T;
+  cursor: () => Promise<AsyncIterator<String>>;
+}
+
+export interface AggregateTrainingType {
+  count: Int;
+}
+
+export interface AggregateTrainingTypePromise
+  extends Promise<AggregateTrainingType>,
+    Fragmentable {
+  count: () => Promise<Int>;
+}
+
+export interface AggregateTrainingTypeSubscription
+  extends Promise<AsyncIterator<AggregateTrainingType>>,
+    Fragmentable {
+  count: () => Promise<AsyncIterator<Int>>;
+}
+
+export interface UserConnection {
+  pageInfo: PageInfo;
+  edges: UserEdge[];
+}
+
+export interface UserConnectionPromise
+  extends Promise<UserConnection>,
+    Fragmentable {
+  pageInfo: <T = PageInfoPromise>() => T;
+  edges: <T = FragmentableArray<UserEdge>>() => T;
+  aggregate: <T = AggregateUserPromise>() => T;
+}
+
+export interface UserConnectionSubscription
+  extends Promise<AsyncIterator<UserConnection>>,
+    Fragmentable {
+  pageInfo: <T = PageInfoSubscription>() => T;
+  edges: <T = Promise<AsyncIterator<UserEdgeSubscription>>>() => T;
+  aggregate: <T = AggregateUserSubscription>() => T;
+}
+
+export interface UserEdge {
+  node: User;
+  cursor: String;
+}
+
+export interface UserEdgePromise extends Promise<UserEdge>, Fragmentable {
+  node: <T = UserPromise>() => T;
+  cursor: () => Promise<String>;
+}
+
+export interface UserEdgeSubscription
+  extends Promise<AsyncIterator<UserEdge>>,
+    Fragmentable {
+  node: <T = UserSubscription>() => T;
+  cursor: () => Promise<AsyncIterator<String>>;
+}
+
+export interface AggregateUser {
+  count: Int;
+}
+
+export interface AggregateUserPromise
+  extends Promise<AggregateUser>,
+    Fragmentable {
+  count: () => Promise<Int>;
+}
+
+export interface AggregateUserSubscription
+  extends Promise<AsyncIterator<AggregateUser>>,
+    Fragmentable {
+  count: () => Promise<AsyncIterator<Int>>;
+}
+
+export interface BatchPayload {
+  count: Long;
+}
+
+export interface BatchPayloadPromise
+  extends Promise<BatchPayload>,
+    Fragmentable {
+  count: () => Promise<Long>;
+}
+
+export interface BatchPayloadSubscription
+  extends Promise<AsyncIterator<BatchPayload>>,
+    Fragmentable {
+  count: () => Promise<AsyncIterator<Long>>;
+}
+
+export interface BlockSubscriptionPayload {
+  mutation: MutationType;
+  node: Block;
+  updatedFields: String[];
+  previousValues: BlockPreviousValues;
+}
+
+export interface BlockSubscriptionPayloadPromise
+  extends Promise<BlockSubscriptionPayload>,
+    Fragmentable {
+  mutation: () => Promise<MutationType>;
+  node: <T = BlockPromise>() => T;
+  updatedFields: () => Promise<String[]>;
+  previousValues: <T = BlockPreviousValuesPromise>() => T;
+}
+
+export interface BlockSubscriptionPayloadSubscription
+  extends Promise<AsyncIterator<BlockSubscriptionPayload>>,
+    Fragmentable {
+  mutation: () => Promise<AsyncIterator<MutationType>>;
+  node: <T = BlockSubscription>() => T;
+  updatedFields: () => Promise<AsyncIterator<String[]>>;
+  previousValues: <T = BlockPreviousValuesSubscription>() => T;
+}
+
+export interface BlockPreviousValues {
+  id: ID_Output;
+  sequence: Int;
+  title: String;
+  description?: String;
+  videos: String[];
+  pictures: String[];
+  duration?: Int;
+  rounds?: Int;
+  rest?: Int;
+}
+
+export interface BlockPreviousValuesPromise
+  extends Promise<BlockPreviousValues>,
+    Fragmentable {
+  id: () => Promise<ID_Output>;
+  sequence: () => Promise<Int>;
+  title: () => Promise<String>;
+  description: () => Promise<String>;
+  videos: () => Promise<String[]>;
+  pictures: () => Promise<String[]>;
+  duration: () => Promise<Int>;
+  rounds: () => Promise<Int>;
+  rest: () => Promise<Int>;
+}
+
+export interface BlockPreviousValuesSubscription
+  extends Promise<AsyncIterator<BlockPreviousValues>>,
+    Fragmentable {
+  id: () => Promise<AsyncIterator<ID_Output>>;
+  sequence: () => Promise<AsyncIterator<Int>>;
+  title: () => Promise<AsyncIterator<String>>;
+  description: () => Promise<AsyncIterator<String>>;
+  videos: () => Promise<AsyncIterator<String[]>>;
+  pictures: () => Promise<AsyncIterator<String[]>>;
+  duration: () => Promise<AsyncIterator<Int>>;
+  rounds: () => Promise<AsyncIterator<Int>>;
+  rest: () => Promise<AsyncIterator<Int>>;
+}
+
+export interface CommentSubscriptionPayload {
+  mutation: MutationType;
+  node: Comment;
+  updatedFields: String[];
+  previousValues: CommentPreviousValues;
+}
+
+export interface CommentSubscriptionPayloadPromise
+  extends Promise<CommentSubscriptionPayload>,
+    Fragmentable {
+  mutation: () => Promise<MutationType>;
+  node: <T = CommentPromise>() => T;
+  updatedFields: () => Promise<String[]>;
+  previousValues: <T = CommentPreviousValuesPromise>() => T;
+}
+
+export interface CommentSubscriptionPayloadSubscription
+  extends Promise<AsyncIterator<CommentSubscriptionPayload>>,
+    Fragmentable {
+  mutation: () => Promise<AsyncIterator<MutationType>>;
+  node: <T = CommentSubscription>() => T;
+  updatedFields: () => Promise<AsyncIterator<String[]>>;
+  previousValues: <T = CommentPreviousValuesSubscription>() => T;
+}
+
+export interface CommentPreviousValues {
+  id: ID_Output;
+  text: String;
+  createdAt: DateTimeOutput;
+}
+
+export interface CommentPreviousValuesPromise
+  extends Promise<CommentPreviousValues>,
+    Fragmentable {
+  id: () => Promise<ID_Output>;
+  text: () => Promise<String>;
+  createdAt: () => Promise<DateTimeOutput>;
+}
+
+export interface CommentPreviousValuesSubscription
+  extends Promise<AsyncIterator<CommentPreviousValues>>,
+    Fragmentable {
+  id: () => Promise<AsyncIterator<ID_Output>>;
+  text: () => Promise<AsyncIterator<String>>;
+  createdAt: () => Promise<AsyncIterator<DateTimeOutput>>;
+}
+
+export interface ExerciseSubscriptionPayload {
+  mutation: MutationType;
+  node: Exercise;
+  updatedFields: String[];
+  previousValues: ExercisePreviousValues;
+}
+
+export interface ExerciseSubscriptionPayloadPromise
+  extends Promise<ExerciseSubscriptionPayload>,
+    Fragmentable {
+  mutation: () => Promise<MutationType>;
+  node: <T = ExercisePromise>() => T;
+  updatedFields: () => Promise<String[]>;
+  previousValues: <T = ExercisePreviousValuesPromise>() => T;
+}
+
+export interface ExerciseSubscriptionPayloadSubscription
+  extends Promise<AsyncIterator<ExerciseSubscriptionPayload>>,
+    Fragmentable {
+  mutation: () => Promise<AsyncIterator<MutationType>>;
+  node: <T = ExerciseSubscription>() => T;
+  updatedFields: () => Promise<AsyncIterator<String[]>>;
+  previousValues: <T = ExercisePreviousValuesSubscription>() => T;
+}
+
+export interface ExercisePreviousValues {
+  id: ID_Output;
+  name: String;
+  description: String;
+  video: String;
+  targets: String[];
+  baseExercise: String[];
+}
+
+export interface ExercisePreviousValuesPromise
+  extends Promise<ExercisePreviousValues>,
+    Fragmentable {
+  id: () => Promise<ID_Output>;
+  name: () => Promise<String>;
+  description: () => Promise<String>;
+  video: () => Promise<String>;
+  targets: () => Promise<String[]>;
+  baseExercise: () => Promise<String[]>;
+}
+
+export interface ExercisePreviousValuesSubscription
+  extends Promise<AsyncIterator<ExercisePreviousValues>>,
+    Fragmentable {
+  id: () => Promise<AsyncIterator<ID_Output>>;
+  name: () => Promise<AsyncIterator<String>>;
+  description: () => Promise<AsyncIterator<String>>;
+  video: () => Promise<AsyncIterator<String>>;
+  targets: () => Promise<AsyncIterator<String[]>>;
+  baseExercise: () => Promise<AsyncIterator<String[]>>;
+}
+
+export interface ExerciseInstanceSubscriptionPayload {
+  mutation: MutationType;
+  node: ExerciseInstance;
+  updatedFields: String[];
+  previousValues: ExerciseInstancePreviousValues;
+}
+
+export interface ExerciseInstanceSubscriptionPayloadPromise
+  extends Promise<ExerciseInstanceSubscriptionPayload>,
+    Fragmentable {
+  mutation: () => Promise<MutationType>;
+  node: <T = ExerciseInstancePromise>() => T;
+  updatedFields: () => Promise<String[]>;
+  previousValues: <T = ExerciseInstancePreviousValuesPromise>() => T;
+}
+
+export interface ExerciseInstanceSubscriptionPayloadSubscription
+  extends Promise<AsyncIterator<ExerciseInstanceSubscriptionPayload>>,
+    Fragmentable {
+  mutation: () => Promise<AsyncIterator<MutationType>>;
+  node: <T = ExerciseInstanceSubscription>() => T;
+  updatedFields: () => Promise<AsyncIterator<String[]>>;
+  previousValues: <T = ExerciseInstancePreviousValuesSubscription>() => T;
+}
+
+export interface ExerciseInstancePreviousValues {
+  id: ID_Output;
+  repetitions?: Int;
+}
+
+export interface ExerciseInstancePreviousValuesPromise
+  extends Promise<ExerciseInstancePreviousValues>,
+    Fragmentable {
+  id: () => Promise<ID_Output>;
+  repetitions: () => Promise<Int>;
+}
+
+export interface ExerciseInstancePreviousValuesSubscription
+  extends Promise<AsyncIterator<ExerciseInstancePreviousValues>>,
+    Fragmentable {
+  id: () => Promise<AsyncIterator<ID_Output>>;
+  repetitions: () => Promise<AsyncIterator<Int>>;
+}
+
+export interface FormatSubscriptionPayload {
+  mutation: MutationType;
+  node: Format;
+  updatedFields: String[];
+  previousValues: FormatPreviousValues;
+}
+
+export interface FormatSubscriptionPayloadPromise
+  extends Promise<FormatSubscriptionPayload>,
+    Fragmentable {
+  mutation: () => Promise<MutationType>;
+  node: <T = FormatPromise>() => T;
+  updatedFields: () => Promise<String[]>;
+  previousValues: <T = FormatPreviousValuesPromise>() => T;
+}
+
+export interface FormatSubscriptionPayloadSubscription
+  extends Promise<AsyncIterator<FormatSubscriptionPayload>>,
+    Fragmentable {
+  mutation: () => Promise<AsyncIterator<MutationType>>;
+  node: <T = FormatSubscription>() => T;
+  updatedFields: () => Promise<AsyncIterator<String[]>>;
+  previousValues: <T = FormatPreviousValuesSubscription>() => T;
+}
+
+export interface FormatPreviousValues {
+  id: ID_Output;
+  name: String;
+  description: String;
+}
+
+export interface FormatPreviousValuesPromise
+  extends Promise<FormatPreviousValues>,
+    Fragmentable {
+  id: () => Promise<ID_Output>;
+  name: () => Promise<String>;
+  description: () => Promise<String>;
+}
+
+export interface FormatPreviousValuesSubscription
+  extends Promise<AsyncIterator<FormatPreviousValues>>,
+    Fragmentable {
+  id: () => Promise<AsyncIterator<ID_Output>>;
+  name: () => Promise<AsyncIterator<String>>;
+  description: () => Promise<AsyncIterator<String>>;
+}
+
+export interface RatingSubscriptionPayload {
+  mutation: MutationType;
+  node: Rating;
+  updatedFields: String[];
+  previousValues: RatingPreviousValues;
+}
+
+export interface RatingSubscriptionPayloadPromise
+  extends Promise<RatingSubscriptionPayload>,
+    Fragmentable {
+  mutation: () => Promise<MutationType>;
+  node: <T = RatingPromise>() => T;
+  updatedFields: () => Promise<String[]>;
+  previousValues: <T = RatingPreviousValuesPromise>() => T;
+}
+
+export interface RatingSubscriptionPayloadSubscription
+  extends Promise<AsyncIterator<RatingSubscriptionPayload>>,
+    Fragmentable {
+  mutation: () => Promise<AsyncIterator<MutationType>>;
+  node: <T = RatingSubscription>() => T;
+  updatedFields: () => Promise<AsyncIterator<String[]>>;
+  previousValues: <T = RatingPreviousValuesSubscription>() => T;
+}
+
+export interface RatingPreviousValues {
+  id: ID_Output;
+  value: Int;
+  comment: String;
+  createdAt: DateTimeOutput;
+}
+
+export interface RatingPreviousValuesPromise
+  extends Promise<RatingPreviousValues>,
+    Fragmentable {
+  id: () => Promise<ID_Output>;
+  value: () => Promise<Int>;
+  comment: () => Promise<String>;
+  createdAt: () => Promise<DateTimeOutput>;
+}
+
+export interface RatingPreviousValuesSubscription
+  extends Promise<AsyncIterator<RatingPreviousValues>>,
+    Fragmentable {
+  id: () => Promise<AsyncIterator<ID_Output>>;
+  value: () => Promise<AsyncIterator<Int>>;
+  comment: () => Promise<AsyncIterator<String>>;
+  createdAt: () => Promise<AsyncIterator<DateTimeOutput>>;
+}
+
+export interface TrackSubscriptionPayload {
+  mutation: MutationType;
+  node: Track;
+  updatedFields: String[];
+  previousValues: TrackPreviousValues;
+}
+
+export interface TrackSubscriptionPayloadPromise
+  extends Promise<TrackSubscriptionPayload>,
+    Fragmentable {
+  mutation: () => Promise<MutationType>;
+  node: <T = TrackPromise>() => T;
+  updatedFields: () => Promise<String[]>;
+  previousValues: <T = TrackPreviousValuesPromise>() => T;
+}
+
+export interface TrackSubscriptionPayloadSubscription
+  extends Promise<AsyncIterator<TrackSubscriptionPayload>>,
+    Fragmentable {
+  mutation: () => Promise<AsyncIterator<MutationType>>;
+  node: <T = TrackSubscription>() => T;
+  updatedFields: () => Promise<AsyncIterator<String[]>>;
+  previousValues: <T = TrackPreviousValuesSubscription>() => T;
+}
+
+export interface TrackPreviousValues {
+  id: ID_Output;
+  title: String;
+  artist: String;
+  duration: Int;
+  link: String;
+}
+
+export interface TrackPreviousValuesPromise
+  extends Promise<TrackPreviousValues>,
+    Fragmentable {
+  id: () => Promise<ID_Output>;
+  title: () => Promise<String>;
+  artist: () => Promise<String>;
+  duration: () => Promise<Int>;
+  link: () => Promise<String>;
+}
+
+export interface TrackPreviousValuesSubscription
+  extends Promise<AsyncIterator<TrackPreviousValues>>,
+    Fragmentable {
+  id: () => Promise<AsyncIterator<ID_Output>>;
+  title: () => Promise<AsyncIterator<String>>;
+  artist: () => Promise<AsyncIterator<String>>;
+  duration: () => Promise<AsyncIterator<Int>>;
+  link: () => Promise<AsyncIterator<String>>;
+}
+
+export interface TrainingSubscriptionPayload {
+  mutation: MutationType;
+  node: Training;
+  updatedFields: String[];
+  previousValues: TrainingPreviousValues;
+}
+
+export interface TrainingSubscriptionPayloadPromise
+  extends Promise<TrainingSubscriptionPayload>,
+    Fragmentable {
+  mutation: () => Promise<MutationType>;
+  node: <T = TrainingPromise>() => T;
+  updatedFields: () => Promise<String[]>;
+  previousValues: <T = TrainingPreviousValuesPromise>() => T;
+}
+
+export interface TrainingSubscriptionPayloadSubscription
+  extends Promise<AsyncIterator<TrainingSubscriptionPayload>>,
+    Fragmentable {
+  mutation: () => Promise<AsyncIterator<MutationType>>;
+  node: <T = TrainingSubscription>() => T;
+  updatedFields: () => Promise<AsyncIterator<String[]>>;
+  previousValues: <T = TrainingPreviousValuesSubscription>() => T;
+}
+
+export interface TrainingPreviousValues {
+  id: ID_Output;
+  title: String;
+  createdAt: DateTimeOutput;
+  trainingDate?: DateTimeOutput;
+  location?: String;
+  attendance?: Int;
+  published: Boolean;
+}
+
+export interface TrainingPreviousValuesPromise
+  extends Promise<TrainingPreviousValues>,
+    Fragmentable {
+  id: () => Promise<ID_Output>;
+  title: () => Promise<String>;
+  createdAt: () => Promise<DateTimeOutput>;
+  trainingDate: () => Promise<DateTimeOutput>;
+  location: () => Promise<String>;
+  attendance: () => Promise<Int>;
+  published: () => Promise<Boolean>;
+}
+
+export interface TrainingPreviousValuesSubscription
+  extends Promise<AsyncIterator<TrainingPreviousValues>>,
+    Fragmentable {
+  id: () => Promise<AsyncIterator<ID_Output>>;
+  title: () => Promise<AsyncIterator<String>>;
+  createdAt: () => Promise<AsyncIterator<DateTimeOutput>>;
+  trainingDate: () => Promise<AsyncIterator<DateTimeOutput>>;
+  location: () => Promise<AsyncIterator<String>>;
+  attendance: () => Promise<AsyncIterator<Int>>;
+  published: () => Promise<AsyncIterator<Boolean>>;
+}
+
+export interface TrainingTypeSubscriptionPayload {
+  mutation: MutationType;
+  node: TrainingType;
+  updatedFields: String[];
+  previousValues: TrainingTypePreviousValues;
+}
+
+export interface TrainingTypeSubscriptionPayloadPromise
+  extends Promise<TrainingTypeSubscriptionPayload>,
+    Fragmentable {
+  mutation: () => Promise<MutationType>;
+  node: <T = TrainingTypePromise>() => T;
+  updatedFields: () => Promise<String[]>;
+  previousValues: <T = TrainingTypePreviousValuesPromise>() => T;
+}
+
+export interface TrainingTypeSubscriptionPayloadSubscription
+  extends Promise<AsyncIterator<TrainingTypeSubscriptionPayload>>,
+    Fragmentable {
+  mutation: () => Promise<AsyncIterator<MutationType>>;
+  node: <T = TrainingTypeSubscription>() => T;
+  updatedFields: () => Promise<AsyncIterator<String[]>>;
+  previousValues: <T = TrainingTypePreviousValuesSubscription>() => T;
+}
+
+export interface TrainingTypePreviousValues {
+  id: ID_Output;
+  name: String;
+  description: String;
+}
+
+export interface TrainingTypePreviousValuesPromise
+  extends Promise<TrainingTypePreviousValues>,
+    Fragmentable {
+  id: () => Promise<ID_Output>;
+  name: () => Promise<String>;
+  description: () => Promise<String>;
+}
+
+export interface TrainingTypePreviousValuesSubscription
+  extends Promise<AsyncIterator<TrainingTypePreviousValues>>,
+    Fragmentable {
+  id: () => Promise<AsyncIterator<ID_Output>>;
+  name: () => Promise<AsyncIterator<String>>;
+  description: () => Promise<AsyncIterator<String>>;
+}
+
+export interface UserSubscriptionPayload {
+  mutation: MutationType;
+  node: User;
+  updatedFields: String[];
+  previousValues: UserPreviousValues;
+}
+
+export interface UserSubscriptionPayloadPromise
+  extends Promise<UserSubscriptionPayload>,
+    Fragmentable {
+  mutation: () => Promise<MutationType>;
+  node: <T = UserPromise>() => T;
+  updatedFields: () => Promise<String[]>;
+  previousValues: <T = UserPreviousValuesPromise>() => T;
+}
+
+export interface UserSubscriptionPayloadSubscription
+  extends Promise<AsyncIterator<UserSubscriptionPayload>>,
+    Fragmentable {
+  mutation: () => Promise<AsyncIterator<MutationType>>;
+  node: <T = UserSubscription>() => T;
+  updatedFields: () => Promise<AsyncIterator<String[]>>;
+  previousValues: <T = UserPreviousValuesSubscription>() => T;
+}
+
+export interface UserPreviousValues {
+  id: ID_Output;
+  email: String;
+  name: String;
+  password: String;
+  resetToken?: String;
+  resetTokenExpiry?: Float;
+  createdAt: DateTimeOutput;
+  permissions: Permission[];
+  interests: String[];
+}
+
+export interface UserPreviousValuesPromise
+  extends Promise<UserPreviousValues>,
+    Fragmentable {
+  id: () => Promise<ID_Output>;
+  email: () => Promise<String>;
+  name: () => Promise<String>;
+  password: () => Promise<String>;
+  resetToken: () => Promise<String>;
+  resetTokenExpiry: () => Promise<Float>;
+  createdAt: () => Promise<DateTimeOutput>;
+  permissions: () => Promise<Permission[]>;
+  interests: () => Promise<String[]>;
+}
+
+export interface UserPreviousValuesSubscription
+  extends Promise<AsyncIterator<UserPreviousValues>>,
+    Fragmentable {
+  id: () => Promise<AsyncIterator<ID_Output>>;
+  email: () => Promise<AsyncIterator<String>>;
+  name: () => Promise<AsyncIterator<String>>;
+  password: () => Promise<AsyncIterator<String>>;
+  resetToken: () => Promise<AsyncIterator<String>>;
+  resetTokenExpiry: () => Promise<AsyncIterator<Float>>;
+  createdAt: () => Promise<AsyncIterator<DateTimeOutput>>;
+  permissions: () => Promise<AsyncIterator<Permission[]>>;
+  interests: () => Promise<AsyncIterator<String[]>>;
+}
+
+/*
+The `ID` scalar type represents a unique identifier, often used to refetch an object or as key for a cache. The ID type appears in a JSON response as a String; however, it is not intended to be human-readable. When expected as an input type, any string (such as `"4"`) or integer (such as `4`) input value will be accepted as an ID.
+*/
+export type ID_Input = string | number;
+export type ID_Output = string;
+
+/*
+The `Int` scalar type represents non-fractional signed whole numeric values. Int can represent values between -(2^31) and 2^31 - 1.
+*/
+export type Int = number;
+
+/*
+The `String` scalar type represents textual data, represented as UTF-8 character sequences. The String type is most often used by GraphQL to represent free-form human-readable text.
+*/
+export type String = string;
+
+/*
+The `Boolean` scalar type represents `true` or `false`.
+*/
+export type Boolean = boolean;
+
+/*
+The `Float` scalar type represents signed double-precision fractional values as specified by [IEEE 754](https://en.wikipedia.org/wiki/IEEE_floating_point).
+*/
+export type Float = number;
+
+/*
+DateTime scalar input type, allowing Date
+*/
+export type DateTimeInput = Date | string;
+
+/*
+DateTime scalar output type, which is always a string
+*/
+export type DateTimeOutput = string;
+
+export type Long = string;
+
+/**
+ * Model Metadata
+ */
+
+export const models: Model[] = [
+  {
+    name: "User",
+    embedded: false
+  },
+  {
+    name: "Permission",
+    embedded: false
+  },
+  {
+    name: "Training",
+    embedded: false
+  },
+  {
+    name: "TrainingType",
+    embedded: false
+  },
+  {
+    name: "Block",
+    embedded: false
+  },
+  {
+    name: "Format",
+    embedded: false
+  },
+  {
+    name: "Track",
+    embedded: false
+  },
+  {
+    name: "ExerciseInstance",
+    embedded: false
+  },
+  {
+    name: "Exercise",
+    embedded: false
+  },
+  {
+    name: "Rating",
+    embedded: false
+  },
+  {
+    name: "Comment",
+    embedded: false
+  }
+];
+
+/**
+ * Type Defs
+ */
+
+export const Prisma = makePrismaClientClass<ClientConstructor<Prisma>>({
+  typeDefs,
+  models,
+  endpoint: `http://prisma:4466`,
+  secret: `PrismaSecret`
+});
+export const prisma = new Prisma();

+ 2562 - 0
backend/database/generated/prisma-client/prisma-schema.ts

@@ -0,0 +1,2562 @@
+// Code generated by Prisma (prisma@1.34.10). DO NOT EDIT.
+  // Please don't change this file manually but run `prisma generate` to update it.
+  // For more information, please read the docs: https://www.prisma.io/docs/prisma-client/
+
+export const typeDefs = /* GraphQL */ `type AggregateBlock {
+  count: Int!
+}
+
+type AggregateComment {
+  count: Int!
+}
+
+type AggregateExercise {
+  count: Int!
+}
+
+type AggregateExerciseInstance {
+  count: Int!
+}
+
+type AggregateFormat {
+  count: Int!
+}
+
+type AggregateRating {
+  count: Int!
+}
+
+type AggregateTrack {
+  count: Int!
+}
+
+type AggregateTraining {
+  count: Int!
+}
+
+type AggregateTrainingType {
+  count: Int!
+}
+
+type AggregateUser {
+  count: Int!
+}
+
+type BatchPayload {
+  count: Long!
+}
+
+type Block {
+  id: ID!
+  sequence: Int!
+  title: String!
+  description: String
+  videos: [String!]!
+  pictures: [String!]!
+  duration: Int
+  rounds: Int
+  format: Format!
+  rest: Int
+  tracks(where: TrackWhereInput, orderBy: TrackOrderByInput, skip: Int, after: String, before: String, first: Int, last: Int): [Track!]
+  blocks(where: BlockWhereInput, orderBy: BlockOrderByInput, skip: Int, after: String, before: String, first: Int, last: Int): [Block!]
+  exercises(where: ExerciseInstanceWhereInput, orderBy: ExerciseInstanceOrderByInput, skip: Int, after: String, before: String, first: Int, last: Int): [ExerciseInstance!]
+}
+
+type BlockConnection {
+  pageInfo: PageInfo!
+  edges: [BlockEdge]!
+  aggregate: AggregateBlock!
+}
+
+input BlockCreateInput {
+  id: ID
+  sequence: Int!
+  title: String!
+  description: String
+  videos: BlockCreatevideosInput
+  pictures: BlockCreatepicturesInput
+  duration: Int
+  rounds: Int
+  format: FormatCreateOneInput!
+  rest: Int
+  tracks: TrackCreateManyInput
+  blocks: BlockCreateManyInput
+  exercises: ExerciseInstanceCreateManyInput
+}
+
+input BlockCreateManyInput {
+  create: [BlockCreateInput!]
+  connect: [BlockWhereUniqueInput!]
+}
+
+input BlockCreatepicturesInput {
+  set: [String!]
+}
+
+input BlockCreatevideosInput {
+  set: [String!]
+}
+
+type BlockEdge {
+  node: Block!
+  cursor: String!
+}
+
+enum BlockOrderByInput {
+  id_ASC
+  id_DESC
+  sequence_ASC
+  sequence_DESC
+  title_ASC
+  title_DESC
+  description_ASC
+  description_DESC
+  duration_ASC
+  duration_DESC
+  rounds_ASC
+  rounds_DESC
+  rest_ASC
+  rest_DESC
+}
+
+type BlockPreviousValues {
+  id: ID!
+  sequence: Int!
+  title: String!
+  description: String
+  videos: [String!]!
+  pictures: [String!]!
+  duration: Int
+  rounds: Int
+  rest: Int
+}
+
+input BlockScalarWhereInput {
+  id: ID
+  id_not: ID
+  id_in: [ID!]
+  id_not_in: [ID!]
+  id_lt: ID
+  id_lte: ID
+  id_gt: ID
+  id_gte: ID
+  id_contains: ID
+  id_not_contains: ID
+  id_starts_with: ID
+  id_not_starts_with: ID
+  id_ends_with: ID
+  id_not_ends_with: ID
+  sequence: Int
+  sequence_not: Int
+  sequence_in: [Int!]
+  sequence_not_in: [Int!]
+  sequence_lt: Int
+  sequence_lte: Int
+  sequence_gt: Int
+  sequence_gte: Int
+  title: String
+  title_not: String
+  title_in: [String!]
+  title_not_in: [String!]
+  title_lt: String
+  title_lte: String
+  title_gt: String
+  title_gte: String
+  title_contains: String
+  title_not_contains: String
+  title_starts_with: String
+  title_not_starts_with: String
+  title_ends_with: String
+  title_not_ends_with: String
+  description: String
+  description_not: String
+  description_in: [String!]
+  description_not_in: [String!]
+  description_lt: String
+  description_lte: String
+  description_gt: String
+  description_gte: String
+  description_contains: String
+  description_not_contains: String
+  description_starts_with: String
+  description_not_starts_with: String
+  description_ends_with: String
+  description_not_ends_with: String
+  duration: Int
+  duration_not: Int
+  duration_in: [Int!]
+  duration_not_in: [Int!]
+  duration_lt: Int
+  duration_lte: Int
+  duration_gt: Int
+  duration_gte: Int
+  rounds: Int
+  rounds_not: Int
+  rounds_in: [Int!]
+  rounds_not_in: [Int!]
+  rounds_lt: Int
+  rounds_lte: Int
+  rounds_gt: Int
+  rounds_gte: Int
+  rest: Int
+  rest_not: Int
+  rest_in: [Int!]
+  rest_not_in: [Int!]
+  rest_lt: Int
+  rest_lte: Int
+  rest_gt: Int
+  rest_gte: Int
+  AND: [BlockScalarWhereInput!]
+  OR: [BlockScalarWhereInput!]
+  NOT: [BlockScalarWhereInput!]
+}
+
+type BlockSubscriptionPayload {
+  mutation: MutationType!
+  node: Block
+  updatedFields: [String!]
+  previousValues: BlockPreviousValues
+}
+
+input BlockSubscriptionWhereInput {
+  mutation_in: [MutationType!]
+  updatedFields_contains: String
+  updatedFields_contains_every: [String!]
+  updatedFields_contains_some: [String!]
+  node: BlockWhereInput
+  AND: [BlockSubscriptionWhereInput!]
+  OR: [BlockSubscriptionWhereInput!]
+  NOT: [BlockSubscriptionWhereInput!]
+}
+
+input BlockUpdateDataInput {
+  sequence: Int
+  title: String
+  description: String
+  videos: BlockUpdatevideosInput
+  pictures: BlockUpdatepicturesInput
+  duration: Int
+  rounds: Int
+  format: FormatUpdateOneRequiredInput
+  rest: Int
+  tracks: TrackUpdateManyInput
+  blocks: BlockUpdateManyInput
+  exercises: ExerciseInstanceUpdateManyInput
+}
+
+input BlockUpdateInput {
+  sequence: Int
+  title: String
+  description: String
+  videos: BlockUpdatevideosInput
+  pictures: BlockUpdatepicturesInput
+  duration: Int
+  rounds: Int
+  format: FormatUpdateOneRequiredInput
+  rest: Int
+  tracks: TrackUpdateManyInput
+  blocks: BlockUpdateManyInput
+  exercises: ExerciseInstanceUpdateManyInput
+}
+
+input BlockUpdateManyDataInput {
+  sequence: Int
+  title: String
+  description: String
+  videos: BlockUpdatevideosInput
+  pictures: BlockUpdatepicturesInput
+  duration: Int
+  rounds: Int
+  rest: Int
+}
+
+input BlockUpdateManyInput {
+  create: [BlockCreateInput!]
+  update: [BlockUpdateWithWhereUniqueNestedInput!]
+  upsert: [BlockUpsertWithWhereUniqueNestedInput!]
+  delete: [BlockWhereUniqueInput!]
+  connect: [BlockWhereUniqueInput!]
+  set: [BlockWhereUniqueInput!]
+  disconnect: [BlockWhereUniqueInput!]
+  deleteMany: [BlockScalarWhereInput!]
+  updateMany: [BlockUpdateManyWithWhereNestedInput!]
+}
+
+input BlockUpdateManyMutationInput {
+  sequence: Int
+  title: String
+  description: String
+  videos: BlockUpdatevideosInput
+  pictures: BlockUpdatepicturesInput
+  duration: Int
+  rounds: Int
+  rest: Int
+}
+
+input BlockUpdateManyWithWhereNestedInput {
+  where: BlockScalarWhereInput!
+  data: BlockUpdateManyDataInput!
+}
+
+input BlockUpdatepicturesInput {
+  set: [String!]
+}
+
+input BlockUpdatevideosInput {
+  set: [String!]
+}
+
+input BlockUpdateWithWhereUniqueNestedInput {
+  where: BlockWhereUniqueInput!
+  data: BlockUpdateDataInput!
+}
+
+input BlockUpsertWithWhereUniqueNestedInput {
+  where: BlockWhereUniqueInput!
+  update: BlockUpdateDataInput!
+  create: BlockCreateInput!
+}
+
+input BlockWhereInput {
+  id: ID
+  id_not: ID
+  id_in: [ID!]
+  id_not_in: [ID!]
+  id_lt: ID
+  id_lte: ID
+  id_gt: ID
+  id_gte: ID
+  id_contains: ID
+  id_not_contains: ID
+  id_starts_with: ID
+  id_not_starts_with: ID
+  id_ends_with: ID
+  id_not_ends_with: ID
+  sequence: Int
+  sequence_not: Int
+  sequence_in: [Int!]
+  sequence_not_in: [Int!]
+  sequence_lt: Int
+  sequence_lte: Int
+  sequence_gt: Int
+  sequence_gte: Int
+  title: String
+  title_not: String
+  title_in: [String!]
+  title_not_in: [String!]
+  title_lt: String
+  title_lte: String
+  title_gt: String
+  title_gte: String
+  title_contains: String
+  title_not_contains: String
+  title_starts_with: String
+  title_not_starts_with: String
+  title_ends_with: String
+  title_not_ends_with: String
+  description: String
+  description_not: String
+  description_in: [String!]
+  description_not_in: [String!]
+  description_lt: String
+  description_lte: String
+  description_gt: String
+  description_gte: String
+  description_contains: String
+  description_not_contains: String
+  description_starts_with: String
+  description_not_starts_with: String
+  description_ends_with: String
+  description_not_ends_with: String
+  duration: Int
+  duration_not: Int
+  duration_in: [Int!]
+  duration_not_in: [Int!]
+  duration_lt: Int
+  duration_lte: Int
+  duration_gt: Int
+  duration_gte: Int
+  rounds: Int
+  rounds_not: Int
+  rounds_in: [Int!]
+  rounds_not_in: [Int!]
+  rounds_lt: Int
+  rounds_lte: Int
+  rounds_gt: Int
+  rounds_gte: Int
+  format: FormatWhereInput
+  rest: Int
+  rest_not: Int
+  rest_in: [Int!]
+  rest_not_in: [Int!]
+  rest_lt: Int
+  rest_lte: Int
+  rest_gt: Int
+  rest_gte: Int
+  tracks_every: TrackWhereInput
+  tracks_some: TrackWhereInput
+  tracks_none: TrackWhereInput
+  blocks_every: BlockWhereInput
+  blocks_some: BlockWhereInput
+  blocks_none: BlockWhereInput
+  exercises_every: ExerciseInstanceWhereInput
+  exercises_some: ExerciseInstanceWhereInput
+  exercises_none: ExerciseInstanceWhereInput
+  AND: [BlockWhereInput!]
+  OR: [BlockWhereInput!]
+  NOT: [BlockWhereInput!]
+}
+
+input BlockWhereUniqueInput {
+  id: ID
+}
+
+type Comment {
+  id: ID!
+  text: String!
+  author: User!
+  createdAt: DateTime!
+}
+
+type CommentConnection {
+  pageInfo: PageInfo!
+  edges: [CommentEdge]!
+  aggregate: AggregateComment!
+}
+
+input CommentCreateInput {
+  id: ID
+  text: String!
+  author: UserCreateOneWithoutCommentsInput!
+}
+
+input CommentCreateManyWithoutAuthorInput {
+  create: [CommentCreateWithoutAuthorInput!]
+  connect: [CommentWhereUniqueInput!]
+}
+
+input CommentCreateWithoutAuthorInput {
+  id: ID
+  text: String!
+}
+
+type CommentEdge {
+  node: Comment!
+  cursor: String!
+}
+
+enum CommentOrderByInput {
+  id_ASC
+  id_DESC
+  text_ASC
+  text_DESC
+  createdAt_ASC
+  createdAt_DESC
+}
+
+type CommentPreviousValues {
+  id: ID!
+  text: String!
+  createdAt: DateTime!
+}
+
+input CommentScalarWhereInput {
+  id: ID
+  id_not: ID
+  id_in: [ID!]
+  id_not_in: [ID!]
+  id_lt: ID
+  id_lte: ID
+  id_gt: ID
+  id_gte: ID
+  id_contains: ID
+  id_not_contains: ID
+  id_starts_with: ID
+  id_not_starts_with: ID
+  id_ends_with: ID
+  id_not_ends_with: ID
+  text: String
+  text_not: String
+  text_in: [String!]
+  text_not_in: [String!]
+  text_lt: String
+  text_lte: String
+  text_gt: String
+  text_gte: String
+  text_contains: String
+  text_not_contains: String
+  text_starts_with: String
+  text_not_starts_with: String
+  text_ends_with: String
+  text_not_ends_with: String
+  createdAt: DateTime
+  createdAt_not: DateTime
+  createdAt_in: [DateTime!]
+  createdAt_not_in: [DateTime!]
+  createdAt_lt: DateTime
+  createdAt_lte: DateTime
+  createdAt_gt: DateTime
+  createdAt_gte: DateTime
+  AND: [CommentScalarWhereInput!]
+  OR: [CommentScalarWhereInput!]
+  NOT: [CommentScalarWhereInput!]
+}
+
+type CommentSubscriptionPayload {
+  mutation: MutationType!
+  node: Comment
+  updatedFields: [String!]
+  previousValues: CommentPreviousValues
+}
+
+input CommentSubscriptionWhereInput {
+  mutation_in: [MutationType!]
+  updatedFields_contains: String
+  updatedFields_contains_every: [String!]
+  updatedFields_contains_some: [String!]
+  node: CommentWhereInput
+  AND: [CommentSubscriptionWhereInput!]
+  OR: [CommentSubscriptionWhereInput!]
+  NOT: [CommentSubscriptionWhereInput!]
+}
+
+input CommentUpdateInput {
+  text: String
+  author: UserUpdateOneRequiredWithoutCommentsInput
+}
+
+input CommentUpdateManyDataInput {
+  text: String
+}
+
+input CommentUpdateManyMutationInput {
+  text: String
+}
+
+input CommentUpdateManyWithoutAuthorInput {
+  create: [CommentCreateWithoutAuthorInput!]
+  delete: [CommentWhereUniqueInput!]
+  connect: [CommentWhereUniqueInput!]
+  set: [CommentWhereUniqueInput!]
+  disconnect: [CommentWhereUniqueInput!]
+  update: [CommentUpdateWithWhereUniqueWithoutAuthorInput!]
+  upsert: [CommentUpsertWithWhereUniqueWithoutAuthorInput!]
+  deleteMany: [CommentScalarWhereInput!]
+  updateMany: [CommentUpdateManyWithWhereNestedInput!]
+}
+
+input CommentUpdateManyWithWhereNestedInput {
+  where: CommentScalarWhereInput!
+  data: CommentUpdateManyDataInput!
+}
+
+input CommentUpdateWithoutAuthorDataInput {
+  text: String
+}
+
+input CommentUpdateWithWhereUniqueWithoutAuthorInput {
+  where: CommentWhereUniqueInput!
+  data: CommentUpdateWithoutAuthorDataInput!
+}
+
+input CommentUpsertWithWhereUniqueWithoutAuthorInput {
+  where: CommentWhereUniqueInput!
+  update: CommentUpdateWithoutAuthorDataInput!
+  create: CommentCreateWithoutAuthorInput!
+}
+
+input CommentWhereInput {
+  id: ID
+  id_not: ID
+  id_in: [ID!]
+  id_not_in: [ID!]
+  id_lt: ID
+  id_lte: ID
+  id_gt: ID
+  id_gte: ID
+  id_contains: ID
+  id_not_contains: ID
+  id_starts_with: ID
+  id_not_starts_with: ID
+  id_ends_with: ID
+  id_not_ends_with: ID
+  text: String
+  text_not: String
+  text_in: [String!]
+  text_not_in: [String!]
+  text_lt: String
+  text_lte: String
+  text_gt: String
+  text_gte: String
+  text_contains: String
+  text_not_contains: String
+  text_starts_with: String
+  text_not_starts_with: String
+  text_ends_with: String
+  text_not_ends_with: String
+  author: UserWhereInput
+  createdAt: DateTime
+  createdAt_not: DateTime
+  createdAt_in: [DateTime!]
+  createdAt_not_in: [DateTime!]
+  createdAt_lt: DateTime
+  createdAt_lte: DateTime
+  createdAt_gt: DateTime
+  createdAt_gte: DateTime
+  AND: [CommentWhereInput!]
+  OR: [CommentWhereInput!]
+  NOT: [CommentWhereInput!]
+}
+
+input CommentWhereUniqueInput {
+  id: ID
+}
+
+scalar DateTime
+
+type Exercise {
+  id: ID!
+  name: String!
+  description: String!
+  video: String!
+  targets: [String!]!
+  baseExercise: [String!]!
+}
+
+type ExerciseConnection {
+  pageInfo: PageInfo!
+  edges: [ExerciseEdge]!
+  aggregate: AggregateExercise!
+}
+
+input ExerciseCreatebaseExerciseInput {
+  set: [String!]
+}
+
+input ExerciseCreateInput {
+  id: ID
+  name: String!
+  description: String!
+  video: String!
+  targets: ExerciseCreatetargetsInput
+  baseExercise: ExerciseCreatebaseExerciseInput
+}
+
+input ExerciseCreateOneInput {
+  create: ExerciseCreateInput
+  connect: ExerciseWhereUniqueInput
+}
+
+input ExerciseCreatetargetsInput {
+  set: [String!]
+}
+
+type ExerciseEdge {
+  node: Exercise!
+  cursor: String!
+}
+
+type ExerciseInstance {
+  id: ID!
+  exercise: Exercise!
+  repetitions: Int
+}
+
+type ExerciseInstanceConnection {
+  pageInfo: PageInfo!
+  edges: [ExerciseInstanceEdge]!
+  aggregate: AggregateExerciseInstance!
+}
+
+input ExerciseInstanceCreateInput {
+  id: ID
+  exercise: ExerciseCreateOneInput!
+  repetitions: Int
+}
+
+input ExerciseInstanceCreateManyInput {
+  create: [ExerciseInstanceCreateInput!]
+  connect: [ExerciseInstanceWhereUniqueInput!]
+}
+
+type ExerciseInstanceEdge {
+  node: ExerciseInstance!
+  cursor: String!
+}
+
+enum ExerciseInstanceOrderByInput {
+  id_ASC
+  id_DESC
+  repetitions_ASC
+  repetitions_DESC
+}
+
+type ExerciseInstancePreviousValues {
+  id: ID!
+  repetitions: Int
+}
+
+input ExerciseInstanceScalarWhereInput {
+  id: ID
+  id_not: ID
+  id_in: [ID!]
+  id_not_in: [ID!]
+  id_lt: ID
+  id_lte: ID
+  id_gt: ID
+  id_gte: ID
+  id_contains: ID
+  id_not_contains: ID
+  id_starts_with: ID
+  id_not_starts_with: ID
+  id_ends_with: ID
+  id_not_ends_with: ID
+  repetitions: Int
+  repetitions_not: Int
+  repetitions_in: [Int!]
+  repetitions_not_in: [Int!]
+  repetitions_lt: Int
+  repetitions_lte: Int
+  repetitions_gt: Int
+  repetitions_gte: Int
+  AND: [ExerciseInstanceScalarWhereInput!]
+  OR: [ExerciseInstanceScalarWhereInput!]
+  NOT: [ExerciseInstanceScalarWhereInput!]
+}
+
+type ExerciseInstanceSubscriptionPayload {
+  mutation: MutationType!
+  node: ExerciseInstance
+  updatedFields: [String!]
+  previousValues: ExerciseInstancePreviousValues
+}
+
+input ExerciseInstanceSubscriptionWhereInput {
+  mutation_in: [MutationType!]
+  updatedFields_contains: String
+  updatedFields_contains_every: [String!]
+  updatedFields_contains_some: [String!]
+  node: ExerciseInstanceWhereInput
+  AND: [ExerciseInstanceSubscriptionWhereInput!]
+  OR: [ExerciseInstanceSubscriptionWhereInput!]
+  NOT: [ExerciseInstanceSubscriptionWhereInput!]
+}
+
+input ExerciseInstanceUpdateDataInput {
+  exercise: ExerciseUpdateOneRequiredInput
+  repetitions: Int
+}
+
+input ExerciseInstanceUpdateInput {
+  exercise: ExerciseUpdateOneRequiredInput
+  repetitions: Int
+}
+
+input ExerciseInstanceUpdateManyDataInput {
+  repetitions: Int
+}
+
+input ExerciseInstanceUpdateManyInput {
+  create: [ExerciseInstanceCreateInput!]
+  update: [ExerciseInstanceUpdateWithWhereUniqueNestedInput!]
+  upsert: [ExerciseInstanceUpsertWithWhereUniqueNestedInput!]
+  delete: [ExerciseInstanceWhereUniqueInput!]
+  connect: [ExerciseInstanceWhereUniqueInput!]
+  set: [ExerciseInstanceWhereUniqueInput!]
+  disconnect: [ExerciseInstanceWhereUniqueInput!]
+  deleteMany: [ExerciseInstanceScalarWhereInput!]
+  updateMany: [ExerciseInstanceUpdateManyWithWhereNestedInput!]
+}
+
+input ExerciseInstanceUpdateManyMutationInput {
+  repetitions: Int
+}
+
+input ExerciseInstanceUpdateManyWithWhereNestedInput {
+  where: ExerciseInstanceScalarWhereInput!
+  data: ExerciseInstanceUpdateManyDataInput!
+}
+
+input ExerciseInstanceUpdateWithWhereUniqueNestedInput {
+  where: ExerciseInstanceWhereUniqueInput!
+  data: ExerciseInstanceUpdateDataInput!
+}
+
+input ExerciseInstanceUpsertWithWhereUniqueNestedInput {
+  where: ExerciseInstanceWhereUniqueInput!
+  update: ExerciseInstanceUpdateDataInput!
+  create: ExerciseInstanceCreateInput!
+}
+
+input ExerciseInstanceWhereInput {
+  id: ID
+  id_not: ID
+  id_in: [ID!]
+  id_not_in: [ID!]
+  id_lt: ID
+  id_lte: ID
+  id_gt: ID
+  id_gte: ID
+  id_contains: ID
+  id_not_contains: ID
+  id_starts_with: ID
+  id_not_starts_with: ID
+  id_ends_with: ID
+  id_not_ends_with: ID
+  exercise: ExerciseWhereInput
+  repetitions: Int
+  repetitions_not: Int
+  repetitions_in: [Int!]
+  repetitions_not_in: [Int!]
+  repetitions_lt: Int
+  repetitions_lte: Int
+  repetitions_gt: Int
+  repetitions_gte: Int
+  AND: [ExerciseInstanceWhereInput!]
+  OR: [ExerciseInstanceWhereInput!]
+  NOT: [ExerciseInstanceWhereInput!]
+}
+
+input ExerciseInstanceWhereUniqueInput {
+  id: ID
+}
+
+enum ExerciseOrderByInput {
+  id_ASC
+  id_DESC
+  name_ASC
+  name_DESC
+  description_ASC
+  description_DESC
+  video_ASC
+  video_DESC
+}
+
+type ExercisePreviousValues {
+  id: ID!
+  name: String!
+  description: String!
+  video: String!
+  targets: [String!]!
+  baseExercise: [String!]!
+}
+
+type ExerciseSubscriptionPayload {
+  mutation: MutationType!
+  node: Exercise
+  updatedFields: [String!]
+  previousValues: ExercisePreviousValues
+}
+
+input ExerciseSubscriptionWhereInput {
+  mutation_in: [MutationType!]
+  updatedFields_contains: String
+  updatedFields_contains_every: [String!]
+  updatedFields_contains_some: [String!]
+  node: ExerciseWhereInput
+  AND: [ExerciseSubscriptionWhereInput!]
+  OR: [ExerciseSubscriptionWhereInput!]
+  NOT: [ExerciseSubscriptionWhereInput!]
+}
+
+input ExerciseUpdatebaseExerciseInput {
+  set: [String!]
+}
+
+input ExerciseUpdateDataInput {
+  name: String
+  description: String
+  video: String
+  targets: ExerciseUpdatetargetsInput
+  baseExercise: ExerciseUpdatebaseExerciseInput
+}
+
+input ExerciseUpdateInput {
+  name: String
+  description: String
+  video: String
+  targets: ExerciseUpdatetargetsInput
+  baseExercise: ExerciseUpdatebaseExerciseInput
+}
+
+input ExerciseUpdateManyMutationInput {
+  name: String
+  description: String
+  video: String
+  targets: ExerciseUpdatetargetsInput
+  baseExercise: ExerciseUpdatebaseExerciseInput
+}
+
+input ExerciseUpdateOneRequiredInput {
+  create: ExerciseCreateInput
+  update: ExerciseUpdateDataInput
+  upsert: ExerciseUpsertNestedInput
+  connect: ExerciseWhereUniqueInput
+}
+
+input ExerciseUpdatetargetsInput {
+  set: [String!]
+}
+
+input ExerciseUpsertNestedInput {
+  update: ExerciseUpdateDataInput!
+  create: ExerciseCreateInput!
+}
+
+input ExerciseWhereInput {
+  id: ID
+  id_not: ID
+  id_in: [ID!]
+  id_not_in: [ID!]
+  id_lt: ID
+  id_lte: ID
+  id_gt: ID
+  id_gte: ID
+  id_contains: ID
+  id_not_contains: ID
+  id_starts_with: ID
+  id_not_starts_with: ID
+  id_ends_with: ID
+  id_not_ends_with: ID
+  name: String
+  name_not: String
+  name_in: [String!]
+  name_not_in: [String!]
+  name_lt: String
+  name_lte: String
+  name_gt: String
+  name_gte: String
+  name_contains: String
+  name_not_contains: String
+  name_starts_with: String
+  name_not_starts_with: String
+  name_ends_with: String
+  name_not_ends_with: String
+  description: String
+  description_not: String
+  description_in: [String!]
+  description_not_in: [String!]
+  description_lt: String
+  description_lte: String
+  description_gt: String
+  description_gte: String
+  description_contains: String
+  description_not_contains: String
+  description_starts_with: String
+  description_not_starts_with: String
+  description_ends_with: String
+  description_not_ends_with: String
+  video: String
+  video_not: String
+  video_in: [String!]
+  video_not_in: [String!]
+  video_lt: String
+  video_lte: String
+  video_gt: String
+  video_gte: String
+  video_contains: String
+  video_not_contains: String
+  video_starts_with: String
+  video_not_starts_with: String
+  video_ends_with: String
+  video_not_ends_with: String
+  AND: [ExerciseWhereInput!]
+  OR: [ExerciseWhereInput!]
+  NOT: [ExerciseWhereInput!]
+}
+
+input ExerciseWhereUniqueInput {
+  id: ID
+}
+
+type Format {
+  id: ID!
+  name: String!
+  description: String!
+}
+
+type FormatConnection {
+  pageInfo: PageInfo!
+  edges: [FormatEdge]!
+  aggregate: AggregateFormat!
+}
+
+input FormatCreateInput {
+  id: ID
+  name: String!
+  description: String!
+}
+
+input FormatCreateOneInput {
+  create: FormatCreateInput
+  connect: FormatWhereUniqueInput
+}
+
+type FormatEdge {
+  node: Format!
+  cursor: String!
+}
+
+enum FormatOrderByInput {
+  id_ASC
+  id_DESC
+  name_ASC
+  name_DESC
+  description_ASC
+  description_DESC
+}
+
+type FormatPreviousValues {
+  id: ID!
+  name: String!
+  description: String!
+}
+
+type FormatSubscriptionPayload {
+  mutation: MutationType!
+  node: Format
+  updatedFields: [String!]
+  previousValues: FormatPreviousValues
+}
+
+input FormatSubscriptionWhereInput {
+  mutation_in: [MutationType!]
+  updatedFields_contains: String
+  updatedFields_contains_every: [String!]
+  updatedFields_contains_some: [String!]
+  node: FormatWhereInput
+  AND: [FormatSubscriptionWhereInput!]
+  OR: [FormatSubscriptionWhereInput!]
+  NOT: [FormatSubscriptionWhereInput!]
+}
+
+input FormatUpdateDataInput {
+  name: String
+  description: String
+}
+
+input FormatUpdateInput {
+  name: String
+  description: String
+}
+
+input FormatUpdateManyMutationInput {
+  name: String
+  description: String
+}
+
+input FormatUpdateOneRequiredInput {
+  create: FormatCreateInput
+  update: FormatUpdateDataInput
+  upsert: FormatUpsertNestedInput
+  connect: FormatWhereUniqueInput
+}
+
+input FormatUpsertNestedInput {
+  update: FormatUpdateDataInput!
+  create: FormatCreateInput!
+}
+
+input FormatWhereInput {
+  id: ID
+  id_not: ID
+  id_in: [ID!]
+  id_not_in: [ID!]
+  id_lt: ID
+  id_lte: ID
+  id_gt: ID
+  id_gte: ID
+  id_contains: ID
+  id_not_contains: ID
+  id_starts_with: ID
+  id_not_starts_with: ID
+  id_ends_with: ID
+  id_not_ends_with: ID
+  name: String
+  name_not: String
+  name_in: [String!]
+  name_not_in: [String!]
+  name_lt: String
+  name_lte: String
+  name_gt: String
+  name_gte: String
+  name_contains: String
+  name_not_contains: String
+  name_starts_with: String
+  name_not_starts_with: String
+  name_ends_with: String
+  name_not_ends_with: String
+  description: String
+  description_not: String
+  description_in: [String!]
+  description_not_in: [String!]
+  description_lt: String
+  description_lte: String
+  description_gt: String
+  description_gte: String
+  description_contains: String
+  description_not_contains: String
+  description_starts_with: String
+  description_not_starts_with: String
+  description_ends_with: String
+  description_not_ends_with: String
+  AND: [FormatWhereInput!]
+  OR: [FormatWhereInput!]
+  NOT: [FormatWhereInput!]
+}
+
+input FormatWhereUniqueInput {
+  id: ID
+}
+
+scalar Long
+
+type Mutation {
+  createBlock(data: BlockCreateInput!): Block!
+  updateBlock(data: BlockUpdateInput!, where: BlockWhereUniqueInput!): Block
+  updateManyBlocks(data: BlockUpdateManyMutationInput!, where: BlockWhereInput): BatchPayload!
+  upsertBlock(where: BlockWhereUniqueInput!, create: BlockCreateInput!, update: BlockUpdateInput!): Block!
+  deleteBlock(where: BlockWhereUniqueInput!): Block
+  deleteManyBlocks(where: BlockWhereInput): BatchPayload!
+  createComment(data: CommentCreateInput!): Comment!
+  updateComment(data: CommentUpdateInput!, where: CommentWhereUniqueInput!): Comment
+  updateManyComments(data: CommentUpdateManyMutationInput!, where: CommentWhereInput): BatchPayload!
+  upsertComment(where: CommentWhereUniqueInput!, create: CommentCreateInput!, update: CommentUpdateInput!): Comment!
+  deleteComment(where: CommentWhereUniqueInput!): Comment
+  deleteManyComments(where: CommentWhereInput): BatchPayload!
+  createExercise(data: ExerciseCreateInput!): Exercise!
+  updateExercise(data: ExerciseUpdateInput!, where: ExerciseWhereUniqueInput!): Exercise
+  updateManyExercises(data: ExerciseUpdateManyMutationInput!, where: ExerciseWhereInput): BatchPayload!
+  upsertExercise(where: ExerciseWhereUniqueInput!, create: ExerciseCreateInput!, update: ExerciseUpdateInput!): Exercise!
+  deleteExercise(where: ExerciseWhereUniqueInput!): Exercise
+  deleteManyExercises(where: ExerciseWhereInput): BatchPayload!
+  createExerciseInstance(data: ExerciseInstanceCreateInput!): ExerciseInstance!
+  updateExerciseInstance(data: ExerciseInstanceUpdateInput!, where: ExerciseInstanceWhereUniqueInput!): ExerciseInstance
+  updateManyExerciseInstances(data: ExerciseInstanceUpdateManyMutationInput!, where: ExerciseInstanceWhereInput): BatchPayload!
+  upsertExerciseInstance(where: ExerciseInstanceWhereUniqueInput!, create: ExerciseInstanceCreateInput!, update: ExerciseInstanceUpdateInput!): ExerciseInstance!
+  deleteExerciseInstance(where: ExerciseInstanceWhereUniqueInput!): ExerciseInstance
+  deleteManyExerciseInstances(where: ExerciseInstanceWhereInput): BatchPayload!
+  createFormat(data: FormatCreateInput!): Format!
+  updateFormat(data: FormatUpdateInput!, where: FormatWhereUniqueInput!): Format
+  updateManyFormats(data: FormatUpdateManyMutationInput!, where: FormatWhereInput): BatchPayload!
+  upsertFormat(where: FormatWhereUniqueInput!, create: FormatCreateInput!, update: FormatUpdateInput!): Format!
+  deleteFormat(where: FormatWhereUniqueInput!): Format
+  deleteManyFormats(where: FormatWhereInput): BatchPayload!
+  createRating(data: RatingCreateInput!): Rating!
+  updateRating(data: RatingUpdateInput!, where: RatingWhereUniqueInput!): Rating
+  updateManyRatings(data: RatingUpdateManyMutationInput!, where: RatingWhereInput): BatchPayload!
+  upsertRating(where: RatingWhereUniqueInput!, create: RatingCreateInput!, update: RatingUpdateInput!): Rating!
+  deleteRating(where: RatingWhereUniqueInput!): Rating
+  deleteManyRatings(where: RatingWhereInput): BatchPayload!
+  createTrack(data: TrackCreateInput!): Track!
+  updateTrack(data: TrackUpdateInput!, where: TrackWhereUniqueInput!): Track
+  updateManyTracks(data: TrackUpdateManyMutationInput!, where: TrackWhereInput): BatchPayload!
+  upsertTrack(where: TrackWhereUniqueInput!, create: TrackCreateInput!, update: TrackUpdateInput!): Track!
+  deleteTrack(where: TrackWhereUniqueInput!): Track
+  deleteManyTracks(where: TrackWhereInput): BatchPayload!
+  createTraining(data: TrainingCreateInput!): Training!
+  updateTraining(data: TrainingUpdateInput!, where: TrainingWhereUniqueInput!): Training
+  updateManyTrainings(data: TrainingUpdateManyMutationInput!, where: TrainingWhereInput): BatchPayload!
+  upsertTraining(where: TrainingWhereUniqueInput!, create: TrainingCreateInput!, update: TrainingUpdateInput!): Training!
+  deleteTraining(where: TrainingWhereUniqueInput!): Training
+  deleteManyTrainings(where: TrainingWhereInput): BatchPayload!
+  createTrainingType(data: TrainingTypeCreateInput!): TrainingType!
+  updateTrainingType(data: TrainingTypeUpdateInput!, where: TrainingTypeWhereUniqueInput!): TrainingType
+  updateManyTrainingTypes(data: TrainingTypeUpdateManyMutationInput!, where: TrainingTypeWhereInput): BatchPayload!
+  upsertTrainingType(where: TrainingTypeWhereUniqueInput!, create: TrainingTypeCreateInput!, update: TrainingTypeUpdateInput!): TrainingType!
+  deleteTrainingType(where: TrainingTypeWhereUniqueInput!): TrainingType
+  deleteManyTrainingTypes(where: TrainingTypeWhereInput): BatchPayload!
+  createUser(data: UserCreateInput!): User!
+  updateUser(data: UserUpdateInput!, where: UserWhereUniqueInput!): User
+  updateManyUsers(data: UserUpdateManyMutationInput!, where: UserWhereInput): BatchPayload!
+  upsertUser(where: UserWhereUniqueInput!, create: UserCreateInput!, update: UserUpdateInput!): User!
+  deleteUser(where: UserWhereUniqueInput!): User
+  deleteManyUsers(where: UserWhereInput): BatchPayload!
+}
+
+enum MutationType {
+  CREATED
+  UPDATED
+  DELETED
+}
+
+interface Node {
+  id: ID!
+}
+
+type PageInfo {
+  hasNextPage: Boolean!
+  hasPreviousPage: Boolean!
+  startCursor: String
+  endCursor: String
+}
+
+enum Permission {
+  ADMIN
+  INSTRUCTOR
+}
+
+type Query {
+  block(where: BlockWhereUniqueInput!): Block
+  blocks(where: BlockWhereInput, orderBy: BlockOrderByInput, skip: Int, after: String, before: String, first: Int, last: Int): [Block]!
+  blocksConnection(where: BlockWhereInput, orderBy: BlockOrderByInput, skip: Int, after: String, before: String, first: Int, last: Int): BlockConnection!
+  comment(where: CommentWhereUniqueInput!): Comment
+  comments(where: CommentWhereInput, orderBy: CommentOrderByInput, skip: Int, after: String, before: String, first: Int, last: Int): [Comment]!
+  commentsConnection(where: CommentWhereInput, orderBy: CommentOrderByInput, skip: Int, after: String, before: String, first: Int, last: Int): CommentConnection!
+  exercise(where: ExerciseWhereUniqueInput!): Exercise
+  exercises(where: ExerciseWhereInput, orderBy: ExerciseOrderByInput, skip: Int, after: String, before: String, first: Int, last: Int): [Exercise]!
+  exercisesConnection(where: ExerciseWhereInput, orderBy: ExerciseOrderByInput, skip: Int, after: String, before: String, first: Int, last: Int): ExerciseConnection!
+  exerciseInstance(where: ExerciseInstanceWhereUniqueInput!): ExerciseInstance
+  exerciseInstances(where: ExerciseInstanceWhereInput, orderBy: ExerciseInstanceOrderByInput, skip: Int, after: String, before: String, first: Int, last: Int): [ExerciseInstance]!
+  exerciseInstancesConnection(where: ExerciseInstanceWhereInput, orderBy: ExerciseInstanceOrderByInput, skip: Int, after: String, before: String, first: Int, last: Int): ExerciseInstanceConnection!
+  format(where: FormatWhereUniqueInput!): Format
+  formats(where: FormatWhereInput, orderBy: FormatOrderByInput, skip: Int, after: String, before: String, first: Int, last: Int): [Format]!
+  formatsConnection(where: FormatWhereInput, orderBy: FormatOrderByInput, skip: Int, after: String, before: String, first: Int, last: Int): FormatConnection!
+  rating(where: RatingWhereUniqueInput!): Rating
+  ratings(where: RatingWhereInput, orderBy: RatingOrderByInput, skip: Int, after: String, before: String, first: Int, last: Int): [Rating]!
+  ratingsConnection(where: RatingWhereInput, orderBy: RatingOrderByInput, skip: Int, after: String, before: String, first: Int, last: Int): RatingConnection!
+  track(where: TrackWhereUniqueInput!): Track
+  tracks(where: TrackWhereInput, orderBy: TrackOrderByInput, skip: Int, after: String, before: String, first: Int, last: Int): [Track]!
+  tracksConnection(where: TrackWhereInput, orderBy: TrackOrderByInput, skip: Int, after: String, before: String, first: Int, last: Int): TrackConnection!
+  training(where: TrainingWhereUniqueInput!): Training
+  trainings(where: TrainingWhereInput, orderBy: TrainingOrderByInput, skip: Int, after: String, before: String, first: Int, last: Int): [Training]!
+  trainingsConnection(where: TrainingWhereInput, orderBy: TrainingOrderByInput, skip: Int, after: String, before: String, first: Int, last: Int): TrainingConnection!
+  trainingType(where: TrainingTypeWhereUniqueInput!): TrainingType
+  trainingTypes(where: TrainingTypeWhereInput, orderBy: TrainingTypeOrderByInput, skip: Int, after: String, before: String, first: Int, last: Int): [TrainingType]!
+  trainingTypesConnection(where: TrainingTypeWhereInput, orderBy: TrainingTypeOrderByInput, skip: Int, after: String, before: String, first: Int, last: Int): TrainingTypeConnection!
+  user(where: UserWhereUniqueInput!): User
+  users(where: UserWhereInput, orderBy: UserOrderByInput, skip: Int, after: String, before: String, first: Int, last: Int): [User]!
+  usersConnection(where: UserWhereInput, orderBy: UserOrderByInput, skip: Int, after: String, before: String, first: Int, last: Int): UserConnection!
+  node(id: ID!): Node
+}
+
+type Rating {
+  id: ID!
+  user: User!
+  value: Int!
+  comment: String!
+  createdAt: DateTime!
+}
+
+type RatingConnection {
+  pageInfo: PageInfo!
+  edges: [RatingEdge]!
+  aggregate: AggregateRating!
+}
+
+input RatingCreateInput {
+  id: ID
+  user: UserCreateOneWithoutRatingsInput!
+  value: Int!
+  comment: String!
+}
+
+input RatingCreateManyInput {
+  create: [RatingCreateInput!]
+  connect: [RatingWhereUniqueInput!]
+}
+
+input RatingCreateManyWithoutUserInput {
+  create: [RatingCreateWithoutUserInput!]
+  connect: [RatingWhereUniqueInput!]
+}
+
+input RatingCreateWithoutUserInput {
+  id: ID
+  value: Int!
+  comment: String!
+}
+
+type RatingEdge {
+  node: Rating!
+  cursor: String!
+}
+
+enum RatingOrderByInput {
+  id_ASC
+  id_DESC
+  value_ASC
+  value_DESC
+  comment_ASC
+  comment_DESC
+  createdAt_ASC
+  createdAt_DESC
+}
+
+type RatingPreviousValues {
+  id: ID!
+  value: Int!
+  comment: String!
+  createdAt: DateTime!
+}
+
+input RatingScalarWhereInput {
+  id: ID
+  id_not: ID
+  id_in: [ID!]
+  id_not_in: [ID!]
+  id_lt: ID
+  id_lte: ID
+  id_gt: ID
+  id_gte: ID
+  id_contains: ID
+  id_not_contains: ID
+  id_starts_with: ID
+  id_not_starts_with: ID
+  id_ends_with: ID
+  id_not_ends_with: ID
+  value: Int
+  value_not: Int
+  value_in: [Int!]
+  value_not_in: [Int!]
+  value_lt: Int
+  value_lte: Int
+  value_gt: Int
+  value_gte: Int
+  comment: String
+  comment_not: String
+  comment_in: [String!]
+  comment_not_in: [String!]
+  comment_lt: String
+  comment_lte: String
+  comment_gt: String
+  comment_gte: String
+  comment_contains: String
+  comment_not_contains: String
+  comment_starts_with: String
+  comment_not_starts_with: String
+  comment_ends_with: String
+  comment_not_ends_with: String
+  createdAt: DateTime
+  createdAt_not: DateTime
+  createdAt_in: [DateTime!]
+  createdAt_not_in: [DateTime!]
+  createdAt_lt: DateTime
+  createdAt_lte: DateTime
+  createdAt_gt: DateTime
+  createdAt_gte: DateTime
+  AND: [RatingScalarWhereInput!]
+  OR: [RatingScalarWhereInput!]
+  NOT: [RatingScalarWhereInput!]
+}
+
+type RatingSubscriptionPayload {
+  mutation: MutationType!
+  node: Rating
+  updatedFields: [String!]
+  previousValues: RatingPreviousValues
+}
+
+input RatingSubscriptionWhereInput {
+  mutation_in: [MutationType!]
+  updatedFields_contains: String
+  updatedFields_contains_every: [String!]
+  updatedFields_contains_some: [String!]
+  node: RatingWhereInput
+  AND: [RatingSubscriptionWhereInput!]
+  OR: [RatingSubscriptionWhereInput!]
+  NOT: [RatingSubscriptionWhereInput!]
+}
+
+input RatingUpdateDataInput {
+  user: UserUpdateOneRequiredWithoutRatingsInput
+  value: Int
+  comment: String
+}
+
+input RatingUpdateInput {
+  user: UserUpdateOneRequiredWithoutRatingsInput
+  value: Int
+  comment: String
+}
+
+input RatingUpdateManyDataInput {
+  value: Int
+  comment: String
+}
+
+input RatingUpdateManyInput {
+  create: [RatingCreateInput!]
+  update: [RatingUpdateWithWhereUniqueNestedInput!]
+  upsert: [RatingUpsertWithWhereUniqueNestedInput!]
+  delete: [RatingWhereUniqueInput!]
+  connect: [RatingWhereUniqueInput!]
+  set: [RatingWhereUniqueInput!]
+  disconnect: [RatingWhereUniqueInput!]
+  deleteMany: [RatingScalarWhereInput!]
+  updateMany: [RatingUpdateManyWithWhereNestedInput!]
+}
+
+input RatingUpdateManyMutationInput {
+  value: Int
+  comment: String
+}
+
+input RatingUpdateManyWithoutUserInput {
+  create: [RatingCreateWithoutUserInput!]
+  delete: [RatingWhereUniqueInput!]
+  connect: [RatingWhereUniqueInput!]
+  set: [RatingWhereUniqueInput!]
+  disconnect: [RatingWhereUniqueInput!]
+  update: [RatingUpdateWithWhereUniqueWithoutUserInput!]
+  upsert: [RatingUpsertWithWhereUniqueWithoutUserInput!]
+  deleteMany: [RatingScalarWhereInput!]
+  updateMany: [RatingUpdateManyWithWhereNestedInput!]
+}
+
+input RatingUpdateManyWithWhereNestedInput {
+  where: RatingScalarWhereInput!
+  data: RatingUpdateManyDataInput!
+}
+
+input RatingUpdateWithoutUserDataInput {
+  value: Int
+  comment: String
+}
+
+input RatingUpdateWithWhereUniqueNestedInput {
+  where: RatingWhereUniqueInput!
+  data: RatingUpdateDataInput!
+}
+
+input RatingUpdateWithWhereUniqueWithoutUserInput {
+  where: RatingWhereUniqueInput!
+  data: RatingUpdateWithoutUserDataInput!
+}
+
+input RatingUpsertWithWhereUniqueNestedInput {
+  where: RatingWhereUniqueInput!
+  update: RatingUpdateDataInput!
+  create: RatingCreateInput!
+}
+
+input RatingUpsertWithWhereUniqueWithoutUserInput {
+  where: RatingWhereUniqueInput!
+  update: RatingUpdateWithoutUserDataInput!
+  create: RatingCreateWithoutUserInput!
+}
+
+input RatingWhereInput {
+  id: ID
+  id_not: ID
+  id_in: [ID!]
+  id_not_in: [ID!]
+  id_lt: ID
+  id_lte: ID
+  id_gt: ID
+  id_gte: ID
+  id_contains: ID
+  id_not_contains: ID
+  id_starts_with: ID
+  id_not_starts_with: ID
+  id_ends_with: ID
+  id_not_ends_with: ID
+  user: UserWhereInput
+  value: Int
+  value_not: Int
+  value_in: [Int!]
+  value_not_in: [Int!]
+  value_lt: Int
+  value_lte: Int
+  value_gt: Int
+  value_gte: Int
+  comment: String
+  comment_not: String
+  comment_in: [String!]
+  comment_not_in: [String!]
+  comment_lt: String
+  comment_lte: String
+  comment_gt: String
+  comment_gte: String
+  comment_contains: String
+  comment_not_contains: String
+  comment_starts_with: String
+  comment_not_starts_with: String
+  comment_ends_with: String
+  comment_not_ends_with: String
+  createdAt: DateTime
+  createdAt_not: DateTime
+  createdAt_in: [DateTime!]
+  createdAt_not_in: [DateTime!]
+  createdAt_lt: DateTime
+  createdAt_lte: DateTime
+  createdAt_gt: DateTime
+  createdAt_gte: DateTime
+  AND: [RatingWhereInput!]
+  OR: [RatingWhereInput!]
+  NOT: [RatingWhereInput!]
+}
+
+input RatingWhereUniqueInput {
+  id: ID
+}
+
+type Subscription {
+  block(where: BlockSubscriptionWhereInput): BlockSubscriptionPayload
+  comment(where: CommentSubscriptionWhereInput): CommentSubscriptionPayload
+  exercise(where: ExerciseSubscriptionWhereInput): ExerciseSubscriptionPayload
+  exerciseInstance(where: ExerciseInstanceSubscriptionWhereInput): ExerciseInstanceSubscriptionPayload
+  format(where: FormatSubscriptionWhereInput): FormatSubscriptionPayload
+  rating(where: RatingSubscriptionWhereInput): RatingSubscriptionPayload
+  track(where: TrackSubscriptionWhereInput): TrackSubscriptionPayload
+  training(where: TrainingSubscriptionWhereInput): TrainingSubscriptionPayload
+  trainingType(where: TrainingTypeSubscriptionWhereInput): TrainingTypeSubscriptionPayload
+  user(where: UserSubscriptionWhereInput): UserSubscriptionPayload
+}
+
+type Track {
+  id: ID!
+  title: String!
+  artist: String!
+  duration: Int!
+  link: String!
+}
+
+type TrackConnection {
+  pageInfo: PageInfo!
+  edges: [TrackEdge]!
+  aggregate: AggregateTrack!
+}
+
+input TrackCreateInput {
+  id: ID
+  title: String!
+  artist: String!
+  duration: Int!
+  link: String!
+}
+
+input TrackCreateManyInput {
+  create: [TrackCreateInput!]
+  connect: [TrackWhereUniqueInput!]
+}
+
+type TrackEdge {
+  node: Track!
+  cursor: String!
+}
+
+enum TrackOrderByInput {
+  id_ASC
+  id_DESC
+  title_ASC
+  title_DESC
+  artist_ASC
+  artist_DESC
+  duration_ASC
+  duration_DESC
+  link_ASC
+  link_DESC
+}
+
+type TrackPreviousValues {
+  id: ID!
+  title: String!
+  artist: String!
+  duration: Int!
+  link: String!
+}
+
+input TrackScalarWhereInput {
+  id: ID
+  id_not: ID
+  id_in: [ID!]
+  id_not_in: [ID!]
+  id_lt: ID
+  id_lte: ID
+  id_gt: ID
+  id_gte: ID
+  id_contains: ID
+  id_not_contains: ID
+  id_starts_with: ID
+  id_not_starts_with: ID
+  id_ends_with: ID
+  id_not_ends_with: ID
+  title: String
+  title_not: String
+  title_in: [String!]
+  title_not_in: [String!]
+  title_lt: String
+  title_lte: String
+  title_gt: String
+  title_gte: String
+  title_contains: String
+  title_not_contains: String
+  title_starts_with: String
+  title_not_starts_with: String
+  title_ends_with: String
+  title_not_ends_with: String
+  artist: String
+  artist_not: String
+  artist_in: [String!]
+  artist_not_in: [String!]
+  artist_lt: String
+  artist_lte: String
+  artist_gt: String
+  artist_gte: String
+  artist_contains: String
+  artist_not_contains: String
+  artist_starts_with: String
+  artist_not_starts_with: String
+  artist_ends_with: String
+  artist_not_ends_with: String
+  duration: Int
+  duration_not: Int
+  duration_in: [Int!]
+  duration_not_in: [Int!]
+  duration_lt: Int
+  duration_lte: Int
+  duration_gt: Int
+  duration_gte: Int
+  link: String
+  link_not: String
+  link_in: [String!]
+  link_not_in: [String!]
+  link_lt: String
+  link_lte: String
+  link_gt: String
+  link_gte: String
+  link_contains: String
+  link_not_contains: String
+  link_starts_with: String
+  link_not_starts_with: String
+  link_ends_with: String
+  link_not_ends_with: String
+  AND: [TrackScalarWhereInput!]
+  OR: [TrackScalarWhereInput!]
+  NOT: [TrackScalarWhereInput!]
+}
+
+type TrackSubscriptionPayload {
+  mutation: MutationType!
+  node: Track
+  updatedFields: [String!]
+  previousValues: TrackPreviousValues
+}
+
+input TrackSubscriptionWhereInput {
+  mutation_in: [MutationType!]
+  updatedFields_contains: String
+  updatedFields_contains_every: [String!]
+  updatedFields_contains_some: [String!]
+  node: TrackWhereInput
+  AND: [TrackSubscriptionWhereInput!]
+  OR: [TrackSubscriptionWhereInput!]
+  NOT: [TrackSubscriptionWhereInput!]
+}
+
+input TrackUpdateDataInput {
+  title: String
+  artist: String
+  duration: Int
+  link: String
+}
+
+input TrackUpdateInput {
+  title: String
+  artist: String
+  duration: Int
+  link: String
+}
+
+input TrackUpdateManyDataInput {
+  title: String
+  artist: String
+  duration: Int
+  link: String
+}
+
+input TrackUpdateManyInput {
+  create: [TrackCreateInput!]
+  update: [TrackUpdateWithWhereUniqueNestedInput!]
+  upsert: [TrackUpsertWithWhereUniqueNestedInput!]
+  delete: [TrackWhereUniqueInput!]
+  connect: [TrackWhereUniqueInput!]
+  set: [TrackWhereUniqueInput!]
+  disconnect: [TrackWhereUniqueInput!]
+  deleteMany: [TrackScalarWhereInput!]
+  updateMany: [TrackUpdateManyWithWhereNestedInput!]
+}
+
+input TrackUpdateManyMutationInput {
+  title: String
+  artist: String
+  duration: Int
+  link: String
+}
+
+input TrackUpdateManyWithWhereNestedInput {
+  where: TrackScalarWhereInput!
+  data: TrackUpdateManyDataInput!
+}
+
+input TrackUpdateWithWhereUniqueNestedInput {
+  where: TrackWhereUniqueInput!
+  data: TrackUpdateDataInput!
+}
+
+input TrackUpsertWithWhereUniqueNestedInput {
+  where: TrackWhereUniqueInput!
+  update: TrackUpdateDataInput!
+  create: TrackCreateInput!
+}
+
+input TrackWhereInput {
+  id: ID
+  id_not: ID
+  id_in: [ID!]
+  id_not_in: [ID!]
+  id_lt: ID
+  id_lte: ID
+  id_gt: ID
+  id_gte: ID
+  id_contains: ID
+  id_not_contains: ID
+  id_starts_with: ID
+  id_not_starts_with: ID
+  id_ends_with: ID
+  id_not_ends_with: ID
+  title: String
+  title_not: String
+  title_in: [String!]
+  title_not_in: [String!]
+  title_lt: String
+  title_lte: String
+  title_gt: String
+  title_gte: String
+  title_contains: String
+  title_not_contains: String
+  title_starts_with: String
+  title_not_starts_with: String
+  title_ends_with: String
+  title_not_ends_with: String
+  artist: String
+  artist_not: String
+  artist_in: [String!]
+  artist_not_in: [String!]
+  artist_lt: String
+  artist_lte: String
+  artist_gt: String
+  artist_gte: String
+  artist_contains: String
+  artist_not_contains: String
+  artist_starts_with: String
+  artist_not_starts_with: String
+  artist_ends_with: String
+  artist_not_ends_with: String
+  duration: Int
+  duration_not: Int
+  duration_in: [Int!]
+  duration_not_in: [Int!]
+  duration_lt: Int
+  duration_lte: Int
+  duration_gt: Int
+  duration_gte: Int
+  link: String
+  link_not: String
+  link_in: [String!]
+  link_not_in: [String!]
+  link_lt: String
+  link_lte: String
+  link_gt: String
+  link_gte: String
+  link_contains: String
+  link_not_contains: String
+  link_starts_with: String
+  link_not_starts_with: String
+  link_ends_with: String
+  link_not_ends_with: String
+  AND: [TrackWhereInput!]
+  OR: [TrackWhereInput!]
+  NOT: [TrackWhereInput!]
+}
+
+input TrackWhereUniqueInput {
+  id: ID
+}
+
+type Training {
+  id: ID!
+  title: String!
+  type: TrainingType!
+  createdAt: DateTime!
+  trainingDate: DateTime
+  location: String
+  registrations(where: UserWhereInput, orderBy: UserOrderByInput, skip: Int, after: String, before: String, first: Int, last: Int): [User!]
+  attendance: Int
+  ratings(where: RatingWhereInput, orderBy: RatingOrderByInput, skip: Int, after: String, before: String, first: Int, last: Int): [Rating!]
+  published: Boolean!
+  blocks(where: BlockWhereInput, orderBy: BlockOrderByInput, skip: Int, after: String, before: String, first: Int, last: Int): [Block!]
+}
+
+type TrainingConnection {
+  pageInfo: PageInfo!
+  edges: [TrainingEdge]!
+  aggregate: AggregateTraining!
+}
+
+input TrainingCreateInput {
+  id: ID
+  title: String!
+  type: TrainingTypeCreateOneInput!
+  trainingDate: DateTime
+  location: String
+  registrations: UserCreateManyInput
+  attendance: Int
+  ratings: RatingCreateManyInput
+  published: Boolean!
+  blocks: BlockCreateManyInput
+}
+
+type TrainingEdge {
+  node: Training!
+  cursor: String!
+}
+
+enum TrainingOrderByInput {
+  id_ASC
+  id_DESC
+  title_ASC
+  title_DESC
+  createdAt_ASC
+  createdAt_DESC
+  trainingDate_ASC
+  trainingDate_DESC
+  location_ASC
+  location_DESC
+  attendance_ASC
+  attendance_DESC
+  published_ASC
+  published_DESC
+}
+
+type TrainingPreviousValues {
+  id: ID!
+  title: String!
+  createdAt: DateTime!
+  trainingDate: DateTime
+  location: String
+  attendance: Int
+  published: Boolean!
+}
+
+type TrainingSubscriptionPayload {
+  mutation: MutationType!
+  node: Training
+  updatedFields: [String!]
+  previousValues: TrainingPreviousValues
+}
+
+input TrainingSubscriptionWhereInput {
+  mutation_in: [MutationType!]
+  updatedFields_contains: String
+  updatedFields_contains_every: [String!]
+  updatedFields_contains_some: [String!]
+  node: TrainingWhereInput
+  AND: [TrainingSubscriptionWhereInput!]
+  OR: [TrainingSubscriptionWhereInput!]
+  NOT: [TrainingSubscriptionWhereInput!]
+}
+
+type TrainingType {
+  id: ID!
+  name: String!
+  description: String!
+}
+
+type TrainingTypeConnection {
+  pageInfo: PageInfo!
+  edges: [TrainingTypeEdge]!
+  aggregate: AggregateTrainingType!
+}
+
+input TrainingTypeCreateInput {
+  id: ID
+  name: String!
+  description: String!
+}
+
+input TrainingTypeCreateOneInput {
+  create: TrainingTypeCreateInput
+  connect: TrainingTypeWhereUniqueInput
+}
+
+type TrainingTypeEdge {
+  node: TrainingType!
+  cursor: String!
+}
+
+enum TrainingTypeOrderByInput {
+  id_ASC
+  id_DESC
+  name_ASC
+  name_DESC
+  description_ASC
+  description_DESC
+}
+
+type TrainingTypePreviousValues {
+  id: ID!
+  name: String!
+  description: String!
+}
+
+type TrainingTypeSubscriptionPayload {
+  mutation: MutationType!
+  node: TrainingType
+  updatedFields: [String!]
+  previousValues: TrainingTypePreviousValues
+}
+
+input TrainingTypeSubscriptionWhereInput {
+  mutation_in: [MutationType!]
+  updatedFields_contains: String
+  updatedFields_contains_every: [String!]
+  updatedFields_contains_some: [String!]
+  node: TrainingTypeWhereInput
+  AND: [TrainingTypeSubscriptionWhereInput!]
+  OR: [TrainingTypeSubscriptionWhereInput!]
+  NOT: [TrainingTypeSubscriptionWhereInput!]
+}
+
+input TrainingTypeUpdateDataInput {
+  name: String
+  description: String
+}
+
+input TrainingTypeUpdateInput {
+  name: String
+  description: String
+}
+
+input TrainingTypeUpdateManyMutationInput {
+  name: String
+  description: String
+}
+
+input TrainingTypeUpdateOneRequiredInput {
+  create: TrainingTypeCreateInput
+  update: TrainingTypeUpdateDataInput
+  upsert: TrainingTypeUpsertNestedInput
+  connect: TrainingTypeWhereUniqueInput
+}
+
+input TrainingTypeUpsertNestedInput {
+  update: TrainingTypeUpdateDataInput!
+  create: TrainingTypeCreateInput!
+}
+
+input TrainingTypeWhereInput {
+  id: ID
+  id_not: ID
+  id_in: [ID!]
+  id_not_in: [ID!]
+  id_lt: ID
+  id_lte: ID
+  id_gt: ID
+  id_gte: ID
+  id_contains: ID
+  id_not_contains: ID
+  id_starts_with: ID
+  id_not_starts_with: ID
+  id_ends_with: ID
+  id_not_ends_with: ID
+  name: String
+  name_not: String
+  name_in: [String!]
+  name_not_in: [String!]
+  name_lt: String
+  name_lte: String
+  name_gt: String
+  name_gte: String
+  name_contains: String
+  name_not_contains: String
+  name_starts_with: String
+  name_not_starts_with: String
+  name_ends_with: String
+  name_not_ends_with: String
+  description: String
+  description_not: String
+  description_in: [String!]
+  description_not_in: [String!]
+  description_lt: String
+  description_lte: String
+  description_gt: String
+  description_gte: String
+  description_contains: String
+  description_not_contains: String
+  description_starts_with: String
+  description_not_starts_with: String
+  description_ends_with: String
+  description_not_ends_with: String
+  AND: [TrainingTypeWhereInput!]
+  OR: [TrainingTypeWhereInput!]
+  NOT: [TrainingTypeWhereInput!]
+}
+
+input TrainingTypeWhereUniqueInput {
+  id: ID
+  name: String
+}
+
+input TrainingUpdateInput {
+  title: String
+  type: TrainingTypeUpdateOneRequiredInput
+  trainingDate: DateTime
+  location: String
+  registrations: UserUpdateManyInput
+  attendance: Int
+  ratings: RatingUpdateManyInput
+  published: Boolean
+  blocks: BlockUpdateManyInput
+}
+
+input TrainingUpdateManyMutationInput {
+  title: String
+  trainingDate: DateTime
+  location: String
+  attendance: Int
+  published: Boolean
+}
+
+input TrainingWhereInput {
+  id: ID
+  id_not: ID
+  id_in: [ID!]
+  id_not_in: [ID!]
+  id_lt: ID
+  id_lte: ID
+  id_gt: ID
+  id_gte: ID
+  id_contains: ID
+  id_not_contains: ID
+  id_starts_with: ID
+  id_not_starts_with: ID
+  id_ends_with: ID
+  id_not_ends_with: ID
+  title: String
+  title_not: String
+  title_in: [String!]
+  title_not_in: [String!]
+  title_lt: String
+  title_lte: String
+  title_gt: String
+  title_gte: String
+  title_contains: String
+  title_not_contains: String
+  title_starts_with: String
+  title_not_starts_with: String
+  title_ends_with: String
+  title_not_ends_with: String
+  type: TrainingTypeWhereInput
+  createdAt: DateTime
+  createdAt_not: DateTime
+  createdAt_in: [DateTime!]
+  createdAt_not_in: [DateTime!]
+  createdAt_lt: DateTime
+  createdAt_lte: DateTime
+  createdAt_gt: DateTime
+  createdAt_gte: DateTime
+  trainingDate: DateTime
+  trainingDate_not: DateTime
+  trainingDate_in: [DateTime!]
+  trainingDate_not_in: [DateTime!]
+  trainingDate_lt: DateTime
+  trainingDate_lte: DateTime
+  trainingDate_gt: DateTime
+  trainingDate_gte: DateTime
+  location: String
+  location_not: String
+  location_in: [String!]
+  location_not_in: [String!]
+  location_lt: String
+  location_lte: String
+  location_gt: String
+  location_gte: String
+  location_contains: String
+  location_not_contains: String
+  location_starts_with: String
+  location_not_starts_with: String
+  location_ends_with: String
+  location_not_ends_with: String
+  registrations_every: UserWhereInput
+  registrations_some: UserWhereInput
+  registrations_none: UserWhereInput
+  attendance: Int
+  attendance_not: Int
+  attendance_in: [Int!]
+  attendance_not_in: [Int!]
+  attendance_lt: Int
+  attendance_lte: Int
+  attendance_gt: Int
+  attendance_gte: Int
+  ratings_every: RatingWhereInput
+  ratings_some: RatingWhereInput
+  ratings_none: RatingWhereInput
+  published: Boolean
+  published_not: Boolean
+  blocks_every: BlockWhereInput
+  blocks_some: BlockWhereInput
+  blocks_none: BlockWhereInput
+  AND: [TrainingWhereInput!]
+  OR: [TrainingWhereInput!]
+  NOT: [TrainingWhereInput!]
+}
+
+input TrainingWhereUniqueInput {
+  id: ID
+}
+
+type User {
+  id: ID!
+  email: String!
+  name: String!
+  password: String!
+  resetToken: String
+  resetTokenExpiry: Float
+  createdAt: DateTime!
+  comments(where: CommentWhereInput, orderBy: CommentOrderByInput, skip: Int, after: String, before: String, first: Int, last: Int): [Comment!]
+  ratings(where: RatingWhereInput, orderBy: RatingOrderByInput, skip: Int, after: String, before: String, first: Int, last: Int): [Rating!]
+  permissions: [Permission!]!
+  interests: [String!]!
+}
+
+type UserConnection {
+  pageInfo: PageInfo!
+  edges: [UserEdge]!
+  aggregate: AggregateUser!
+}
+
+input UserCreateInput {
+  id: ID
+  email: String!
+  name: String!
+  password: String!
+  resetToken: String
+  resetTokenExpiry: Float
+  comments: CommentCreateManyWithoutAuthorInput
+  ratings: RatingCreateManyWithoutUserInput
+  permissions: UserCreatepermissionsInput
+  interests: UserCreateinterestsInput
+}
+
+input UserCreateinterestsInput {
+  set: [String!]
+}
+
+input UserCreateManyInput {
+  create: [UserCreateInput!]
+  connect: [UserWhereUniqueInput!]
+}
+
+input UserCreateOneWithoutCommentsInput {
+  create: UserCreateWithoutCommentsInput
+  connect: UserWhereUniqueInput
+}
+
+input UserCreateOneWithoutRatingsInput {
+  create: UserCreateWithoutRatingsInput
+  connect: UserWhereUniqueInput
+}
+
+input UserCreatepermissionsInput {
+  set: [Permission!]
+}
+
+input UserCreateWithoutCommentsInput {
+  id: ID
+  email: String!
+  name: String!
+  password: String!
+  resetToken: String
+  resetTokenExpiry: Float
+  ratings: RatingCreateManyWithoutUserInput
+  permissions: UserCreatepermissionsInput
+  interests: UserCreateinterestsInput
+}
+
+input UserCreateWithoutRatingsInput {
+  id: ID
+  email: String!
+  name: String!
+  password: String!
+  resetToken: String
+  resetTokenExpiry: Float
+  comments: CommentCreateManyWithoutAuthorInput
+  permissions: UserCreatepermissionsInput
+  interests: UserCreateinterestsInput
+}
+
+type UserEdge {
+  node: User!
+  cursor: String!
+}
+
+enum UserOrderByInput {
+  id_ASC
+  id_DESC
+  email_ASC
+  email_DESC
+  name_ASC
+  name_DESC
+  password_ASC
+  password_DESC
+  resetToken_ASC
+  resetToken_DESC
+  resetTokenExpiry_ASC
+  resetTokenExpiry_DESC
+  createdAt_ASC
+  createdAt_DESC
+}
+
+type UserPreviousValues {
+  id: ID!
+  email: String!
+  name: String!
+  password: String!
+  resetToken: String
+  resetTokenExpiry: Float
+  createdAt: DateTime!
+  permissions: [Permission!]!
+  interests: [String!]!
+}
+
+input UserScalarWhereInput {
+  id: ID
+  id_not: ID
+  id_in: [ID!]
+  id_not_in: [ID!]
+  id_lt: ID
+  id_lte: ID
+  id_gt: ID
+  id_gte: ID
+  id_contains: ID
+  id_not_contains: ID
+  id_starts_with: ID
+  id_not_starts_with: ID
+  id_ends_with: ID
+  id_not_ends_with: ID
+  email: String
+  email_not: String
+  email_in: [String!]
+  email_not_in: [String!]
+  email_lt: String
+  email_lte: String
+  email_gt: String
+  email_gte: String
+  email_contains: String
+  email_not_contains: String
+  email_starts_with: String
+  email_not_starts_with: String
+  email_ends_with: String
+  email_not_ends_with: String
+  name: String
+  name_not: String
+  name_in: [String!]
+  name_not_in: [String!]
+  name_lt: String
+  name_lte: String
+  name_gt: String
+  name_gte: String
+  name_contains: String
+  name_not_contains: String
+  name_starts_with: String
+  name_not_starts_with: String
+  name_ends_with: String
+  name_not_ends_with: String
+  password: String
+  password_not: String
+  password_in: [String!]
+  password_not_in: [String!]
+  password_lt: String
+  password_lte: String
+  password_gt: String
+  password_gte: String
+  password_contains: String
+  password_not_contains: String
+  password_starts_with: String
+  password_not_starts_with: String
+  password_ends_with: String
+  password_not_ends_with: String
+  resetToken: String
+  resetToken_not: String
+  resetToken_in: [String!]
+  resetToken_not_in: [String!]
+  resetToken_lt: String
+  resetToken_lte: String
+  resetToken_gt: String
+  resetToken_gte: String
+  resetToken_contains: String
+  resetToken_not_contains: String
+  resetToken_starts_with: String
+  resetToken_not_starts_with: String
+  resetToken_ends_with: String
+  resetToken_not_ends_with: String
+  resetTokenExpiry: Float
+  resetTokenExpiry_not: Float
+  resetTokenExpiry_in: [Float!]
+  resetTokenExpiry_not_in: [Float!]
+  resetTokenExpiry_lt: Float
+  resetTokenExpiry_lte: Float
+  resetTokenExpiry_gt: Float
+  resetTokenExpiry_gte: Float
+  createdAt: DateTime
+  createdAt_not: DateTime
+  createdAt_in: [DateTime!]
+  createdAt_not_in: [DateTime!]
+  createdAt_lt: DateTime
+  createdAt_lte: DateTime
+  createdAt_gt: DateTime
+  createdAt_gte: DateTime
+  AND: [UserScalarWhereInput!]
+  OR: [UserScalarWhereInput!]
+  NOT: [UserScalarWhereInput!]
+}
+
+type UserSubscriptionPayload {
+  mutation: MutationType!
+  node: User
+  updatedFields: [String!]
+  previousValues: UserPreviousValues
+}
+
+input UserSubscriptionWhereInput {
+  mutation_in: [MutationType!]
+  updatedFields_contains: String
+  updatedFields_contains_every: [String!]
+  updatedFields_contains_some: [String!]
+  node: UserWhereInput
+  AND: [UserSubscriptionWhereInput!]
+  OR: [UserSubscriptionWhereInput!]
+  NOT: [UserSubscriptionWhereInput!]
+}
+
+input UserUpdateDataInput {
+  email: String
+  name: String
+  password: String
+  resetToken: String
+  resetTokenExpiry: Float
+  comments: CommentUpdateManyWithoutAuthorInput
+  ratings: RatingUpdateManyWithoutUserInput
+  permissions: UserUpdatepermissionsInput
+  interests: UserUpdateinterestsInput
+}
+
+input UserUpdateInput {
+  email: String
+  name: String
+  password: String
+  resetToken: String
+  resetTokenExpiry: Float
+  comments: CommentUpdateManyWithoutAuthorInput
+  ratings: RatingUpdateManyWithoutUserInput
+  permissions: UserUpdatepermissionsInput
+  interests: UserUpdateinterestsInput
+}
+
+input UserUpdateinterestsInput {
+  set: [String!]
+}
+
+input UserUpdateManyDataInput {
+  email: String
+  name: String
+  password: String
+  resetToken: String
+  resetTokenExpiry: Float
+  permissions: UserUpdatepermissionsInput
+  interests: UserUpdateinterestsInput
+}
+
+input UserUpdateManyInput {
+  create: [UserCreateInput!]
+  update: [UserUpdateWithWhereUniqueNestedInput!]
+  upsert: [UserUpsertWithWhereUniqueNestedInput!]
+  delete: [UserWhereUniqueInput!]
+  connect: [UserWhereUniqueInput!]
+  set: [UserWhereUniqueInput!]
+  disconnect: [UserWhereUniqueInput!]
+  deleteMany: [UserScalarWhereInput!]
+  updateMany: [UserUpdateManyWithWhereNestedInput!]
+}
+
+input UserUpdateManyMutationInput {
+  email: String
+  name: String
+  password: String
+  resetToken: String
+  resetTokenExpiry: Float
+  permissions: UserUpdatepermissionsInput
+  interests: UserUpdateinterestsInput
+}
+
+input UserUpdateManyWithWhereNestedInput {
+  where: UserScalarWhereInput!
+  data: UserUpdateManyDataInput!
+}
+
+input UserUpdateOneRequiredWithoutCommentsInput {
+  create: UserCreateWithoutCommentsInput
+  update: UserUpdateWithoutCommentsDataInput
+  upsert: UserUpsertWithoutCommentsInput
+  connect: UserWhereUniqueInput
+}
+
+input UserUpdateOneRequiredWithoutRatingsInput {
+  create: UserCreateWithoutRatingsInput
+  update: UserUpdateWithoutRatingsDataInput
+  upsert: UserUpsertWithoutRatingsInput
+  connect: UserWhereUniqueInput
+}
+
+input UserUpdatepermissionsInput {
+  set: [Permission!]
+}
+
+input UserUpdateWithoutCommentsDataInput {
+  email: String
+  name: String
+  password: String
+  resetToken: String
+  resetTokenExpiry: Float
+  ratings: RatingUpdateManyWithoutUserInput
+  permissions: UserUpdatepermissionsInput
+  interests: UserUpdateinterestsInput
+}
+
+input UserUpdateWithoutRatingsDataInput {
+  email: String
+  name: String
+  password: String
+  resetToken: String
+  resetTokenExpiry: Float
+  comments: CommentUpdateManyWithoutAuthorInput
+  permissions: UserUpdatepermissionsInput
+  interests: UserUpdateinterestsInput
+}
+
+input UserUpdateWithWhereUniqueNestedInput {
+  where: UserWhereUniqueInput!
+  data: UserUpdateDataInput!
+}
+
+input UserUpsertWithoutCommentsInput {
+  update: UserUpdateWithoutCommentsDataInput!
+  create: UserCreateWithoutCommentsInput!
+}
+
+input UserUpsertWithoutRatingsInput {
+  update: UserUpdateWithoutRatingsDataInput!
+  create: UserCreateWithoutRatingsInput!
+}
+
+input UserUpsertWithWhereUniqueNestedInput {
+  where: UserWhereUniqueInput!
+  update: UserUpdateDataInput!
+  create: UserCreateInput!
+}
+
+input UserWhereInput {
+  id: ID
+  id_not: ID
+  id_in: [ID!]
+  id_not_in: [ID!]
+  id_lt: ID
+  id_lte: ID
+  id_gt: ID
+  id_gte: ID
+  id_contains: ID
+  id_not_contains: ID
+  id_starts_with: ID
+  id_not_starts_with: ID
+  id_ends_with: ID
+  id_not_ends_with: ID
+  email: String
+  email_not: String
+  email_in: [String!]
+  email_not_in: [String!]
+  email_lt: String
+  email_lte: String
+  email_gt: String
+  email_gte: String
+  email_contains: String
+  email_not_contains: String
+  email_starts_with: String
+  email_not_starts_with: String
+  email_ends_with: String
+  email_not_ends_with: String
+  name: String
+  name_not: String
+  name_in: [String!]
+  name_not_in: [String!]
+  name_lt: String
+  name_lte: String
+  name_gt: String
+  name_gte: String
+  name_contains: String
+  name_not_contains: String
+  name_starts_with: String
+  name_not_starts_with: String
+  name_ends_with: String
+  name_not_ends_with: String
+  password: String
+  password_not: String
+  password_in: [String!]
+  password_not_in: [String!]
+  password_lt: String
+  password_lte: String
+  password_gt: String
+  password_gte: String
+  password_contains: String
+  password_not_contains: String
+  password_starts_with: String
+  password_not_starts_with: String
+  password_ends_with: String
+  password_not_ends_with: String
+  resetToken: String
+  resetToken_not: String
+  resetToken_in: [String!]
+  resetToken_not_in: [String!]
+  resetToken_lt: String
+  resetToken_lte: String
+  resetToken_gt: String
+  resetToken_gte: String
+  resetToken_contains: String
+  resetToken_not_contains: String
+  resetToken_starts_with: String
+  resetToken_not_starts_with: String
+  resetToken_ends_with: String
+  resetToken_not_ends_with: String
+  resetTokenExpiry: Float
+  resetTokenExpiry_not: Float
+  resetTokenExpiry_in: [Float!]
+  resetTokenExpiry_not_in: [Float!]
+  resetTokenExpiry_lt: Float
+  resetTokenExpiry_lte: Float
+  resetTokenExpiry_gt: Float
+  resetTokenExpiry_gte: Float
+  createdAt: DateTime
+  createdAt_not: DateTime
+  createdAt_in: [DateTime!]
+  createdAt_not_in: [DateTime!]
+  createdAt_lt: DateTime
+  createdAt_lte: DateTime
+  createdAt_gt: DateTime
+  createdAt_gte: DateTime
+  comments_every: CommentWhereInput
+  comments_some: CommentWhereInput
+  comments_none: CommentWhereInput
+  ratings_every: RatingWhereInput
+  ratings_some: RatingWhereInput
+  ratings_none: RatingWhereInput
+  AND: [UserWhereInput!]
+  OR: [UserWhereInput!]
+  NOT: [UserWhereInput!]
+}
+
+input UserWhereUniqueInput {
+  id: ID
+  email: String
+}
+`

+ 1 - 1
backend/database/generated/prisma.graphql

@@ -1,5 +1,5 @@
 # source: http://prisma:4466
-# timestamp: Wed Apr 01 2020 14:31:17 GMT+0000 (Coordinated Universal Time)
+# timestamp: Wed Apr 01 2020 19:44:27 GMT+0000 (Coordinated Universal Time)
 
 type AggregateBlock {
   count: Int!

+ 0 - 47
backend/index.js

@@ -1,47 +0,0 @@
-/**
- * Configure dotenv:
- * https://www.npmjs.com/package/dotenv
- *
- * Configure CORS for use with localhost.
- */
-
-require('dotenv').config()
-const { GraphQLServer } = require('graphql-yoga')
-const cookieParser = require('cookie-parser')
-const bodyParser = require('body-parser')
-const { merge } = require('lodash')
-const { db, populateUser } = require('./src/db')
-const user = require('./src/user')
-
-const prismaResolvers = require('./src/resolvers')
-
-const resolvers = merge(prismaResolvers.resolvers, user.resolvers)
-
-const typeDefs = ['./schema.graphql']
-
-const server = new GraphQLServer({
-  typeDefs,
-  resolvers,
-  context: req => ({
-    ...req,
-    db,
-    debug: true
-  })
-})
-
-server.express.use(cookieParser())
-server.express.use(bodyParser.json())
-// server.express.use(quickMiddleware)
-server.express.use(user.authenticate)
-server.express.use(populateUser)
-server.express.use('/static', express.static('static'))
-
-server.start(
-  {
-    cors: {
-      credentials: true,
-      origin: process.env.FRONTEND_URL
-    }
-  },
-  server => console.log(`Server is running on http://localhost:${server.port}`)
-)

+ 57 - 0
backend/index.ts

@@ -0,0 +1,57 @@
+import dotenv from 'dotenv'
+dotenv.config()
+import express from 'express'
+import cookieParser from 'cookie-parser'
+import { ApolloServer, ApolloServerExpressConfig } from 'apollo-server-express'
+import { merge } from 'lodash'
+import { importSchema } from 'graphql-import'
+import { db, populateUser } from './src/db'
+import { authenticate } from './src/user/authenticate'
+//import file from './src/file'
+import user from './src/user'
+import history from './src/history'
+//import google from './src/google'
+import training from './src/training'
+
+const resolvers = merge(
+  //file.resolvers,
+  training.resolvers,
+  user.resolvers,
+  history.resolvers
+  //google.resolvers
+)
+
+const typeDefs = importSchema('./schema.graphql').replace('scalar Upload', '')
+// scalar Upload has to be in schema, or importSchema will complain.
+// But when it's in the schema, Apollo Server will still add it.
+// Workaround: remove it manually here after the import.
+// https://github.com/ardatan/graphql-import/issues/286
+
+const corsOptions = {
+  credentials: true,
+  origin: process.env.FRONTEND_URL
+}
+
+const app = express()
+app.use(cookieParser())
+app.use(authenticate)
+app.use(populateUser)
+
+const server = new ApolloServer({
+  typeDefs,
+  resolvers,
+  playground: true,
+  context: (req: any) => ({
+    ...req,
+    db
+  }),
+  debug: false,
+  engine: { debugPrintReports: false }
+} as ApolloServerExpressConfig)
+server.applyMiddleware({ app, cors: corsOptions })
+
+app.listen({ port: 4000 }, () => {
+  console.log(`Server ready at http://localhost:4000${server.graphqlPath}.`)
+})
+
+export default app

Fișier diff suprimat deoarece este prea mare
+ 8585 - 3983
backend/package-lock.json


+ 25 - 8
backend/package.json

@@ -4,23 +4,32 @@
   "description": "",
   "main": "index.js",
   "scripts": {
-    "start": "nodemon -e js,graphql -x node index.js",
-    "dev": "nodemon -e js,graphql -x node --inspect index.js",
+    "watch-ts": "tsc -w --preserveWatchOutput",
+    "server": "nodemon dist/index.js",
+    "start": "concurrently -k -p \"[{name}]\" -n \"TypeScript,Node\" -c \"yellow.bold,cyan.bold\" \"npm run watch-ts\" \"npm run server\"",
+    "dev": "nodemon -e ts,js,graphql -x node --inspect index.ts",
     "deploy": "prisma deploy",
-    "test": "echo \"Error: no test specified\" && exit 1"
+    "test": "jest --watch"
   },
   "author": "Tomi Cvetic <tomi.cvetic@gmail.com>",
   "license": "GPL-3.0",
   "dependencies": {
-    "bcryptjs": "2.4.3",
+    "@types/bcryptjs": "^2.4.2",
+    "@types/cookie-parser": "^1.4.2",
+    "@types/jsonwebtoken": "^8.3.8",
+    "@types/lodash": "^4.14.149",
+    "@types/randombytes": "^2.0.0",
+    "apollo-server-express": "^2.11.0",
+    "bcryptjs": "^2.4.3",
     "body-parser": "1.19.0",
     "cookie-parser": "1.4.4",
     "cors": "2.8.5",
+    "date-fns": "^2.11.1",
     "dotenv": "8.2.0",
-    "graphql": "14.5.8",
+    "graphql": "^14.6.0",
     "graphql-yoga": "1.18.3",
-    "jsonwebtoken": "8.5.1",
-    "nodemailer": "^6.4.2",
+    "jsonwebtoken": "^8.5.1",
+    "nodemailer": "^6.4.6",
     "prisma": "^1.34.10",
     "prisma-binding": "2.3.16",
     "promisify": "0.0.3",
@@ -28,7 +37,15 @@
     "standard": "14.3.1"
   },
   "devDependencies": {
+    "@babel/preset-typescript": "^7.9.0",
+    "@typescript-eslint/eslint-plugin": "^2.26.0",
+    "@typescript-eslint/parser": "^2.26.0",
+    "babel-plugin-module-resolver": "^4.0.0",
+    "concurrently": "^5.1.0",
+    "graphql-cli": "3.0.14",
+    "jest": "^25.2.4",
     "nodemon": "1.19.4",
-    "graphql-cli": "3.0.14"
+    "ts-jest": "^25.3.0",
+    "typescript": "^3.8.3"
   }
 }

+ 2 - 3
backend/prisma.yml

@@ -1,10 +1,9 @@
 endpoint: http://prisma:4466
 datamodel: datamodel.prisma
-secret: "PrismaSecret"
+secret: 'PrismaSecret'
 hooks:
   post-deploy:
-    - prisma generate
     - graphql get-schema -p prisma
 generate:
-  - generator: javascript-client
+  - generator: typescript-client
     output: ./database/generated/prisma-client

+ 3 - 3
backend/schema.graphql

@@ -57,9 +57,9 @@ type Mutation {
     exercises: [ID]!
     description: String!
   ): Block!
-  login(email: String!, password: String!): User!
-  logout: String!
-  signup(name: String!, email: String!, password: String!): User!
+  userLogin(email: String!, password: String!): User!
+  userLogout: String!
+  userSignup(name: String!, email: String!, password: String!): User!
   requestReset(email: String!): String!
   resetPassword(token: String!, password: String!): User!
 }

+ 5 - 8
backend/src/db.js → backend/src/db.ts

@@ -1,20 +1,19 @@
+/*
 /*
  * Using prisma-binding from
  * https://github.com/prisma/prisma-binding
  */
-const { Prisma } = require('prisma-binding')
-const {
-  typeDefs
-} = require('../database/generated/prisma-client/prisma-schema')
+import { Prisma } from 'prisma-binding'
+import { typeDefs } from '../database/generated/prisma-client/prisma-schema'
 
-const db = new Prisma({
+export const db = new Prisma({
   typeDefs,
   endpoint: process.env.PRISMA_ENDPOINT,
   secret: process.env.PRISMA_SECRET,
   debug: false
 })
 
-const populateUser = async (req, res, next) => {
+export const populateUser = async (req: any, res: any, next: any) => {
   if (!req.userId) return next()
   const user = await db.query.user(
     { where: { id: req.userId } },
@@ -23,5 +22,3 @@ const populateUser = async (req, res, next) => {
   req.user = user
   next()
 }
-
-module.exports = { db, populateUser }

+ 3 - 0
backend/src/history/index.ts

@@ -0,0 +1,3 @@
+import { resolvers } from './resolvers'
+
+export default { resolvers }

+ 15 - 0
backend/src/history/resolvers.ts

@@ -0,0 +1,15 @@
+import { IResolvers } from 'apollo-server-express'
+//import { checkPermission } from '../user/resolvers'
+
+export const resolvers: IResolvers = {
+  Query: {
+    // tournamentHistory: (parent, { id }, context, info) => {
+    //   checkPermission(context, 'ADMIN')
+    //   return context.db.query.histories(
+    //     { where: { table: 'tournament', tableId: id } },
+    //     info
+    //   )
+    // },
+  },
+  Mutation: {}
+}

+ 0 - 54
backend/src/resolvers.js

@@ -1,54 +0,0 @@
-// const { transport, emailTemplate } = require('./mail')
-
-const LoginError = new Error('You must be logged in.')
-// const PermissionError = new Error('Insufficient permissions.')
-
-const Query = {
-  training: async (parent, args, context, info) => {
-    if (!context.request.userId) throw LoginError
-    return context.db.query.training({ data: args }, info)
-  },
-  trainings: async (parent, args, context, info) => {
-    if (!context.request.userId) throw LoginError
-    return context.db.query.trainings({}, info)
-  },
-  trainingTypes: async (parent, args, context, info) => {
-    if (!context.request.userId) throw LoginError
-    return context.db.query.trainingTypes()
-  },
-  blocks: async (parent, args, context, info) => {
-    if (!context.request.userId) throw LoginError
-    return context.db.query.trainingTypes()
-  }
-}
-
-const Mutation = {
-  createTraining: async (parent, args, context, info) => {
-    if (!context.request.userId) throw LoginError
-    const training = await context.db.mutation.createTraining(
-      { data: args }, info
-    )
-    return training
-  },
-  createTrainingType: async (parent, args, context, info) => {
-    if (!context.request.userId) throw LoginError
-    const trainingType = await context.db.mutation.createTrainingType(
-      { data: args }, info
-    )
-    return trainingType
-  },
-  createBlock: async (parent, args, context, info) => {
-    if (!context.request.userId) throw LoginError
-    const block = await context.db.mutation.createBlock(
-      { data: args }, info
-    )
-    return block
-  }
-}
-
-const resolvers = {
-  Query,
-  Mutation
-}
-
-module.exports = { resolvers }

+ 3 - 0
backend/src/training/index.ts

@@ -0,0 +1,3 @@
+import { resolvers } from './resolvers'
+
+export default { resolvers }

+ 52 - 0
backend/src/training/resolvers.ts

@@ -0,0 +1,52 @@
+// const { transport, emailTemplate } = require('./mail')
+
+import { IResolvers } from 'apollo-server-express'
+import { checkPermission } from '../user/resolvers'
+
+//const LoginError = new Error('You must be logged in.')
+//const PermissionError = new Error('Insufficient permissions.')
+
+export const resolvers: IResolvers = {
+  Query: {
+    training: async (parent, args, context, info) => {
+      checkPermission(context)
+      return context.db.query.training({ data: args }, info)
+    },
+    trainings: async (parent, args, context, info) => {
+      checkPermission(context)
+      return context.db.query.trainings()
+    },
+    trainingTypes: async (parent, args, context, info) => {
+      checkPermission(context)
+      return context.db.query.trainingTypes()
+    },
+    blocks: async (parent, args, context, info) => {
+      checkPermission(context)
+      return context.db.query.trainingTypes()
+    }
+  },
+
+  Mutation: {
+    createTraining: async (parent, args, context, info) => {
+      checkPermission(context)
+      const training = await context.db.mutation.createTraining(
+        { data: args },
+        info
+      )
+      return training
+    },
+    createTrainingType: async (parent, args, context, info) => {
+      checkPermission(context)
+      const trainingType = await context.db.mutation.createTrainingType(
+        { data: args },
+        info
+      )
+      return trainingType
+    },
+    createBlock: async (parent, args, context, info) => {
+      checkPermission(context)
+      const block = await context.db.mutation.createBlock({ data: args }, info)
+      return block
+    }
+  }
+}

+ 1 - 1
backend/src/user/resolvers.ts

@@ -1,4 +1,4 @@
-import { IResolvers } from 'apollo-server'
+import { IResolvers } from 'apollo-server-express'
 
 import bcrypt from 'bcryptjs'
 import jwt from 'jsonwebtoken'

+ 27 - 0
backend/tsconfig.json

@@ -0,0 +1,27 @@
+{
+  "compilerOptions": {
+    "target": "ESNext",
+    "module": "CommonJS",
+    "declaration": true,
+    "allowSyntheticDefaultImports": true,
+    "moduleResolution": "Node",
+    "sourceMap": true,
+    "outDir": "dist",
+    "strict": true,
+    "alwaysStrict": true,
+    "strictNullChecks": true,
+    "strictPropertyInitialization": true,
+    "noImplicitAny": true,
+    "noImplicitThis": true,
+    "noImplicitReturns": true,
+    "noUnusedLocals": true,
+    "noFallthroughCasesInSwitch": true,
+    "esModuleInterop": true,
+    "baseUrl": ".",
+    "paths": {
+      "*": ["node_modules/*", "src/*"]
+    }
+  },
+  "exclude": ["node_modules", "dist"],
+  "include": ["*.ts", "**/*.ts"]
+}

+ 4 - 1
codegen.yml

@@ -1,9 +1,12 @@
 overwrite: true
-schema: 'backend/schema.graphql'
+schema: 
+  - backend/schema.graphql
+
 documents: 'frontend/src/**/*.graphql'
 generates:
   frontend/src/gql/index.tsx:
     config:
+      skipTypename: true
       withHooks: true
       withComponent: false
       withHOC: false

+ 19 - 91
frontend/src/gql/index.tsx

@@ -15,7 +15,6 @@ export type Scalars = {
 };
 
 export type Block = Node & {
-   __typename?: 'Block',
   id: Scalars['ID'],
   sequence: Scalars['Int'],
   title: Scalars['String'],
@@ -242,7 +241,6 @@ export type BlockWhereInput = {
 };
 
 export type Comment = Node & {
-   __typename?: 'Comment',
   id: Scalars['ID'],
   text: Scalars['String'],
   author: User,
@@ -467,7 +465,6 @@ export type CommentWhereUniqueInput = {
 
 
 export type Exercise = Node & {
-   __typename?: 'Exercise',
   id: Scalars['ID'],
   name: Scalars['String'],
   description: Scalars['String'],
@@ -477,7 +474,6 @@ export type Exercise = Node & {
 };
 
 export type ExerciseInstance = Node & {
-   __typename?: 'ExerciseInstance',
   id: Scalars['ID'],
   exercise: Exercise,
   repetitions?: Maybe<Scalars['Int']>,
@@ -660,7 +656,6 @@ export type ExerciseWhereInput = {
 };
 
 export type Format = Node & {
-   __typename?: 'Format',
   id: Scalars['ID'],
   name: Scalars['String'],
   description: Scalars['String'],
@@ -757,16 +752,15 @@ export type FormatWhereInput = {
 };
 
 export type Mutation = {
-   __typename?: 'Mutation',
   createUser: User,
   updateUser?: Maybe<User>,
   deleteUser?: Maybe<User>,
   createTraining: Training,
   createTrainingType: TrainingType,
   createBlock: Block,
-  login: User,
-  logout: Scalars['String'],
-  signup: User,
+  userLogin: User,
+  userLogout: Scalars['String'],
+  userSignup: User,
   requestReset: Scalars['String'],
   resetPassword: User,
 };
@@ -811,13 +805,13 @@ export type MutationCreateBlockArgs = {
 };
 
 
-export type MutationLoginArgs = {
+export type MutationUserLoginArgs = {
   email: Scalars['String'],
   password: Scalars['String']
 };
 
 
-export type MutationSignupArgs = {
+export type MutationUserSignupArgs = {
   name: Scalars['String'],
   email: Scalars['String'],
   password: Scalars['String']
@@ -846,7 +840,6 @@ export enum Permission {
 }
 
 export type Query = {
-   __typename?: 'Query',
   users: Array<Maybe<User>>,
   training?: Maybe<Training>,
   trainings: Array<Maybe<Training>>,
@@ -905,7 +898,6 @@ export type QueryBlocksArgs = {
 };
 
 export type Rating = Node & {
-   __typename?: 'Rating',
   id: Scalars['ID'],
   user: User,
   value: Scalars['Int'],
@@ -1165,7 +1157,6 @@ export type RatingWhereUniqueInput = {
 };
 
 export type Track = Node & {
-   __typename?: 'Track',
   id: Scalars['ID'],
   title: Scalars['String'],
   artist: Scalars['String'],
@@ -1319,7 +1310,6 @@ export type TrackWhereInput = {
 };
 
 export type Training = Node & {
-   __typename?: 'Training',
   id: Scalars['ID'],
   title: Scalars['String'],
   type: TrainingType,
@@ -1384,7 +1374,6 @@ export enum TrainingOrderByInput {
 }
 
 export type TrainingType = Node & {
-   __typename?: 'TrainingType',
   id: Scalars['ID'],
   name: Scalars['String'],
   description: Scalars['String'],
@@ -1642,7 +1631,6 @@ export type TrainingWhereUniqueInput = {
 };
 
 export type User = Node & {
-   __typename?: 'User',
   id: Scalars['ID'],
   email: Scalars['String'],
   name: Scalars['String'],
@@ -1919,37 +1907,19 @@ export type UserWhereInput = {
 export type TrainingsQueryVariables = {};
 
 
-export type TrainingsQuery = (
-  { __typename?: 'Query' }
-  & { trainings: Array<Maybe<(
-    { __typename?: 'Training' }
-    & Pick<Training, 'id' | 'published'>
-  )>> }
-);
+export type TrainingsQuery = { trainings: Array<Maybe<Pick<Training, 'id' | 'published'>>> };
 
 export type CreateTrainingMutationVariables = {
   title: Scalars['String']
 };
 
 
-export type CreateTrainingMutation = (
-  { __typename?: 'Mutation' }
-  & { createTraining: (
-    { __typename?: 'Training' }
-    & Pick<Training, 'id'>
-  ) }
-);
+export type CreateTrainingMutation = { createTraining: Pick<Training, 'id'> };
 
 export type UsersQueryVariables = {};
 
 
-export type UsersQuery = (
-  { __typename?: 'Query' }
-  & { users: Array<Maybe<(
-    { __typename?: 'User' }
-    & Pick<User, 'id' | 'email' | 'name' | 'permissions' | 'interests'>
-  )>> }
-);
+export type UsersQuery = { users: Array<Maybe<Pick<User, 'id' | 'email' | 'name' | 'permissions' | 'interests'>>> };
 
 export type UserSignupMutationVariables = {
   email: Scalars['String'],
@@ -1958,13 +1928,7 @@ export type UserSignupMutationVariables = {
 };
 
 
-export type UserSignupMutation = (
-  { __typename?: 'Mutation' }
-  & { signup: (
-    { __typename?: 'User' }
-    & Pick<User, 'id' | 'email' | 'name'>
-  ) }
-);
+export type UserSignupMutation = { userSignup: Pick<User, 'id' | 'email' | 'name'> };
 
 export type UserLoginMutationVariables = {
   email: Scalars['String'],
@@ -1972,42 +1936,24 @@ export type UserLoginMutationVariables = {
 };
 
 
-export type UserLoginMutation = (
-  { __typename?: 'Mutation' }
-  & { login: (
-    { __typename?: 'User' }
-    & Pick<User, 'id' | 'email' | 'name'>
-  ) }
-);
+export type UserLoginMutation = { userLogin: Pick<User, 'id' | 'email' | 'name'> };
 
 export type UserLogoutMutationVariables = {};
 
 
-export type UserLogoutMutation = (
-  { __typename?: 'Mutation' }
-  & Pick<Mutation, 'logout'>
-);
+export type UserLogoutMutation = Pick<Mutation, 'userLogout'>;
 
 export type CurrentUserQueryVariables = {};
 
 
-export type CurrentUserQuery = (
-  { __typename?: 'Query' }
-  & { currentUser: (
-    { __typename?: 'User' }
-    & Pick<User, 'id' | 'email' | 'name' | 'permissions' | 'interests'>
-  ) }
-);
+export type CurrentUserQuery = { currentUser: Pick<User, 'id' | 'email' | 'name' | 'permissions' | 'interests'> };
 
 export type RequestResetMutationVariables = {
   email: Scalars['String']
 };
 
 
-export type RequestResetMutation = (
-  { __typename?: 'Mutation' }
-  & Pick<Mutation, 'requestReset'>
-);
+export type RequestResetMutation = Pick<Mutation, 'requestReset'>;
 
 export type ResetPasswordMutationVariables = {
   token: Scalars['String'],
@@ -2015,26 +1961,14 @@ export type ResetPasswordMutationVariables = {
 };
 
 
-export type ResetPasswordMutation = (
-  { __typename?: 'Mutation' }
-  & { resetPassword: (
-    { __typename?: 'User' }
-    & Pick<User, 'id' | 'name'>
-  ) }
-);
+export type ResetPasswordMutation = { resetPassword: Pick<User, 'id' | 'name'> };
 
 export type UserDeleteMutationVariables = {
   email: Scalars['String']
 };
 
 
-export type UserDeleteMutation = (
-  { __typename?: 'Mutation' }
-  & { deleteUser: Maybe<(
-    { __typename?: 'User' }
-    & Pick<User, 'id'>
-  )> }
-);
+export type UserDeleteMutation = { deleteUser: Maybe<Pick<User, 'id'>> };
 
 export type UserUpdateMutationVariables = {
   email: Scalars['String'],
@@ -2042,13 +1976,7 @@ export type UserUpdateMutationVariables = {
 };
 
 
-export type UserUpdateMutation = (
-  { __typename?: 'Mutation' }
-  & { updateUser: Maybe<(
-    { __typename?: 'User' }
-    & Pick<User, 'id' | 'name' | 'email' | 'permissions' | 'interests'>
-  )> }
-);
+export type UserUpdateMutation = { updateUser: Maybe<Pick<User, 'id' | 'name' | 'email' | 'permissions' | 'interests'>> };
 
 
 export const TrainingsDocument = gql`
@@ -2154,7 +2082,7 @@ export type UsersLazyQueryHookResult = ReturnType<typeof useUsersLazyQuery>;
 export type UsersQueryResult = ApolloReactCommon.QueryResult<UsersQuery, UsersQueryVariables>;
 export const UserSignupDocument = gql`
     mutation UserSignup($email: String!, $password: String!, $name: String!) {
-  signup(email: $email, password: $password, name: $name) {
+  userSignup(email: $email, password: $password, name: $name) {
     id
     email
     name
@@ -2190,7 +2118,7 @@ export type UserSignupMutationResult = ApolloReactCommon.MutationResult<UserSign
 export type UserSignupMutationOptions = ApolloReactCommon.BaseMutationOptions<UserSignupMutation, UserSignupMutationVariables>;
 export const UserLoginDocument = gql`
     mutation UserLogin($email: String!, $password: String!) {
-  login(email: $email, password: $password) {
+  userLogin(email: $email, password: $password) {
     id
     email
     name
@@ -2225,7 +2153,7 @@ export type UserLoginMutationResult = ApolloReactCommon.MutationResult<UserLogin
 export type UserLoginMutationOptions = ApolloReactCommon.BaseMutationOptions<UserLoginMutation, UserLoginMutationVariables>;
 export const UserLogoutDocument = gql`
     mutation UserLogout {
-  logout
+  userLogout
 }
     `;
 export type UserLogoutMutationFn = ApolloReactCommon.MutationFunction<UserLogoutMutation, UserLogoutMutationVariables>;

+ 3 - 3
frontend/src/user/user.graphql

@@ -9,7 +9,7 @@ query Users {
 }
 
 mutation UserSignup($email: String!, $password: String!, $name: String!) {
-  signup(email: $email, password: $password, name: $name) {
+  userSignup(email: $email, password: $password, name: $name) {
     id
     email
     name
@@ -17,7 +17,7 @@ mutation UserSignup($email: String!, $password: String!, $name: String!) {
 }
 
 mutation UserLogin($email: String!, $password: String!) {
-  login(email: $email, password: $password) {
+  userLogin(email: $email, password: $password) {
     id
     email
     name
@@ -25,7 +25,7 @@ mutation UserLogin($email: String!, $password: String!) {
 }
 
 mutation UserLogout {
-  logout
+  userLogout
 }
 
 query CurrentUser {

Unele fișiere nu au fost afișate deoarece prea multe fișiere au fost modificate în acest diff