Skip to content

Latest commit

 

History

History
3549 lines (3479 loc) · 103 KB

README.md

File metadata and controls

3549 lines (3479 loc) · 103 KB

Omniauth Marvin

Build Status Maintainability Coverage Status

OmniAuth OAuth2 strategy for 42 School.

Installation

Add this line to your application's Gemfile:

gem 'omniauth-marvin', '~> 1.2.0'

Or, install it yourself like below:

gem install omniauth-marvin

run bundle install

Usage

(Skip this if you want to use the gem with Devise to authenticate users)

Register your application on 42's intranet to receive an API Key.

Here's an example for adding the middleware to a Rails app in config/initializers/omniauth.rb

Rails.application.config.middleware.use OmniAuth::Builder do
  provider :marvin, ENV["FT_ID"], ENV["FT_SECRET"]
end

You can now access the OmniAuth 42 OAuth2 URL: /auth/marvin

Read the Omniauth Wiki or see this RailsCast for an example on how to use this Rack middleware without any other gem.

Devise

If you wish to use this gem with devise, do NOT use the code snippet above in the Usage section. Instead, follow these steps:

Add the devise gem to your Gemfile.

gem 'devise'

run bundle install

Generate migrations and models

rails g devise:install
rails g devise user
rails g devise:controllers users -c=omniauth_callbacks
rails g migration AddLoginToUsers login:string
rails g migration AddOmniauthToUsers provider:index uid:index

Before migrating, for this example since we are not going to use trackable, and all the devise module. Then please edit the file created into db/*_devise_create_users, to only keep:

# frozen_string_literal: true

class DeviseCreateUsers < ActiveRecord::Migration[6.1]
  def change
    create_table :users do |t|
      t.string :email,              null: false, default: ""
      t.timestamps null: false
    end
    add_index :users, :email,                unique: true
  end
end

now you can migrate:

rails db:migrate

You can add any additional migration you want. For instance, phone, level, wallet...etc.

Declare the provider

config/initializers/devise.rb

Devise.setup do |config|
  .
  .
  config.omniauth :marvin, ENV["FT_ID"], ENV["FT_SECRET"]
  .
  .
end

Don't forget to set the "FT_ID" and "FT_SECRET" (your app id and secret) in your environment variables.

Make your model omniauthable

In this case, app/models/user.rb

class User < ActiveRecord::Base
  devise :omniauthable, omniauth_providers: [:marvin]
end

Add the from_omniauth class method to the user model

app/models/user.rb

Example:

  def self.from_omniauth(auth)
    where(provider: auth.provider, uid: auth.uid).first_or_create do |user|
      user.email = auth.info.email
      user.login = auth.info.login
    end
  end

Implement a callback in the routes

config/routes.rb

  devise_for :users, controllers: { omniauth_callbacks: "users/omniauth_callbacks" }

Edit the callbacks controller

app/controllers/users/omniauth_callbacks_controller.rb

Example:

# frozen_string_literal: true

class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController
  def marvin
    @user = User.from_omniauth(request.env["omniauth.auth"])

    if @user.persisted?
      sign_in_and_redirect @user, event: :authentication
      set_flash_message(:notice, :success, kind: "42") if is_navigational_format?
    else
      session["devise.marvin_data"] = request.env["omniauth.auth"]
      redirect_to new_user_registration_url
    end
  end

  def after_omniauth_failure_path_for scope
    # instead of root_path you can add sign_in_path if you end up to have your own sign_in page.
    root_path
  end
end

Add the Sign Out route

config/routes.rb

  devise_scope :user do
    delete 'sign_out', to: 'devise/sessions#destroy', as: :destroy_user_session
  end

Login/logout links

Here's a (very) basic example for login/logout links in the views

<%= link_to "Sign in with 42", user_marvin_omniauth_authorize_path unless current_user %>
<%= link_to "Sign out", destroy_user_session_path, method: :delete if current_user %>

Warning: Rails >7

You now need to pass the method through data like so:

<%= link_to "Sign out", destroy_user_session_path, data: { turbo_method: :delete } if current_user %>

More info

This section about devise and Omniauth was written with the help of devise documentation. More info about devise and Omniauth on their documentation.

Auth hash

Here's an example of the auth hash available in request.env['omniauth.auth']:

{
  "provider": "marvin",
  "uid": 19265,
  "info": {
    "first_name": "Jordane",
    "last_name": "Gengo",
    "name": "Jordane Angelo Gengo",
    "email": "[email protected]",
    "login": "jgengo",
    "image": "https://cdn.intra.42.fr/users/jgengo.jpg",
    "urls": {
      "profile": "https://api.intra.42.fr/v2/users/jgengo"
    }
  },
  "credentials": {
    "token": "",
    "refresh_token": "",
    "expires_at": 1618602578,
    "expires": true
  },
  "extra": {
    "raw_info": {
      "id": 19265,
      "email": "[email protected]",
      "login": "jgengo",
      "first_name": "Jordane",
      "last_name": "Gengo",
      "usual_first_name": "Jordane angelo",
      "url": "https://api.intra.42.fr/v2/users/jgengo",
      "phone": "hidden",
      "displayname": "Jordane Gengo",
      "usual_full_name": "Jordane Angelo Gengo",
      "image_url": "https://cdn.intra.42.fr/users/jgengo.jpg",
      "staff?": false,
      "correction_point": 28,
      "pool_month": "july",
      "pool_year": "2016",
      "location": null,
      "wallet": 125,
      "anonymize_date": "2022-04-16T00:00:00.000+02:00",
      "groups": [],
      "cursus_users": [
        {
          "grade": "Admiral",
          "level": 21.0,
          "skills": [
            {
              "id": 16,
              "name": "Company experience",
              "level": 21.24
            },
            {
              "id": 7,
              "name": "Group \u0026 interpersonal",
              "level": 17.39
            },
            {
              "id": 6,
              "name": "Web",
              "level": 13.36
            },
            {
              "id": 10,
              "name": "Network \u0026 system administration",
              "level": 11.66
            },
            {
              "id": 14,
              "name": "Adaptation \u0026 creativity",
              "level": 11.54
            },
            {
              "id": 12,
              "name": "DB \u0026 Data",
              "level": 8.39
            },
            {
              "id": 1,
              "name": "Algorithms \u0026 AI",
              "level": 5.9
            },
            {
              "id": 2,
              "name": "Imperative programming",
              "level": 4.5600000000000005
            },
            {
              "id": 4,
              "name": "Unix",
              "level": 4.53
            },
            {
              "id": 11,
              "name": "Security",
              "level": 4.26
            },
            {
              "id": 3,
              "name": "Rigor",
              "level": 3.2
            },
            {
              "id": 15,
              "name": "Technology integration",
              "level": 2.73
            },
            {
              "id": 17,
              "name": "Object-oriented programming",
              "level": 1.71
            },
            {
              "id": 5,
              "name": "Graphics",
              "level": 1.28
            }
          ],
          "blackholed_at": null,
          "id": 16191,
          "begin_at": "2016-11-02T08:00:00.000Z",
          "end_at": "2019-12-01T00:00:00.000Z",
          "cursus_id": 1,
          "has_coalition": true,
          "user": {
            "id": 19265,
            "login": "jgengo",
            "url": "https://api.intra.42.fr/v2/users/jgengo"
          },
          "cursus": {
            "id": 1,
            "created_at": "2014-11-02T16:43:38.480Z",
            "name": "42",
            "slug": "42"
          }
        },
        {
          "grade": null,
          "level": 4.0,
          "skills": [
            {
              "id": 4,
              "name": "Unix",
              "level": 4.13
            },
            {
              "id": 3,
              "name": "Rigor",
              "level": 3.73
            },
            {
              "id": 1,
              "name": "Algorithms \u0026 AI",
              "level": 3.66
            },
            {
              "id": 7,
              "name": "Group \u0026 interpersonal",
              "level": 0.69
            }
          ],
          "blackholed_at": null,
          "id": 10033,
          "begin_at": "2016-06-30T21:42:00.000Z",
          "end_at": "2016-07-31T21:42:00.000Z",
          "cursus_id": 4,
          "has_coalition": true,
          "user": {
            "id": 19265,
            "login": "jgengo",
            "url": "https://api.intra.42.fr/v2/users/jgengo"
          },
          "cursus": {
            "id": 4,
            "created_at": "2015-05-01T17:46:08.433Z",
            "name": "Piscine C",
            "slug": "piscine-c"
          }
        },
        {
          "grade": "Member",
          "level": 21.01,
          "skills": [
            {
              "id": 16,
              "name": "Company experience",
              "level": 21.25
            },
            {
              "id": 7,
              "name": "Group \u0026 interpersonal",
              "level": 17.39
            },
            {
              "id": 6,
              "name": "Web",
              "level": 13.36
            },
            {
              "id": 10,
              "name": "Network \u0026 system administration",
              "level": 11.66
            },
            {
              "id": 14,
              "name": "Adaptation \u0026 creativity",
              "level": 11.54
            },
            {
              "id": 12,
              "name": "DB \u0026 Data",
              "level": 8.39
            },
            {
              "id": 1,
              "name": "Algorithms \u0026 AI",
              "level": 5.52
            },
            {
              "id": 2,
              "name": "Imperative programming",
              "level": 5.03
            },
            {
              "id": 4,
              "name": "Unix",
              "level": 5.02
            },
            {
              "id": 11,
              "name": "Security",
              "level": 4.87
            },
            {
              "id": 3,
              "name": "Rigor",
              "level": 4.29
            },
            {
              "id": 15,
              "name": "Technology integration",
              "level": 4.06
            },
            {
              "id": 17,
              "name": "Object-oriented programming",
              "level": 2.92
            },
            {
              "id": 5,
              "name": "Graphics",
              "level": 2.56
            }
          ],
          "blackholed_at": "2018-05-16T07:00:00.000Z",
          "id": 83052,
          "begin_at": "2016-11-02T08:00:00.000Z",
          "end_at": null,
          "cursus_id": 21,
          "has_coalition": true,
          "user": {
            "id": 19265,
            "login": "jgengo",
            "url": "https://api.intra.42.fr/v2/users/jgengo"
          },
          "cursus": {
            "id": 21,
            "created_at": "2019-07-29T08:45:17.896Z",
            "name": "42cursus",
            "slug": "42cursus"
          }
        }
      ],
      "projects_users": [
        {
          "id": 1024960,
          "occurrence": 0,
          "final_mark": 100,
          "status": "finished",
          "validated?": true,
          "current_team_id": 2173586,
          "project": {
            "id": 211,
            "name": "Peer Video",
            "slug": "final-internship-peer-video",
            "parent_id": 212
          },
          "cursus_ids": [1],
          "marked_at": "2018-08-28T13:21:42.412Z",
          "marked": true,
          "retriable_at": "2018-08-28T13:21:46.156Z"
        },
        {
          "id": 745865,
          "occurrence": 0,
          "final_mark": 125,
          "status": "finished",
          "validated?": true,
          "current_team_id": 1844273,
          "project": {
            "id": 604,
            "name": "Darkly",
            "slug": "darkly",
            "parent_id": null
          },
          "cursus_ids": [1],
          "marked_at": "2017-11-28T18:03:50.501Z",
          "marked": true,
          "retriable_at": "2017-12-05T18:03:48.389Z"
        },
        {
          "id": 726705,
          "occurrence": 0,
          "final_mark": 125,
          "status": "finished",
          "validated?": true,
          "current_team_id": 1838773,
          "project": {
            "id": 597,
            "name": "Hypertube",
            "slug": "hypertube",
            "parent_id": null
          },
          "cursus_ids": [1],
          "marked_at": "2017-11-11T13:00:09.534Z",
          "marked": true,
          "retriable_at": "2017-11-18T13:00:06.065Z"
        },
        {
          "id": 689963,
          "occurrence": 0,
          "final_mark": 100,
          "status": "finished",
          "validated?": true,
          "current_team_id": 1780157,
          "project": {
            "id": 847,
            "name": "docker-1",
            "slug": "docker-1",
            "parent_id": null
          },
          "cursus_ids": [1],
          "marked_at": "2017-11-20T21:19:12.735Z",
          "marked": true,
          "retriable_at": "2017-11-23T21:19:10.824Z"
        },
        {
          "id": 689964,
          "occurrence": 0,
          "final_mark": 100,
          "status": "finished",
          "validated?": true,
          "current_team_id": 1780158,
          "project": {
            "id": 687,
            "name": "init",
            "slug": "init",
            "parent_id": null
          },
          "cursus_ids": [1],
          "marked_at": "2017-11-23T10:48:16.000Z",
          "marked": true,
          "retriable_at": "2017-11-24T10:48:13.584Z"
        },
        {
          "id": 689434,
          "occurrence": 0,
          "final_mark": 125,
          "status": "finished",
          "validated?": true,
          "current_team_id": 1779578,
          "project": {
            "id": 700,
            "name": "Dr Quine",
            "slug": "dr-quine",
            "parent_id": null
          },
          "cursus_ids": [1],
          "marked_at": "2017-09-25T09:06:43.558Z",
          "marked": true,
          "retriable_at": "2017-10-02T09:06:41.075Z"
        },
        {
          "id": 647141,
          "occurrence": 0,
          "final_mark": 100,
          "status": "finished",
          "validated?": true,
          "current_team_id": 1728650,
          "project": {
            "id": 60,
            "name": "Rush01",
            "slug": "piscine-php-rush01",
            "parent_id": 48
          },
          "cursus_ids": [1],
          "marked_at": "2017-10-30T09:46:22.689Z",
          "marked": true,
          "retriable_at": "2017-10-30T09:46:22.674Z"
        },
        {
          "id": 647136,
          "occurrence": 0,
          "final_mark": 100,
          "status": "finished",
          "validated?": true,
          "current_team_id": 1728642,
          "project": {
            "id": 54,
            "name": "Day 05",
            "slug": "42-piscine-c-formation-piscine-php-day-05",
            "parent_id": 48
          },
          "cursus_ids": [1],
          "marked_at": "2017-10-30T09:46:15.463Z",
          "marked": true,
          "retriable_at": "2017-10-21T13:56:59.293Z"
        },
        {
          "id": 647131,
          "occurrence": 0,
          "final_mark": 100,
          "status": "finished",
          "validated?": true,
          "current_team_id": 1728648,
          "project": {
            "id": 50,
            "name": "Day 01",
            "slug": "42-piscine-c-formation-piscine-php-day-01",
            "parent_id": 48
          },
          "cursus_ids": [1],
          "marked_at": "2017-10-30T09:46:10.441Z",
          "marked": true,
          "retriable_at": "2017-10-30T09:46:10.413Z"
        },
        {
          "id": 647135,
          "occurrence": 0,
          "final_mark": 100,
          "status": "finished",
          "validated?": true,
          "current_team_id": 1728649,
          "project": {
            "id": 59,
            "name": "Rush00",
            "slug": "piscine-php-rush00",
            "parent_id": 48
          },
          "cursus_ids": [1],
          "marked_at": "2017-10-30T09:46:15.392Z",
          "marked": true,
          "retriable_at": "2017-10-30T09:46:15.379Z"
        },
        {
          "id": 647139,
          "occurrence": 0,
          "final_mark": 100,
          "status": "finished",
          "validated?": true,
          "current_team_id": 1728645,
          "project": {
            "id": 57,
            "name": "Day 08",
            "slug": "42-piscine-c-formation-piscine-php-day-08",
            "parent_id": 48
          },
          "cursus_ids": [1],
          "marked_at": "2017-10-30T09:46:20.024Z",
          "marked": true,
          "retriable_at": "2017-10-30T09:46:19.997Z"
        },
        {
          "id": 647137,
          "occurrence": 0,
          "final_mark": 100,
          "status": "finished",
          "validated?": true,
          "current_team_id": 1728643,
          "project": {
            "id": 55,
            "name": "Day 06",
            "slug": "42-piscine-c-formation-piscine-php-day-06",
            "parent_id": 48
          },
          "cursus_ids": [1],
          "marked_at": "2017-10-30T09:46:16.640Z",
          "marked": true,
          "retriable_at": "2017-10-30T09:46:16.615Z"
        },
        {
          "id": 647130,
          "occurrence": 0,
          "final_mark": 100,
          "status": "finished",
          "validated?": true,
          "current_team_id": 1728647,
          "project": {
            "id": 49,
            "name": "Day 00",
            "slug": "42-piscine-c-formation-piscine-php-day-00",
            "parent_id": 48
          },
          "cursus_ids": [1],
          "marked_at": "2017-10-30T09:56:23.449Z",
          "marked": true,
          "retriable_at": "2017-10-30T09:56:23.426Z"
        },
        {
          "id": 647140,
          "occurrence": 0,
          "final_mark": 100,
          "status": "finished",
          "validated?": true,
          "current_team_id": 1728646,
          "project": {
            "id": 58,
            "name": "Day 09",
            "slug": "42-piscine-c-formation-piscine-php-day-09",
            "parent_id": 48
          },
          "cursus_ids": [1],
          "marked_at": "2017-10-30T09:46:21.440Z",
          "marked": true,
          "retriable_at": "2017-10-30T09:46:21.426Z"
        },
        {
          "id": 647138,
          "occurrence": 0,
          "final_mark": 100,
          "status": "finished",
          "validated?": true,
          "current_team_id": 1728644,
          "project": {
            "id": 56,
            "name": "Day 07",
            "slug": "42-piscine-c-formation-piscine-php-day-07",
            "parent_id": 48
          },
          "cursus_ids": [1],
          "marked_at": "2017-10-30T09:46:18.297Z",
          "marked": true,
          "retriable_at": "2017-10-30T09:46:18.272Z"
        },
        {
          "id": 647132,
          "occurrence": 0,
          "final_mark": 100,
          "status": "finished",
          "validated?": true,
          "current_team_id": 1728639,
          "project": {
            "id": 51,
            "name": "Day 02",
            "slug": "42-piscine-c-formation-piscine-php-day-02",
            "parent_id": 48
          },
          "cursus_ids": [1],
          "marked_at": "2017-10-30T09:46:11.788Z",
          "marked": true,
          "retriable_at": "2017-10-30T09:46:11.775Z"
        },
        {
          "id": 647133,
          "occurrence": 0,
          "final_mark": 100,
          "status": "finished",
          "validated?": true,
          "current_team_id": 1728640,
          "project": {
            "id": 52,
            "name": "Day 03",
            "slug": "42-piscine-c-formation-piscine-php-day-03",
            "parent_id": 48
          },
          "cursus_ids": [1],
          "marked_at": "2017-10-30T09:46:12.574Z",
          "marked": true,
          "retriable_at": "2017-10-30T09:46:12.553Z"
        },
        {
          "id": 647134,
          "occurrence": 0,
          "final_mark": 100,
          "status": "finished",
          "validated?": true,
          "current_team_id": 1728641,
          "project": {
            "id": 53,
            "name": "Day 04",
            "slug": "42-piscine-c-formation-piscine-php-day-04",
            "parent_id": 48
          },
          "cursus_ids": [1],
          "marked_at": "2017-10-30T09:46:13.729Z",
          "marked": true,
          "retriable_at": "2017-10-30T09:46:13.707Z"
        },
        {
          "id": 510252,
          "occurrence": 0,
          "final_mark": 118,
          "status": "finished",
          "validated?": true,
          "current_team_id": 1647106,
          "project": {
            "id": 596,
            "name": "Matcha",
            "slug": "matcha",
            "parent_id": null
          },
          "cursus_ids": [1],
          "marked_at": "2017-10-21T13:54:23.662Z",
          "marked": true,
          "retriable_at": "2017-10-28T13:54:21.000Z"
        },
        {
          "id": 557311,
          "occurrence": 0,
          "final_mark": 100,
          "status": "finished",
          "validated?": true,
          "current_team_id": 1619659,
          "project": {
            "id": 121,
            "name": "Peer Video",
            "slug": "first-internship-peer-video",
            "parent_id": 118
          },
          "cursus_ids": [1],
          "marked_at": "2018-01-10T11:55:46.173Z",
          "marked": true,
          "retriable_at": "2018-01-10T11:55:43.877Z"
        },
        {
          "id": 557310,
          "occurrence": 0,
          "final_mark": 111,
          "status": "finished",
          "validated?": true,
          "current_team_id": 1619658,
          "project": {
            "id": 120,
            "name": "Company final evaluation",
            "slug": "first-internship-company-final-evaluation",
            "parent_id": 118
          },
          "cursus_ids": [1],
          "marked_at": "2018-04-17T08:39:55.911Z",
          "marked": true,
          "retriable_at": null
        },
        {
          "id": 557309,
          "occurrence": 0,
          "final_mark": 103,
          "status": "finished",
          "validated?": true,
          "current_team_id": 1619657,
          "project": {
            "id": 826,
            "name": "Company mid evaluation",
            "slug": "first-internship-company-mid-evaluation",
            "parent_id": 118
          },
          "cursus_ids": [1],
          "marked_at": "2017-10-30T17:30:25.545Z",
          "marked": true,
          "retriable_at": null
        },
        {
          "id": 557308,
          "occurrence": 0,
          "final_mark": 125,
          "status": "finished",
          "validated?": true,
          "current_team_id": 1619656,
          "project": {
            "id": 140,
            "name": "Duration",
            "slug": "first-internship-duration",
            "parent_id": 118
          },
          "cursus_ids": [1],
          "marked_at": "2017-07-13T15:24:05.314Z",
          "marked": true,
          "retriable_at": null
        },
        {
          "id": 557307,
          "occurrence": 0,
          "final_mark": 100,
          "status": "finished",
          "validated?": true,
          "current_team_id": 1619655,
          "project": {
            "id": 119,
            "name": "Contract Upload",
            "slug": "first-internship-contract-upload",
            "parent_id": 118
          },
          "cursus_ids": [1],
          "marked_at": "2017-07-13T15:24:06.188Z",
          "marked": true,
          "retriable_at": "2017-07-13T15:22:35.355Z"
        },
        {
          "id": 490349,
          "occurrence": 0,
          "final_mark": 100,
          "status": "finished",
          "validated?": true,
          "current_team_id": 1539043,
          "project": {
            "id": 537,
            "name": "Camagru",
            "slug": "camagru",
            "parent_id": null
          },
          "cursus_ids": [1],
          "marked_at": "2017-06-26T21:53:01.617Z",
          "marked": true,
          "retriable_at": "2017-06-30T21:53:01.595Z"
        },
        {
          "id": 445223,
          "occurrence": 0,
          "final_mark": 0,
          "status": "finished",
          "validated?": false,
          "current_team_id": 1483034,
          "project": {
            "id": 803,
            "name": "Rush01",
            "slug": "piscine-ruby-on-rails-rush01",
            "parent_id": 791
          },
          "cursus_ids": [1],
          "marked_at": "2018-04-24T12:17:53.476Z",
          "marked": true,
          "retriable_at": "2018-04-24T12:17:53.464Z"
        },
        {
          "id": 445417,
          "occurrence": 0,
          "final_mark": 0,
          "status": "finished",
          "validated?": false,
          "current_team_id": 1482625,
          "project": {
            "id": 802,
            "name": "Day 09",
            "slug": "piscine-ruby-on-rails-day-09",
            "parent_id": 791
          },
          "cursus_ids": [1],
          "marked_at": "2016-12-19T08:51:36.563Z",
          "marked": true,
          "retriable_at": "2016-12-19T08:51:36.542Z"
        },
        {
          "id": 445398,
          "occurrence": 0,
          "final_mark": 60,
          "status": "finished",
          "validated?": true,
          "current_team_id": 1482605,
          "project": {
            "id": 801,
            "name": "Day 08",
            "slug": "piscine-ruby-on-rails-day-08",
            "parent_id": 791
          },
          "cursus_ids": [1],
          "marked_at": "2016-12-18T10:28:33.716Z",
          "marked": true,
          "retriable_at": null
        },
        {
          "id": 445249,
          "occurrence": 0,
          "final_mark": 0,
          "status": "finished",
          "validated?": false,
          "current_team_id": 1482406,
          "project": {
            "id": 800,
            "name": "Day 07",
            "slug": "piscine-ruby-on-rails-day-07",
            "parent_id": 791
          },
          "cursus_ids": [1],
          "marked_at": "2016-12-19T08:51:44.969Z",
          "marked": true,
          "retriable_at": null
        },
        {
          "id": 444700,
          "occurrence": 0,
          "final_mark": 0,
          "status": "finished",
          "validated?": false,
          "current_team_id": 1481444,
          "project": {
            "id": 799,
            "name": "Day 06",
            "slug": "piscine-ruby-on-rails-day-06",
            "parent_id": 791
          },
          "cursus_ids": [1],
          "marked_at": "2017-09-02T13:22:49.622Z",
          "marked": true,
          "retriable_at": null
        },
        {
          "id": 444265,
          "occurrence": 0,
          "final_mark": 67,
          "status": "finished",
          "validated?": true,
          "current_team_id": 1481293,
          "project": {
            "id": 797,
            "name": "Rush00",
            "slug": "piscine-ruby-on-rails-rush00",
            "parent_id": 791
          },
          "cursus_ids": [1],
          "marked_at": "2016-12-12T11:14:22.358Z",
          "marked": true,
          "retriable_at": null
        },
        {
          "id": 444563,
          "occurrence": 0,
          "final_mark": 0,
          "status": "finished",
          "validated?": false,
          "current_team_id": 1481155,
          "project": {
            "id": 798,
            "name": "Day 05",
            "slug": "piscine-ruby-on-rails-day-05",
            "parent_id": 791
          },
          "cursus_ids": [1],
          "marked_at": "2017-01-23T15:45:59.963Z",
          "marked": true,
          "retriable_at": null
        },
        {
          "id": 444246,
          "occurrence": 0,
          "final_mark": 57,
          "status": "finished",
          "validated?": true,
          "current_team_id": 1480669,
          "project": {
            "id": 795,
            "name": "Day 03",
            "slug": "piscine-ruby-on-rails-day-03",
            "parent_id": 791
          },
          "cursus_ids": [1],
          "marked_at": "2017-09-02T13:21:15.772Z",
          "marked": true,
          "retriable_at": "2016-12-10T08:32:11.097Z"
        },
        {
          "id": 444017,
          "occurrence": 0,
          "final_mark": 52,
          "status": "finished",
          "validated?": true,
          "current_team_id": 1480110,
          "project": {
            "id": 796,
            "name": "Day 04",
            "slug": "piscine-ruby-on-rails-day-04",
            "parent_id": 791
          },
          "cursus_ids": [1],
          "marked_at": "2017-09-02T13:21:45.061Z",
          "marked": true,
          "retriable_at": null
        },
        {
          "id": 443840,
          "occurrence": 0,
          "final_mark": 79,
          "status": "finished",
          "validated?": true,
          "current_team_id": 1479803,
          "project": {
            "id": 793,
            "name": "Day 01",
            "slug": "piscine-ruby-on-rails-day-01",
            "parent_id": 791
          },
          "cursus_ids": [1],
          "marked_at": "2017-04-14T12:09:05.529Z",
          "marked": true,
          "retriable_at": "2016-12-08T09:31:57.882Z"
        },
        {
          "id": 443734,
          "occurrence": 0,
          "final_mark": 54,
          "status": "finished",
          "validated?": true,
          "current_team_id": 1479633,
          "project": {
            "id": 794,
            "name": "Day 02",
            "slug": "piscine-ruby-on-rails-day-02",
            "parent_id": 791
          },
          "cursus_ids": [1],
          "marked_at": "2017-09-02T13:20:48.671Z",
          "marked": true,
          "retriable_at": "2016-12-09T08:31:34.860Z"
        },
        {
          "id": 443507,
          "occurrence": 0,
          "final_mark": 100,
          "status": "finished",
          "validated?": true,
          "current_team_id": 1479238,
          "project": {
            "id": 792,
            "name": "Day 00",
            "slug": "piscine-ruby-on-rails-day-00",
            "parent_id": 791
          },
          "cursus_ids": [1],
          "marked_at": "2017-09-02T13:20:20.725Z",
          "marked": true,
          "retriable_at": "2016-12-07T11:54:49.168Z"
        },
        {
          "id": 441655,
          "occurrence": 0,
          "final_mark": 125,
          "status": "finished",
          "validated?": true,
          "current_team_id": 1476768,
          "project": {
            "id": 4,
            "name": "FdF",
            "slug": "fdf",
            "parent_id": null
          },
          "cursus_ids": [1],
          "marked_at": "2017-01-19T13:14:05.528Z",
          "marked": true,
          "retriable_at": "2017-01-23T13:14:03.928Z"
        },
        {
          "id": 441081,
          "occurrence": 0,
          "final_mark": 120,
          "status": "finished",
          "validated?": true,
          "current_team_id": 1475754,
          "project": {
            "id": 2,
            "name": "GET_Next_Line",
            "slug": "get_next_line",
            "parent_id": null
          },
          "cursus_ids": [1],
          "marked_at": "2016-11-23T13:53:08.519Z",
          "marked": true,
          "retriable_at": "2016-11-24T13:53:08.498Z"
        },
        {
          "id": 438787,
          "occurrence": 0,
          "final_mark": 100,
          "status": "finished",
          "validated?": true,
          "current_team_id": 1472240,
          "project": {
            "id": 540,
            "name": "Fillit",
            "slug": "fillit",
            "parent_id": null
          },
          "cursus_ids": [1],
          "marked_at": "2016-11-21T10:15:08.258Z",
          "marked": true,
          "retriable_at": "2016-11-23T10:15:08.142Z"
        },
        {
          "id": 433800,
          "occurrence": 0,
          "final_mark": 125,
          "status": "finished",
          "validated?": true,
          "current_team_id": 1465152,
          "project": {
            "id": 1,
            "name": "Libft",
            "slug": "libft",
            "parent_id": null
          },
          "cursus_ids": [1],
          "marked_at": "2017-11-11T12:20:50.167Z",
          "marked": true,
          "retriable_at": "2017-11-12T12:20:50.145Z"
        },
        {
          "id": 428286,
          "occurrence": 7,
          "final_mark": 100,
          "status": "finished",
          "validated?": true,
          "current_team_id": 1465141,
          "project": {
            "id": 756,
            "name": "Piscine Reloaded",
            "slug": "piscine-reloaded",
            "parent_id": null
          },
          "cursus_ids": [1],
          "marked_at": "2016-11-04T11:05:10.867Z",
          "marked": true,
          "retriable_at": "2016-11-04T11:05:10.842Z"
        },
        {
          "id": 428058,
          "occurrence": 0,
          "final_mark": 100,
          "status": "finished",
          "validated?": true,
          "current_team_id": 1458252,
          "project": {
            "id": 817,
            "name": "42 Commandements",
            "slug": "42-formation-pole-emploi-42-commandements",
            "parent_id": null
          },
          "cursus_ids": [1],
          "marked_at": "2016-11-02T09:34:42.896Z",
          "marked": true,
          "retriable_at": "2016-11-02T09:34:42.868Z"
        },
        {
          "id": 305685,
          "occurrence": 0,
          "final_mark": 100,
          "status": "finished",
          "validated?": true,
          "current_team_id": 1331518,
          "project": {
            "id": 170,
            "name": "Rush 02",
            "slug": "piscine-c-rush-02",
            "parent_id": null
          },
          "cursus_ids": [4],
          "marked_at": "2016-08-08T22:12:05.820Z",
          "marked": true,
          "retriable_at": "2016-07-28T13:03:50.789Z"
        },
        {
          "id": 305684,
          "occurrence": 0,
          "final_mark": 0,
          "status": "finished",
          "validated?": false,
          "current_team_id": 1327458,
          "project": {
            "id": 173,
            "name": "EvalExpr",
            "slug": "piscine-c-evalexpr",
            "parent_id": null
          },
          "cursus_ids": [4],
          "marked_at": "2016-07-25T21:51:31.751Z",
          "marked": true,
          "retriable_at": "2016-07-25T21:51:31.721Z"
        },
        {
          "id": 302832,
          "occurrence": 0,
          "final_mark": 0,
          "status": "finished",
          "validated?": false,
          "current_team_id": 1325029,
          "project": {
            "id": 174,
            "name": "BSQ",
            "slug": "bsq",
            "parent_id": null
          },
          "cursus_ids": [4],
          "marked_at": "2017-08-26T08:52:14.651Z",
          "marked": true,
          "retriable_at": "2016-07-28T11:30:57.306Z"
        },
        {
          "id": 302233,
          "occurrence": 0,
          "final_mark": 0,
          "status": "finished",
          "validated?": false,
          "current_team_id": 1324427,
          "project": {
            "id": 166,
            "name": "Day 13",
            "slug": "piscine-c-day-13",
            "parent_id": null
          },
          "cursus_ids": [4],
          "marked_at": "2016-07-23T22:08:20.470Z",
          "marked": true,
          "retriable_at": "2016-07-23T22:08:20.448Z"
        },
        {
          "id": 301506,
          "occurrence": 0,
          "final_mark": 25,
          "status": "finished",
          "validated?": true,
          "current_team_id": 1323691,
          "project": {
            "id": 165,
            "name": "Day 12",
            "slug": "piscine-c-day-12",
            "parent_id": null
          },
          "cursus_ids": [4],
          "marked_at": "2016-07-23T17:53:08.135Z",
          "marked": true,
          "retriable_at": "2016-07-22T12:13:34.491Z"
        },
        {
          "id": 300265,
          "occurrence": 0,
          "final_mark": 5,
          "status": "finished",
          "validated?": false,
          "current_team_id": 1322428,
          "project": {
            "id": 164,
            "name": "Day 11",
            "slug": "piscine-c-day-11",
            "parent_id": null
          },
          "cursus_ids": [4],
          "marked_at": "2016-07-23T18:02:57.536Z",
          "marked": true,
          "retriable_at": "2016-07-21T09:06:03.906Z"
        },
        {
          "id": 300264,
          "occurrence": 0,
          "final_mark": 25,
          "status": "finished",
          "validated?": true,
          "current_team_id": 1322427,
          "project": {
            "id": 163,
            "name": "Day 10",
            "slug": "piscine-c-day-10",
            "parent_id": null
          },
          "cursus_ids": [4],
          "marked_at": "2017-07-19T12:14:42.803Z",
          "marked": true,
          "retriable_at": "2016-07-20T07:33:55.004Z"
        },
        {
          "id": 280586,
          "occurrence": 0,
          "final_mark": 0,
          "status": "finished",
          "validated?": false,
          "current_team_id": 1321552,
          "project": {
            "id": 169,
            "name": "Rush 01",
            "slug": "piscine-c-rush-01",
            "parent_id": null
          },
          "cursus_ids": [4],
          "marked_at": "2016-08-08T22:11:01.108Z",
          "marked": true,
          "retriable_at": "2016-07-19T11:28:14.003Z"
        },
        {
          "id": 280348,
          "occurrence": 0,
          "final_mark": 0,
          "status": "finished",
          "validated?": false,
          "current_team_id": 1302466,
          "project": {
            "id": 172,
            "name": "Match-N-Match",
            "slug": "piscine-c-match-n-match",
            "parent_id": null
          },
          "cursus_ids": [4],
          "marked_at": "2017-08-14T07:41:32.464Z",
          "marked": true,
          "retriable_at": "2016-07-20T16:21:09.214Z"
        },
        {
          "id": 270808,
          "occurrence": 0,
          "final_mark": 0,
          "status": "finished",
          "validated?": false,
          "current_team_id": 1292967,
          "project": {
            "id": 162,
            "name": "Day 08",
            "slug": "piscine-c-day-08",
            "parent_id": null
          },
          "cursus_ids": [4],
          "marked_at": "2016-07-17T08:58:20.205Z",
          "marked": true,
          "retriable_at": "2016-07-17T08:58:20.183Z"
        },
        {
          "id": 269669,
          "occurrence": 0,
          "final_mark": 16,
          "status": "finished",
          "validated?": false,
          "current_team_id": 1291599,
          "project": {
            "id": 161,
            "name": "Day 07",
            "slug": "piscine-c-day-07",
            "parent_id": null
          },
          "cursus_ids": [4],
          "marked_at": "2016-07-15T21:45:38.366Z",
          "marked": true,
          "retriable_at": "2016-07-15T21:45:38.355Z"
        },
        {
          "id": 269341,
          "occurrence": 0,
          "final_mark": 70,
          "status": "finished",
          "validated?": true,
          "current_team_id": 1291266,
          "project": {
            "id": 160,
            "name": "Day 06",
            "slug": "piscine-c-day-06",
            "parent_id": null
          },
          "cursus_ids": [4],
          "marked_at": "2016-07-14T10:30:47.314Z",
          "marked": true,
          "retriable_at": "2016-07-14T10:30:47.290Z"
        },
        {
          "id": 267718,
          "occurrence": 0,
          "final_mark": 100,
          "status": "finished",
          "validated?": true,
          "current_team_id": 1290709,
          "project": {
            "id": 168,
            "name": "Rush 00",
            "slug": "piscine-c-rush-00",
            "parent_id": null
          },
          "cursus_ids": [4],
          "marked_at": "2017-09-16T11:52:20.454Z",
          "marked": true,
          "retriable_at": "2016-07-13T14:39:17.628Z"
        },
        {
          "id": 268069,
          "occurrence": 0,
          "final_mark": 20,
          "status": "finished",
          "validated?": false,
          "current_team_id": 1289816,
          "project": {
            "id": 159,
            "name": "Day 05",
            "slug": "piscine-c-day-05",
            "parent_id": null
          },
          "cursus_ids": [4],
          "marked_at": "2016-07-23T03:10:40.577Z",
          "marked": true,
          "retriable_at": "2016-07-13T12:15:30.702Z"
        },
        {
          "id": 267717,
          "occurrence": 0,
          "final_mark": 0,
          "status": "finished",
          "validated?": false,
          "current_team_id": 1289561,
          "project": {
            "id": 171,
            "name": "Sastantua",
            "slug": "piscine-c-sastantua",
            "parent_id": null
          },
          "cursus_ids": [4],
          "marked_at": "2017-09-08T14:55:07.132Z",
          "marked": true,
          "retriable_at": "2016-07-15T20:15:17.665Z"
        },
        {
          "id": 264171,
          "occurrence": 0,
          "final_mark": 20,
          "status": "finished",
          "validated?": false,
          "current_team_id": 1286582,
          "project": {
            "id": 158,
            "name": "Day 04",
            "slug": "piscine-c-day-04",
            "parent_id": null
          },
          "cursus_ids": [4],
          "marked_at": "2016-08-06T10:07:36.923Z",
          "marked": true,
          "retriable_at": "2016-07-10T16:20:58.775Z"
        },
        {
          "id": 262516,
          "occurrence": 0,
          "final_mark": 65,
          "status": "finished",
          "validated?": true,
          "current_team_id": 1284884,
          "project": {
            "id": 157,
            "name": "Day 03",
            "slug": "piscine-c-day-03",
            "parent_id": null
          },
          "cursus_ids": [4],
          "marked_at": "2017-09-08T17:01:47.326Z",
          "marked": true,
          "retriable_at": "2016-07-10T16:01:36.514Z"
        },
        {
          "id": 262515,
          "occurrence": 0,
          "final_mark": 43,
          "status": "finished",
          "validated?": true,
          "current_team_id": 1284883,
          "project": {
            "id": 156,
            "name": "Day 02",
            "slug": "piscine-c-day-02",
            "parent_id": null
          },
          "cursus_ids": [4],
          "marked_at": "2016-07-23T02:18:25.281Z",
          "marked": true,
          "retriable_at": "2016-07-08T12:05:48.874Z"
        },
        {
          "id": 262513,
          "occurrence": 0,
          "final_mark": 85,
          "status": "finished",
          "validated?": true,
          "current_team_id": 1284881,
          "project": {
            "id": 155,
            "name": "Day 01",
            "slug": "piscine-c-day-01",
            "parent_id": null
          },
          "cursus_ids": [4],
          "marked_at": "2016-07-23T02:01:40.041Z",
          "marked": true,
          "retriable_at": "2016-07-07T15:16:58.180Z"
        },
        {
          "id": 260667,
          "occurrence": 0,
          "final_mark": 50,
          "status": "finished",
          "validated?": true,
          "current_team_id": 1283022,
          "project": {
            "id": 154,
            "name": "Day 00",
            "slug": "piscine-c-day-00",
            "parent_id": null
          },
          "cursus_ids": [4],
          "marked_at": "2016-07-23T01:43:53.891Z",
          "marked": true,
          "retriable_at": "2016-07-06T15:43:45.128Z"
        },
        {
          "id": 285242,
          "occurrence": 0,
          "final_mark": 0,
          "status": "finished",
          "validated?": true,
          "current_team_id": 1307201,
          "project": {
            "id": 203,
            "name": "19",
            "slug": "piscine-c-day-09-19",
            "parent_id": 167
          },
          "cursus_ids": [4],
          "marked_at": "2017-09-01T17:52:54.763Z",
          "marked": true,
          "retriable_at": "2017-09-01T17:52:54.731Z"
        },
        {
          "id": 285237,
          "occurrence": 0,
          "final_mark": 0,
          "status": "finished",
          "validated?": true,
          "current_team_id": 1307196,
          "project": {
            "id": 202,
            "name": "18",
            "slug": "piscine-c-day-09-18",
            "parent_id": 167
          },
          "cursus_ids": [4],
          "marked_at": "2017-09-01T17:52:56.112Z",
          "marked": true,
          "retriable_at": "2017-09-01T17:52:56.082Z"
        },
        {
          "id": 303695,
          "occurrence": 0,
          "final_mark": 94,
          "status": "finished",
          "validated?": true,
          "current_team_id": 1325689,
          "project": {
            "id": 406,
            "name": "Exam02",
            "slug": "piscine-c-exam02",
            "parent_id": null
          },
          "cursus_ids": [4],
          "marked_at": "2016-07-19T17:56:18.000Z",
          "marked": true,
          "retriable_at": "2017-06-26T21:47:08.881Z"
        },
        {
          "id": 311027,
          "occurrence": 0,
          "final_mark": 75,
          "status": "finished",
          "validated?": true,
          "current_team_id": 1332698,
          "project": {
            "id": 407,
            "name": "Exam Final",
            "slug": "piscine-c-exam-final",
            "parent_id": null
          },
          "cursus_ids": [4],
          "marked_at": "2016-07-26T08:05:04.000Z",
          "marked": true,
          "retriable_at": "2017-06-26T21:48:14.023Z"
        },
        {
          "id": 440462,
          "occurrence": 5,
          "final_mark": 79,
          "status": "finished",
          "validated?": true,
          "current_team_id": 1483734,
          "project": {
            "id": 11,
            "name": "C Exam Alone In The Dark - Beginner",
            "slug": "c-exam-alone-in-the-dark-beginner",
            "parent_id": null
          },
          "cursus_ids": [1],
          "marked_at": "2016-12-27T10:16:57.072Z",
          "marked": true,
          "retriable_at": "2016-12-27T10:16:31.371Z"
        },
        {
          "id": 443482,
          "occurrence": 0,
          "final_mark": 69,
          "status": "finished",
          "validated?": true,
          "current_team_id": 1479204,
          "project": {
            "id": 791,
            "name": "Piscine Ruby on Rails",
            "slug": "piscine-ruby-on-rails",
            "parent_id": null
          },
          "cursus_ids": [1],
          "marked_at": "2018-04-24T12:17:53.367Z",
          "marked": true,
          "retriable_at": "2018-04-24T12:17:53.320Z"
        },
        {
          "id": 647129,
          "occurrence": 0,
          "final_mark": 100,
          "status": "finished",
          "validated?": true,
          "current_team_id": 1728636,
          "project": {
            "id": 48,
            "name": "Piscine PHP",
            "slug": "piscine-php",
            "parent_id": null
          },
          "cursus_ids": [1],
          "marked_at": "2017-10-30T09:57:31.242Z",
          "marked": true,
          "retriable_at": "2017-10-30T09:57:31.209Z"
        },
        {
          "id": 534508,
          "occurrence": 0,
          "final_mark": 123,
          "status": "finished",
          "validated?": true,
          "current_team_id": 1593193,
          "project": {
            "id": 118,
            "name": "First Internship",
            "slug": "first-internship",
            "parent_id": null
          },
          "cursus_ids": [1],
          "marked_at": "2018-04-17T08:39:55.877Z",
          "marked": true,
          "retriable_at": "2018-04-17T08:39:55.837Z"
        },
        {
          "id": 825428,
          "occurrence": 0,
          "final_mark": 125,
          "status": "finished",
          "validated?": true,
          "current_team_id": 1940692,
          "project": {
            "id": 209,
            "name": "Duration",
            "slug": "final-internship-duration",
            "parent_id": 212
          },
          "cursus_ids": [1],
          "marked_at": "2018-03-23T14:10:08.490Z",
          "marked": true,
          "retriable_at": null
        },
        {
          "id": 825427,
          "occurrence": 0,
          "final_mark": 100,
          "status": "finished",
          "validated?": true,
          "current_team_id": 1940691,
          "project": {
            "id": 208,
            "name": "Contract Upload",
            "slug": "final-internship-contract-upload",
            "parent_id": 212
          },
          "cursus_ids": [1],
          "marked_at": "2018-03-23T14:10:08.050Z",
          "marked": true,
          "retriable_at": "2018-03-23T14:10:08.026Z"
        },
        {
          "id": 825429,
          "occurrence": 0,
          "final_mark": 118,
          "status": "finished",
          "validated?": true,
          "current_team_id": 1940693,
          "project": {
            "id": 827,
            "name": "Company mid evaluation",
            "slug": "final-internship-company-mid-evaluation",
            "parent_id": 212
          },
          "cursus_ids": [1],
          "marked_at": "2018-05-28T11:53:57.910Z",
          "marked": true,
          "retriable_at": null
        },
        {
          "id": 791493,
          "occurrence": 0,
          "final_mark": 125,
          "status": "finished",
          "validated?": true,
          "current_team_id": 1899477,
          "project": {
            "id": 212,
            "name": "Final Internship",
            "slug": "final-internship",
            "parent_id": null
          },
          "cursus_ids": [1],
          "marked_at": "2018-08-28T13:21:43.234Z",
          "marked": true,
          "retriable_at": "2018-08-28T13:21:46.074Z"
        },
        {
          "id": 825430,
          "occurrence": 0,
          "final_mark": 118,
          "status": "finished",
          "validated?": true,
          "current_team_id": 1940694,
          "project": {
            "id": 210,
            "name": "Company final evaluation",
            "slug": "final-internship-company-final-evaluation",
            "parent_id": 212
          },
          "cursus_ids": [1],
          "marked_at": "2018-08-24T11:33:09.862Z",
          "marked": true,
          "retriable_at": null
        },
        {
          "id": 265317,
          "occurrence": 0,
          "final_mark": 65,
          "status": "finished",
          "validated?": true,
          "current_team_id": 1287775,
          "project": {
            "id": 404,
            "name": "Exam00",
            "slug": "piscine-c-exam00",
            "parent_id": null
          },
          "cursus_ids": [4],
          "marked_at": "2016-07-08T16:49:32.159Z",
          "marked": true,
          "retriable_at": "2016-07-08T16:45:08.743Z"
        },
        {
          "id": 274412,
          "occurrence": 0,
          "final_mark": 0,
          "status": "finished",
          "validated?": true,
          "current_team_id": 1296663,
          "project": {
            "id": 192,
            "name": "08",
            "slug": "piscine-c-day-09-08",
            "parent_id": 167
          },
          "cursus_ids": [4],
          "marked_at": "2017-09-01T17:52:58.680Z",
          "marked": true,
          "retriable_at": "2017-09-01T17:52:58.641Z"
        },
        {
          "id": 274454,
          "occurrence": 0,
          "final_mark": 0,
          "status": "finished",
          "validated?": true,
          "current_team_id": 1296705,
          "project": {
            "id": 197,
            "name": "13",
            "slug": "piscine-c-day-09-13",
            "parent_id": 167
          },
          "cursus_ids": [4],
          "marked_at": "2017-09-01T17:52:57.205Z",
          "marked": true,
          "retriable_at": "2017-09-01T17:52:57.165Z"
        },
        {
          "id": 274444,
          "occurrence": 0,
          "final_mark": 0,
          "status": "finished",
          "validated?": true,
          "current_team_id": 1296695,
          "project": {
            "id": 195,
            "name": "11",
            "slug": "piscine-c-day-09-11",
            "parent_id": 167
          },
          "cursus_ids": [4],
          "marked_at": "2017-09-01T17:52:57.881Z",
          "marked": true,
          "retriable_at": "2017-09-01T17:52:57.850Z"
        },
        {
          "id": 274392,
          "occurrence": 0,
          "final_mark": 0,
          "status": "finished",
          "validated?": true,
          "current_team_id": 1296643,
          "project": {
            "id": 186,
            "name": "02",
            "slug": "piscine-c-day-09-02",
            "parent_id": 167
          },
          "cursus_ids": [4],
          "marked_at": "2017-09-01T17:53:00.383Z",
          "marked": true,
          "retriable_at": "2017-09-01T17:53:00.352Z"
        },
        {
          "id": 274413,
          "occurrence": 0,
          "final_mark": 0,
          "status": "finished",
          "validated?": true,
          "current_team_id": 1296664,
          "project": {
            "id": 193,
            "name": "09",
            "slug": "piscine-c-day-09-09",
            "parent_id": 167
          },
          "cursus_ids": [4],
          "marked_at": "2017-09-01T17:52:58.485Z",
          "marked": true,
          "retriable_at": "2017-09-01T17:52:58.440Z"
        },
        {
          "id": 274386,
          "occurrence": 0,
          "final_mark": 0,
          "status": "finished",
          "validated?": true,
          "current_team_id": 1296637,
          "project": {
            "id": 175,
            "name": "00",
            "slug": "piscine-c-day-09-00",
            "parent_id": 167
          },
          "cursus_ids": [4],
          "marked_at": "2017-09-01T17:53:00.782Z",
          "marked": true,
          "retriable_at": "2017-09-01T17:53:00.761Z"
        },
        {
          "id": 274462,
          "occurrence": 0,
          "final_mark": 0,
          "status": "finished",
          "validated?": true,
          "current_team_id": 1296713,
          "project": {
            "id": 198,
            "name": "14",
            "slug": "piscine-c-day-09-14",
            "parent_id": 167
          },
          "cursus_ids": [4],
          "marked_at": "2017-09-01T17:52:56.948Z",
          "marked": true,
          "retriable_at": "2017-09-01T17:52:56.905Z"
        },
        {
          "id": 274389,
          "occurrence": 0,
          "final_mark": 0,
          "status": "finished",
          "validated?": true,
          "current_team_id": 1296640,
          "project": {
            "id": 185,
            "name": "01",
            "slug": "piscine-c-day-09-01",
            "parent_id": 167
          },
          "cursus_ids": [4],
          "marked_at": "2017-09-01T17:53:00.588Z",
          "marked": true,
          "retriable_at": "2017-09-01T17:53:00.552Z"
        },
        {
          "id": 274394,
          "occurrence": 0,
          "final_mark": 0,
          "status": "finished",
          "validated?": true,
          "current_team_id": 1296645,
          "project": {
            "id": 187,
            "name": "03",
            "slug": "piscine-c-day-09-03",
            "parent_id": 167
          },
          "cursus_ids": [4],
          "marked_at": "2017-09-01T17:53:00.167Z",
          "marked": true,
          "retriable_at": "2017-09-01T17:53:00.126Z"
        },
        {
          "id": 274450,
          "occurrence": 0,
          "final_mark": 0,
          "status": "finished",
          "validated?": true,
          "current_team_id": 1296701,
          "project": {
            "id": 196,
            "name": "12",
            "slug": "piscine-c-day-09-12",
            "parent_id": 167
          },
          "cursus_ids": [4],
          "marked_at": "2017-09-01T17:52:57.553Z",
          "marked": true,
          "retriable_at": "2017-09-01T17:52:57.514Z"
        },
        {
          "id": 274467,
          "occurrence": 0,
          "final_mark": 0,
          "status": "finished",
          "validated?": true,
          "current_team_id": 1296718,
          "project": {
            "id": 199,
            "name": "15",
            "slug": "piscine-c-day-09-15",
            "parent_id": 167
          },
          "cursus_ids": [4],
          "marked_at": "2017-09-01T17:52:56.634Z",
          "marked": true,
          "retriable_at": "2017-09-01T17:52:56.585Z"
        },
        {
          "id": 274400,
          "occurrence": 0,
          "final_mark": 0,
          "status": "finished",
          "validated?": true,
          "current_team_id": 1296651,
          "project": {
            "id": 189,
            "name": "05",
            "slug": "piscine-c-day-09-05",
            "parent_id": 167
          },
          "cursus_ids": [4],
          "marked_at": "2017-09-01T17:52:59.604Z",
          "marked": true,
          "retriable_at": "2017-09-01T17:52:59.556Z"
        },
        {
          "id": 274407,
          "occurrence": 0,
          "final_mark": 0,
          "status": "finished",
          "validated?": true,
          "current_team_id": 1296658,
          "project": {
            "id": 190,
            "name": "06",
            "slug": "piscine-c-day-09-06",
            "parent_id": 167
          },
          "cursus_ids": [4],
          "marked_at": "2017-09-01T17:52:59.346Z",
          "marked": true,
          "retriable_at": "2017-09-01T17:52:59.315Z"
        },
        {
          "id": 274396,
          "occurrence": 0,
          "final_mark": 0,
          "status": "finished",
          "validated?": true,
          "current_team_id": 1296647,
          "project": {
            "id": 188,
            "name": "04",
            "slug": "piscine-c-day-09-04",
            "parent_id": 167
          },
          "cursus_ids": [4],
          "marked_at": "2017-09-01T17:52:59.838Z",
          "marked": true,
          "retriable_at": "2017-09-01T17:52:59.801Z"
        },
        {
          "id": 274492,
          "occurrence": 0,
          "final_mark": 0,
          "status": "finished",
          "validated?": true,
          "current_team_id": 1296743,
          "project": {
            "id": 200,
            "name": "16",
            "slug": "piscine-c-day-09-16",
            "parent_id": 167
          },
          "cursus_ids": [4],
          "marked_at": "2017-09-01T17:52:56.375Z",
          "marked": true,
          "retriable_at": "2017-09-01T17:52:56.351Z"
        },
        {
          "id": 274438,
          "occurrence": 0,
          "final_mark": 0,
          "status": "finished",
          "validated?": true,
          "current_team_id": 1296689,
          "project": {
            "id": 194,
            "name": "10",
            "slug": "piscine-c-day-09-10",
            "parent_id": 167
          },
          "cursus_ids": [4],
          "marked_at": "2017-09-01T17:52:58.231Z",
          "marked": true,
          "retriable_at": "2017-09-01T17:52:58.204Z"
        },
        {
          "id": 274409,
          "occurrence": 0,
          "final_mark": 0,
          "status": "finished",
          "validated?": true,
          "current_team_id": 1296660,
          "project": {
            "id": 191,
            "name": "07",
            "slug": "piscine-c-day-09-07",
            "parent_id": 167
          },
          "cursus_ids": [4],
          "marked_at": "2017-09-01T17:52:58.995Z",
          "marked": true,
          "retriable_at": "2017-09-01T17:52:58.961Z"
        },
        {
          "id": 280347,
          "occurrence": 0,
          "final_mark": 88,
          "status": "finished",
          "validated?": true,
          "current_team_id": 1302465,
          "project": {
            "id": 405,
            "name": "Exam01",
            "slug": "piscine-c-exam01",
            "parent_id": null
          },
          "cursus_ids": [4],
          "marked_at": "2016-07-13T06:27:42.000Z",
          "marked": true,
          "retriable_at": "2017-06-26T21:47:33.246Z"
        },
        {
          "id": 285243,
          "occurrence": 0,
          "final_mark": 0,
          "status": "finished",
          "validated?": true,
          "current_team_id": 1307202,
          "project": {
            "id": 201,
            "name": "17",
            "slug": "piscine-c-day-09-17",
            "parent_id": 167
          },
          "cursus_ids": [4],
          "marked_at": "2017-09-01T17:52:54.464Z",
          "marked": true,
          "retriable_at": "2017-09-01T17:52:54.425Z"
        },
        {
          "id": 285238,
          "occurrence": 0,
          "final_mark": 0,
          "status": "finished",
          "validated?": true,
          "current_team_id": 1307197,
          "project": {
            "id": 204,
            "name": "20",
            "slug": "piscine-c-day-09-20",
            "parent_id": 167
          },
          "cursus_ids": [4],
          "marked_at": "2017-09-01T17:52:55.852Z",
          "marked": true,
          "retriable_at": "2017-09-01T17:52:55.827Z"
        },
        {
          "id": 285239,
          "occurrence": 0,
          "final_mark": 0,
          "status": "finished",
          "validated?": true,
          "current_team_id": 1307198,
          "project": {
            "id": 207,
            "name": "23",
            "slug": "piscine-c-day-09-23",
            "parent_id": 167
          },
          "cursus_ids": [4],
          "marked_at": "2017-09-01T17:52:55.665Z",
          "marked": true,
          "retriable_at": "2017-09-01T17:52:55.617Z"
        },
        {
          "id": 272717,
          "occurrence": 0,
          "final_mark": 12,
          "status": "finished",
          "validated?": false,
          "current_team_id": 1294940,
          "project": {
            "id": 167,
            "name": "Day 09",
            "slug": "piscine-c-day-09",
            "parent_id": null
          },
          "cursus_ids": [4],
          "marked_at": "2016-07-16T16:11:17.915Z",
          "marked": true,
          "retriable_at": "2016-07-16T16:11:17.892Z"
        },
        {
          "id": 285241,
          "occurrence": 0,
          "final_mark": 0,
          "status": "finished",
          "validated?": true,
          "current_team_id": 1307200,
          "project": {
            "id": 205,
            "name": "21",
            "slug": "piscine-c-day-09-21",
            "parent_id": 167
          },
          "cursus_ids": [4],
          "marked_at": "2017-09-01T17:52:55.020Z",
          "marked": true,
          "retriable_at": "2017-09-01T17:52:54.999Z"
        },
        {
          "id": 285240,
          "occurrence": 0,
          "final_mark": 0,
          "status": "finished",
          "validated?": true,
          "current_team_id": 1307199,
          "project": {
            "id": 206,
            "name": "22",
            "slug": "piscine-c-day-09-22",
            "parent_id": 167
          },
          "cursus_ids": [4],
          "marked_at": "2017-09-01T17:52:55.260Z",
          "marked": true,
          "retriable_at": "2017-09-01T17:52:55.221Z"
        },
        {
          "id": 1681541,
          "occurrence": 0,
          "final_mark": 69,
          "status": "finished",
          "validated?": true,
          "current_team_id": 2954768,
          "project": {
            "id": 1482,
            "name": "Piscine Ruby on Rails",
            "slug": "42cursus-piscine-ruby-on-rails",
            "parent_id": null
          },
          "cursus_ids": [21],
          "marked_at": "2018-04-24T12:17:53.000Z",
          "marked": true,
          "retriable_at": "2019-12-19T23:00:00.000Z"
        },
        {
          "id": 1681528,
          "occurrence": 0,
          "final_mark": 125,
          "status": "finished",
          "validated?": true,
          "current_team_id": 2954755,
          "project": {
            "id": 1402,
            "name": "hypertube",
            "slug": "42cursus-hypertube",
            "parent_id": null
          },
          "cursus_ids": [21],
          "marked_at": "2017-11-11T13:00:09.000Z",
          "marked": true,
          "retriable_at": "2019-12-19T23:00:00.000Z"
        },
        {
          "id": 1681540,
          "occurrence": 0,
          "final_mark": 125,
          "status": "finished",
          "validated?": true,
          "current_team_id": 2954766,
          "project": {
            "id": 1418,
            "name": "dr-quine",
            "slug": "42cursus-dr-quine",
            "parent_id": null
          },
          "cursus_ids": [21],
          "marked_at": "2017-09-25T09:06:43.000Z",
          "marked": true,
          "retriable_at": "2019-12-19T23:00:00.000Z"
        },
        {
          "id": 1681553,
          "occurrence": 0,
          "final_mark": 125,
          "status": "finished",
          "validated?": true,
          "current_team_id": 2954780,
          "project": {
            "id": 1646,
            "name": "Internship II - Duration",
            "slug": "internship-ii-internship-ii-duration",
            "parent_id": 1644
          },
          "cursus_ids": [21],
          "marked_at": "2018-03-23T14:10:08.000Z",
          "marked": true,
          "retriable_at": "2019-12-19T23:00:00.000Z"
        },
        {
          "id": 1681570,
          "occurrence": 0,
          "final_mark": 103,
          "status": "finished",
          "validated?": true,
          "current_team_id": 2954797,
          "project": {
            "id": 1641,
            "name": "internship I - Company Mid Evaluation",
            "slug": "internship-i-internship-i-company-mid-evaluation",
            "parent_id": 1638
          },
          "cursus_ids": [21],
          "marked_at": "2017-10-30T17:30:25.000Z",
          "marked": true,
          "retriable_at": "2019-12-19T23:00:00.000Z"
        },
        {
          "id": 1681571,
          "occurrence": 0,
          "final_mark": 118,
          "status": "finished",
          "validated?": true,
          "current_team_id": 2954798,
          "project": {
            "id": 1647,
            "name": "Internship II - Company Mid Evaluation",
            "slug": "internship-ii-internship-ii-company-mid-evaluation",
            "parent_id": 1644
          },
          "cursus_ids": [21],
          "marked_at": "2018-05-28T11:53:57.000Z",
          "marked": true,
          "retriable_at": "2019-12-19T23:00:00.000Z"
        },
        {
          "id": 1681555,
          "occurrence": 0,
          "final_mark": 100,
          "status": "finished",
          "validated?": true,
          "current_team_id": 2954782,
          "project": {
            "id": 1608,
            "name": "Day 00",
            "slug": "42cursus-piscine-ruby-on-rails-day-00",
            "parent_id": 1482
          },
          "cursus_ids": [21],
          "marked_at": "2017-09-02T13:20:20.000Z",
          "marked": true,
          "retriable_at": "2019-12-19T23:00:00.000Z"
        },
        {
          "id": 1681535,
          "occurrence": 0,
          "final_mark": 123,
          "status": "finished",
          "validated?": true,
          "current_team_id": 2954762,
          "project": {
            "id": 1638,
            "name": "Internship I",
            "slug": "internship-i",
            "parent_id": null
          },
          "cursus_ids": [21],
          "marked_at": "2018-04-17T08:39:55.000Z",
          "marked": true,
          "retriable_at": "2019-12-19T23:00:00.000Z"
        },
        {
          "id": 1681534,
          "occurrence": 0,
          "final_mark": 118,
          "status": "finished",
          "validated?": true,
          "current_team_id": 2954760,
          "project": {
            "id": 1401,
            "name": "matcha",
            "slug": "42cursus-matcha",
            "parent_id": null
          },
          "cursus_ids": [21],
          "marked_at": "2017-10-21T13:54:23.000Z",
          "marked": true,
          "retriable_at": "2019-12-19T23:00:00.000Z"
        },
        {
          "id": 1681551,
          "occurrence": 0,
          "final_mark": 100,
          "status": "finished",
          "validated?": true,
          "current_team_id": 2954777,
          "project": {
            "id": 1649,
            "name": "Internship II - Peer Video",
            "slug": "internship-ii-internship-ii-peer-video",
            "parent_id": 1644
          },
          "cursus_ids": [21],
          "marked_at": "2018-08-28T13:21:42.000Z",
          "marked": true,
          "retriable_at": "2019-12-19T23:00:00.000Z"
        },
        {
          "id": 1681552,
          "occurrence": 0,
          "final_mark": 118,
          "status": "finished",
          "validated?": true,
          "current_team_id": 2954778,
          "project": {
            "id": 1648,
            "name": "Internship II - Company Final Evaluation",
            "slug": "internship-ii-internship-ii-company-final-evaluation",
            "parent_id": 1644
          },
          "cursus_ids": [21],
          "marked_at": "2018-08-24T11:33:09.000Z",
          "marked": true,
          "retriable_at": "2019-12-19T23:00:00.000Z"
        },
        {
          "id": 1170756,
          "occurrence": 0,
          "final_mark": 0,
          "status": "finished",
          "validated?": false,
          "current_team_id": 2335272,
          "project": {
            "id": 1190,
            "name": "roger-skyline-1",
            "slug": "roger-skyline-1",
            "parent_id": null
          },
          "cursus_ids": [1],
          "marked_at": "2019-12-21T20:20:59.448Z",
          "marked": true,
          "retriable_at": "2019-12-24T20:20:59.475Z"
        },
        {
          "id": 1681531,
          "occurrence": 0,
          "final_mark": 125,
          "status": "finished",
          "validated?": true,
          "current_team_id": 2954757,
          "project": {
            "id": 1644,
            "name": "Internship II",
            "slug": "internship-ii",
            "parent_id": null
          },
          "cursus_ids": [21],
          "marked_at": "2018-08-28T13:21:43.000Z",
          "marked": true,
          "retriable_at": "2019-12-19T23:00:00.000Z"
        },
        {
          "id": 1681530,
          "occurrence": 0,
          "final_mark": 125,
          "status": "finished",
          "validated?": true,
          "current_team_id": 2954756,
          "project": {
            "id": 1405,
            "name": "darkly",
            "slug": "42cursus-darkly",
            "parent_id": null
          },
          "cursus_ids": [21],
          "marked_at": "2017-11-28T18:03:50.000Z",
          "marked": true,
          "retriable_at": "2019-12-19T23:00:00.000Z"
        },
        {
          "id": 1681543,
          "occurrence": 0,
          "final_mark": 100,
          "status": "finished",
          "validated?": true,
          "current_team_id": 2954770,
          "project": {
            "id": 1645,
            "name": "internship II - Contract Upload",
            "slug": "internship-ii-internship-ii-contract-upload",
            "parent_id": 1644
          },
          "cursus_ids": [21],
          "marked_at": "2018-03-23T14:10:08.000Z",
          "marked": true,
          "retriable_at": "2019-12-19T23:00:00.000Z"
        },
        {
          "id": 1681545,
          "occurrence": 0,
          "final_mark": 125,
          "status": "finished",
          "validated?": true,
          "current_team_id": 2954771,
          "project": {
            "id": 1639,
            "name": "Internship I - Duration",
            "slug": "internship-i-internship-i-duration",
            "parent_id": 1638
          },
          "cursus_ids": [21],
          "marked_at": "2017-07-13T15:24:05.000Z",
          "marked": true,
          "retriable_at": "2019-12-19T23:00:00.000Z"
        },
        {
          "id": 1681546,
          "occurrence": 0,
          "final_mark": 100,
          "status": "finished",
          "validated?": true,
          "current_team_id": 2954773,
          "project": {
            "id": 1640,
            "name": "internship I - Contract Upload",
            "slug": "internship-i-internship-i-contract-upload",
            "parent_id": 1638
          },
          "cursus_ids": [21],
          "marked_at": "2017-07-13T15:24:06.000Z",
          "marked": true,
          "retriable_at": "2019-12-19T23:00:00.000Z"
        },
        {
          "id": 1681548,
          "occurrence": 0,
          "final_mark": 111,
          "status": "finished",
          "validated?": true,
          "current_team_id": 2954774,
          "project": {
            "id": 1642,
            "name": "internship I - Company Final Evaluation",
            "slug": "internship-i-internship-i-company-final-evaluation",
            "parent_id": 1638
          },
          "cursus_ids": [21],
          "marked_at": "2018-04-17T08:39:55.000Z",
          "marked": true,
          "retriable_at": "2019-12-19T23:00:00.000Z"
        },
        {
          "id": 1681549,
          "occurrence": 0,
          "final_mark": 100,
          "status": "finished",
          "validated?": true,
          "current_team_id": 2954775,
          "project": {
            "id": 1643,
            "name": "Internship I - Peer Video",
            "slug": "internship-i-internship-i-peer-video",
            "parent_id": 1638
          },
          "cursus_ids": [21],
          "marked_at": "2018-01-10T11:55:46.000Z",
          "marked": true,
          "retriable_at": "2019-12-19T23:00:00.000Z"
        },
        {
          "id": 1681558,
          "occurrence": 0,
          "final_mark": 54,
          "status": "finished",
          "validated?": true,
          "current_team_id": 2954784,
          "project": {
            "id": 1610,
            "name": "Day 02",
            "slug": "42cursus-piscine-ruby-on-rails-day-02",
            "parent_id": 1482
          },
          "cursus_ids": [21],
          "marked_at": "2017-09-02T13:20:48.000Z",
          "marked": true,
          "retriable_at": "2019-12-19T23:00:00.000Z"
        },
        {
          "id": 1681559,
          "occurrence": 0,
          "final_mark": 57,
          "status": "finished",
          "validated?": true,
          "current_team_id": 2954786,
          "project": {
            "id": 1611,
            "name": "Day 03",
            "slug": "42cursus-piscine-ruby-on-rails-day-03",
            "parent_id": 1482
          },
          "cursus_ids": [21],
          "marked_at": "2017-09-02T13:21:15.000Z",
          "marked": true,
          "retriable_at": "2019-12-19T23:00:00.000Z"
        },
        {
          "id": 1681560,
          "occurrence": 0,
          "final_mark": 52,
          "status": "finished",
          "validated?": true,
          "current_team_id": 2954787,
          "project": {
            "id": 1612,
            "name": "Day 04",
            "slug": "42cursus-piscine-ruby-on-rails-day-04",
            "parent_id": 1482
          },
          "cursus_ids": [21],
          "marked_at": "2017-09-02T13:21:45.000Z",
          "marked": true,
          "retriable_at": "2019-12-19T23:00:00.000Z"
        },
        {
          "id": 1681562,
          "occurrence": 0,
          "final_mark": 67,
          "status": "finished",
          "validated?": false,
          "current_team_id": 2954788,
          "project": {
            "id": 1618,
            "name": "Rush 00",
            "slug": "piscine-ruby-on-rails-rush-00",
            "parent_id": 791
          },
          "cursus_ids": [21],
          "marked_at": "2016-12-12T11:14:22.000Z",
          "marked": true,
          "retriable_at": "2019-12-19T23:00:00.000Z"
        },
        {
          "id": 1681563,
          "occurrence": 0,
          "final_mark": 0,
          "status": "finished",
          "validated?": false,
          "current_team_id": 2954790,
          "project": {
            "id": 1613,
            "name": "Day 05",
            "slug": "42cursus-piscine-ruby-on-rails-day-05",
            "parent_id": 1482
          },
          "cursus_ids": [21],
          "marked_at": "2017-01-23T15:45:59.000Z",
          "marked": true,
          "retriable_at": "2019-12-19T23:00:00.000Z"
        },
        {
          "id": 1681565,
          "occurrence": 0,
          "final_mark": 0,
          "status": "finished",
          "validated?": false,
          "current_team_id": 2954791,
          "project": {
            "id": 1614,
            "name": "Day 06",
            "slug": "42cursus-piscine-ruby-on-rails-day-06",
            "parent_id": 1482
          },
          "cursus_ids": [21],
          "marked_at": "2017-09-02T13:22:49.000Z",
          "marked": true,
          "retriable_at": "2019-12-19T23:00:00.000Z"
        },
        {
          "id": 1681566,
          "occurrence": 0,
          "final_mark": 0,
          "status": "finished",
          "validated?": false,
          "current_team_id": 2954793,
          "project": {
            "id": 1615,
            "name": "Day 07",
            "slug": "42cursus-piscine-ruby-on-rails-day-07",
            "parent_id": 1482
          },
          "cursus_ids": [21],
          "marked_at": "2016-12-19T08:51:44.000Z",
          "marked": true,
          "retriable_at": "2019-12-19T23:00:00.000Z"
        },
        {
          "id": 1681567,
          "occurrence": 0,
          "final_mark": 60,
          "status": "finished",
          "validated?": true,
          "current_team_id": 2954794,
          "project": {
            "id": 1616,
            "name": "Day 08",
            "slug": "42cursus-piscine-ruby-on-rails-day-08",
            "parent_id": 1482
          },
          "cursus_ids": [21],
          "marked_at": "2016-12-18T10:28:33.000Z",
          "marked": true,
          "retriable_at": "2019-12-19T23:00:00.000Z"
        },
        {
          "id": 1681568,
          "occurrence": 0,
          "final_mark": 0,
          "status": "finished",
          "validated?": false,
          "current_team_id": 2954795,
          "project": {
            "id": 1617,
            "name": "Day 09",
            "slug": "42cursus-piscine-ruby-on-rails-day-09",
            "parent_id": 1482
          },
          "cursus_ids": [21],
          "marked_at": "2016-12-19T08:51:36.000Z",
          "marked": true,
          "retriable_at": "2019-12-19T23:00:00.000Z"
        },
        {
          "id": 1681569,
          "occurrence": 0,
          "final_mark": 0,
          "status": "finished",
          "validated?": false,
          "current_team_id": 2954796,
          "project": {
            "id": 1619,
            "name": "Rush 01",
            "slug": "piscine-ruby-on-rails-rush-01",
            "parent_id": 791
          },
          "cursus_ids": [21],
          "marked_at": "2018-04-24T12:17:53.000Z",
          "marked": true,
          "retriable_at": "2019-12-19T23:00:00.000Z"
        },
        {
          "id": 1681556,
          "occurrence": 0,
          "final_mark": 79,
          "status": "finished",
          "validated?": true,
          "current_team_id": 2954783,
          "project": {
            "id": 1609,
            "name": "Day 01",
            "slug": "42cursus-piscine-ruby-on-rails-day-01",
            "parent_id": 1482
          },
          "cursus_ids": [21],
          "marked_at": "2017-04-14T12:09:05.000Z",
          "marked": true,
          "retriable_at": "2019-12-19T23:00:00.000Z"
        },
        {
          "id": 438788,
          "occurrence": 1,
          "final_mark": 100,
          "status": "finished",
          "validated?": true,
          "current_team_id": 1472260,
          "project": {
            "id": 96,
            "name": "Savoir Relier",
            "slug": "savoir-relier",
            "parent_id": null
          },
          "cursus_ids": [1],
          "marked_at": "2016-11-13T17:02:42.006Z",
          "marked": true,
          "retriable_at": "2016-11-13T17:02:40.889Z"
        },
        {
          "id": 1681532,
          "occurrence": 0,
          "final_mark": 100,
          "status": "finished",
          "validated?": true,
          "current_team_id": 2954759,
          "project": {
            "id": 1396,
            "name": "camagru",
            "slug": "42cursus-camagru",
            "parent_id": null
          },
          "cursus_ids": [21],
          "marked_at": "2017-06-26T21:53:01.000Z",
          "marked": true,
          "retriable_at": "2019-12-19T23:00:00.000Z"
        }
      ],
      "languages_users": [
        {
          "id": 131203,
          "language_id": 2,
          "user_id": 19265,
          "position": 1,
          "created_at": "2018-10-19T11:21:57.397Z"
        }
      ],
      "achievements": [
        {
          "id": 116,
          "name": "1.21 Gigawatts ?!",
          "description": "Participer au Time Capsule et se laisser un petit mot.",
          "tier": "easy",
          "kind": "social",
          "visible": true,
          "image": "/uploads/achievement/image/116/SOC014.svg",
          "nbr_of_success": null,
          "users_url": "https://api.intra.42.fr/v2/achievements/116/users"
        },
        {
          "id": 40,
          "name": "404 - Sleep not found",
          "description": "Etre logué 24h de suite. (à bosser, ofc !)",
          "tier": "easy",
          "kind": "scolarity",
          "visible": true,
          "image": "/uploads/achievement/image/40/SCO001.svg",
          "nbr_of_success": null,
          "users_url": "https://api.intra.42.fr/v2/achievements/40/users"
        },
        {
          "id": 41,
          "name": "All work and no play makes Jack a dull boy",
          "description": "Etre logué 90h sur une semaine. ",
          "tier": "easy",
          "kind": "scolarity",
          "visible": true,
          "image": "/uploads/achievement/image/41/SCO001.svg",
          "nbr_of_success": null,
          "users_url": "https://api.intra.42.fr/v2/achievements/41/users"
        },
        {
          "id": 107,
          "name": "And now my watch begins",
          "description": "Rejoindre les tuteurs.",
          "tier": "none",
          "kind": "scolarity",
          "visible": true,
          "image": "/uploads/achievement/image/107/SCO0017.svg",
          "nbr_of_success": null,
          "users_url": "https://api.intra.42.fr/v2/achievements/107/users"
        },
        {
          "id": 17,
          "name": "Bonus Hunter",
          "description": "Valider 1 projet avec la note maximum.",
          "tier": "easy",
          "kind": "project",
          "visible": false,
          "image": "/uploads/achievement/image/17/PRO005.svg",
          "nbr_of_success": 1,
          "users_url": "https://api.intra.42.fr/v2/achievements/17/users"
        },
        {
          "id": 18,
          "name": "Bonus Hunter",
          "description": "Valider 3 projets avec la note maximum.",
          "tier": "medium",
          "kind": "project",
          "visible": false,
          "image": "/uploads/achievement/image/18/PRO005.svg",
          "nbr_of_success": 3,
          "users_url": "https://api.intra.42.fr/v2/achievements/18/users"
        },
        {
          "id": 114,
          "name": "Business Angel",
          "description": "Valider un partenariat.",
          "tier": "none",
          "kind": "project",
          "visible": true,
          "image": "/uploads/achievement/image/114/PRO014.svg",
          "nbr_of_success": null,
          "users_url": "https://api.intra.42.fr/v2/achievements/114/users"
        },
        {
          "id": 4,
          "name": "Code Explorer",
          "description": "Valider son premier projet.",
          "tier": "none",
          "kind": "project",
          "visible": true,
          "image": "/uploads/achievement/image/4/PRO002.svg",
          "nbr_of_success": 1,
          "users_url": "https://api.intra.42.fr/v2/achievements/4/users"
        },
        {
          "id": 5,
          "name": "Code Explorer",
          "description": "Valider 3 projets.",
          "tier": "none",
          "kind": "project",
          "visible": true,
          "image": "/uploads/achievement/image/5/PRO002.svg",
          "nbr_of_success": 3,
          "users_url": "https://api.intra.42.fr/v2/achievements/5/users"
        },
        {
          "id": 6,
          "name": "Code Explorer",
          "description": "Valider 10 projets.",
          "tier": "none",
          "kind": "project",
          "visible": true,
          "image": "/uploads/achievement/image/6/PRO002.svg",
          "nbr_of_success": 10,
          "users_url": "https://api.intra.42.fr/v2/achievements/6/users"
        },
        {
          "id": 7,
          "name": "Code Explorer",
          "description": "Valider 21 projets.",
          "tier": "none",
          "kind": "project",
          "visible": true,
          "image": "/uploads/achievement/image/7/PRO002.svg",
          "nbr_of_success": 21,
          "users_url": "https://api.intra.42.fr/v2/achievements/7/users"
        },
        {
          "id": 65,
          "name": "Come to the dark side, we have cookies",
          "description": "Devenir bocalien.",
          "tier": "none",
          "kind": "scolarity",
          "visible": true,
          "image": "/uploads/achievement/image/65/SCO010.svg",
          "nbr_of_success": null,
          "users_url": "https://api.intra.42.fr/v2/achievements/65/users"
        },
        {
          "id": 44,
          "name": "Curious wanderer",
          "description": "S'être logué une fois dans chaque cluster.",
          "tier": "none",
          "kind": "scolarity",
          "visible": false,
          "image": "/uploads/achievement/image/44/SCO002.svg",
          "nbr_of_success": null,
          "users_url": "https://api.intra.42.fr/v2/achievements/44/users"
        },
        {
          "id": 46,
          "name": "Film buff",
          "description": "Regarder 1 video sur l'e-learning.",
          "tier": "none",
          "kind": "pedagogy",
          "visible": false,
          "image": "/uploads/achievement/image/46/PED005.svg",
          "nbr_of_success": 1,
          "users_url": "https://api.intra.42.fr/v2/achievements/46/users"
        },
        {
          "id": 47,
          "name": "Film buff",
          "description": "Regarder 3 videos sur l'e-learning.",
          "tier": "none",
          "kind": "pedagogy",
          "visible": false,
          "image": "/uploads/achievement/image/47/PED005.svg",
          "nbr_of_success": 3,
          "users_url": "https://api.intra.42.fr/v2/achievements/47/users"
        },
        {
          "id": 45,
          "name": "Home is where the code is",
          "description": "S'être logué dans le même cluster un mois de suite.",
          "tier": "none",
          "kind": "scolarity",
          "visible": true,
          "image": "/uploads/achievement/image/45/SCO002.svg",
          "nbr_of_success": null,
          "users_url": "https://api.intra.42.fr/v2/achievements/45/users"
        },
        {
          "id": 103,
          "name": "I am the watcher on the walls",
          "description": "Surveiller 1 examen en tant que tuteur.",
          "tier": "none",
          "kind": "scolarity",
          "visible": true,
          "image": "/uploads/achievement/image/103/SCO0016.svg",
          "nbr_of_success": 1,
          "users_url": "https://api.intra.42.fr/v2/achievements/103/users"
        },
        {
          "id": 31,
          "name": "I found the answer",
          "description": "Valider le level 21 et être prêt à affronter le monde extérieur !",
          "tier": "none",
          "kind": "pedagogy",
          "visible": true,
          "image": "/uploads/achievement/image/31/PED003.svg",
          "nbr_of_success": null,
          "users_url": "https://api.intra.42.fr/v2/achievements/31/users"
        },
        {
          "id": 82,
          "name": "I have no idea what I'm doing",
          "description": "Faire une soutenance sans avoir validé le projet.",
          "tier": "none",
          "kind": "pedagogy",
          "visible": true,
          "image": "/uploads/achievement/image/82/PED011.svg",
          "nbr_of_success": null,
          "users_url": "https://api.intra.42.fr/v2/achievements/82/users"
        },
        {
          "id": 109,
          "name": "I’ll make him an offer he can’t refuse",
          "description": "Participer au programme de parrainage en tant que parrain.",
          "tier": "none",
          "kind": "pedagogy",
          "visible": true,
          "image": "/uploads/achievement/image/109/PED014.svg",
          "nbr_of_success": null,
          "users_url": "https://api.intra.42.fr/v2/achievements/109/users"
        },
        {
          "id": 84,
          "name": "I'm reliable !",
          "description": "Participer à 21 soutenances d'affilée sans en manquer aucune.",
          "tier": "easy",
          "kind": "pedagogy",
          "visible": true,
          "image": "/uploads/achievement/image/84/PED009.svg",
          "nbr_of_success": 21,
          "users_url": "https://api.intra.42.fr/v2/achievements/84/users"
        },
        {
          "id": 87,
          "name": "I post, therefore I am",
          "description": "Poster 1 message sur le forum.",
          "tier": "none",
          "kind": "social",
          "visible": false,
          "image": "/uploads/achievement/image/87/SOC005.svg",
          "nbr_of_success": 1,
          "users_url": "https://api.intra.42.fr/v2/achievements/87/users"
        },
        {
          "id": 36,
          "name": "It's a rich man's world",
          "description": "Avoir 100 points de wallet.",
          "tier": "none",
          "kind": "social",
          "visible": true,
          "image": "/uploads/achievement/image/36/SOC004.svg",
          "nbr_of_success": 100,
          "users_url": "https://api.intra.42.fr/v2/achievements/36/users"
        },
        {
          "id": 37,
          "name": "It's a rich man's world",
          "description": "Avoir 200 points de wallet.",
          "tier": "none",
          "kind": "social",
          "visible": true,
          "image": "/uploads/achievement/image/37/SOC004.svg",
          "nbr_of_success": 200,
          "users_url": "https://api.intra.42.fr/v2/achievements/37/users"
        },
        {
          "id": 155,
          "name": "Je voudrais un croissant",
          "description": "Visiter le campus de Paris",
          "tier": "none",
          "kind": "scolarity",
          "visible": true,
          "image": "/uploads/achievement/image/155/BADGE_SCOLARITY_paris.svg",
          "nbr_of_success": null,
          "users_url": "https://api.intra.42.fr/v2/achievements/155/users"
        },
        {
          "id": 88,
          "name": "Love me, I'm famous",
          "description": "Avoir été upvoté 1 fois sur le forum.",
          "tier": "none",
          "kind": "social",
          "visible": true,
          "image": "/uploads/achievement/image/88/SOC006.svg",
          "nbr_of_success": 1,
          "users_url": "https://api.intra.42.fr/v2/achievements/88/users"
        },
        {
          "id": 94,
          "name": "Love me, I'm famous",
          "description": "Avoir été upvoté 10 fois sur le forum.",
          "tier": "none",
          "kind": "social",
          "visible": true,
          "image": "/uploads/achievement/image/94/SOC006.svg",
          "nbr_of_success": 10,
          "users_url": "https://api.intra.42.fr/v2/achievements/94/users"
        },
        {
          "id": 95,
          "name": "Love me, I'm famous",
          "description": "Avoir été upvoté 42 fois sur le forum. Ne seront comptés que 25 upvotes par personne au maximum.",
          "tier": "none",
          "kind": "social",
          "visible": false,
          "image": "/uploads/achievement/image/95/SOC006.svg",
          "nbr_of_success": 42,
          "users_url": "https://api.intra.42.fr/v2/achievements/95/users"
        },
        {
          "id": 25,
          "name": "Rigorous Basterd",
          "description": "Valider 3 projets d'affilée (journées de piscines comprises).",
          "tier": "none",
          "kind": "project",
          "visible": true,
          "image": "/uploads/achievement/image/25/PRO010.svg",
          "nbr_of_success": 3,
          "users_url": "https://api.intra.42.fr/v2/achievements/25/users"
        },
        {
          "id": 26,
          "name": "Rigorous Basterd",
          "description": "Valider 10 projets d'affilée (journées de piscines comprises).",
          "tier": "easy",
          "kind": "project",
          "visible": true,
          "image": "/uploads/achievement/image/26/PRO010.svg",
          "nbr_of_success": 10,
          "users_url": "https://api.intra.42.fr/v2/achievements/26/users"
        },
        {
          "id": 27,
          "name": "Rigorous Basterd",
          "description": "Valider 21 projets d'affilée (journées de piscines comprises).",
          "tier": "medium",
          "kind": "project",
          "visible": true,
          "image": "/uploads/achievement/image/27/PRO010.svg",
          "nbr_of_success": 21,
          "users_url": "https://api.intra.42.fr/v2/achievements/27/users"
        },
        {
          "id": 28,
          "name": "Rigorous Basterd",
          "description": "Valider 42 projets d'affilée (journées de piscines comprises).",
          "tier": "hard",
          "kind": "project",
          "visible": true,
          "image": "/uploads/achievement/image/28/PRO010.svg",
          "nbr_of_success": 42,
          "users_url": "https://api.intra.42.fr/v2/achievements/28/users"
        },
        {
          "id": 39,
          "name": "Sleep is for the weak",
          "description": "Obtenir les achievements \"404 - Sleep not found\" et \"In the name of Nicolas !\"",
          "tier": "none",
          "kind": "scolarity",
          "visible": true,
          "image": "/uploads/achievement/image/39/SCO001.svg",
          "nbr_of_success": null,
          "users_url": "https://api.intra.42.fr/v2/achievements/39/users"
        },
        {
          "id": 115,
          "name": "Venture Capitalist",
          "description": "Valider un partenariat avec la note 125.",
          "tier": "none",
          "kind": "project",
          "visible": true,
          "image": "/uploads/achievement/image/115/PRO016.svg",
          "nbr_of_success": null,
          "users_url": "https://api.intra.42.fr/v2/achievements/115/users"
        },
        {
          "id": 1,
          "name": "Welcome, Cadet !",
          "description": "Tu as réussi ta piscine C. Bienvenue à 42 !",
          "tier": "none",
          "kind": "project",
          "visible": true,
          "image": "/uploads/achievement/image/1/PRO001.svg",
          "nbr_of_success": null,
          "users_url": "https://api.intra.42.fr/v2/achievements/1/users"
        }
      ],
      "titles": [
        {
          "id": 12,
          "name": "Altruist %login"
        },
        {
          "id": 42,
          "name": "Venture Capitalist %login"
        },
        {
          "id": 82,
          "name": "[DEPRECATED] %login"
        }
      ],
      "titles_users": [
        {
          "id": 499,
          "user_id": 19265,
          "title_id": 12,
          "selected": false
        },
        {
          "id": 1178,
          "user_id": 19265,
          "title_id": 42,
          "selected": false
        },
        {
          "id": 3571,
          "user_id": 19265,
          "title_id": 82,
          "selected": false
        }
      ],
      "partnerships": [
        {
          "id": 366,
          "name": "42cursus - [bocal] Développement web 6 mois",
          "slug": "42cursus-bocal-developpement-web-6-mois",
          "difficulty": 42000,
          "url": "https://api.intra.42.fr/v2/partnerships/42cursus-bocal-developpement-web-6-mois",
          "partnerships_users_url": "https://api.intra.42.fr/v2/partnerships/42cursus-bocal-developpement-web-6-mois/partnerships_users",
          "partnerships_skills": [
            {
              "id": 850,
              "partnership_id": 366,
              "skill_id": 7,
              "value": 4200.0,
              "created_at": "2019-12-20T11:33:20.393Z",
              "updated_at": "2019-12-20T11:33:20.393Z"
            },
            {
              "id": 849,
              "partnership_id": 366,
              "skill_id": 6,
              "value": 18900.0,
              "created_at": "2019-12-20T11:33:20.391Z",
              "updated_at": "2019-12-20T11:33:20.391Z"
            },
            {
              "id": 848,
              "partnership_id": 366,
              "skill_id": 16,
              "value": 10500.0,
              "created_at": "2019-12-20T11:33:20.389Z",
              "updated_at": "2019-12-20T11:33:20.389Z"
            },
            {
              "id": 847,
              "partnership_id": 366,
              "skill_id": 12,
              "value": 8400.0,
              "created_at": "2019-12-20T11:33:20.387Z",
              "updated_at": "2019-12-20T11:33:20.387Z"
            }
          ]
        },
        {
          "id": 45,
          "name": "[bocal] Développement web 6 mois",
          "slug": "bocal-developpement-web-6-mois",
          "difficulty": 1000,
          "url": "https://api.intra.42.fr/v2/partnerships/bocal-developpement-web-6-mois",
          "partnerships_users_url": "https://api.intra.42.fr/v2/partnerships/bocal-developpement-web-6-mois/partnerships_users",
          "partnerships_skills": [
            {
              "id": 106,
              "partnership_id": 45,
              "skill_id": 12,
              "value": 200.0,
              "created_at": "2016-02-25T13:55:06.254Z",
              "updated_at": "2016-02-25T13:55:06.254Z"
            },
            {
              "id": 107,
              "partnership_id": 45,
              "skill_id": 16,
              "value": 250.0,
              "created_at": "2016-02-25T13:55:06.264Z",
              "updated_at": "2016-02-25T13:55:06.264Z"
            },
            {
              "id": 108,
              "partnership_id": 45,
              "skill_id": 6,
              "value": 450.0,
              "created_at": "2016-02-25T13:55:06.272Z",
              "updated_at": "2016-02-25T13:55:06.272Z"
            },
            {
              "id": 109,
              "partnership_id": 45,
              "skill_id": 7,
              "value": 100.0,
              "created_at": "2016-02-25T13:55:06.280Z",
              "updated_at": "2016-02-25T13:55:06.280Z"
            }
          ]
        }
      ],
      "patroned": [],
      "patroning": [
        {
          "id": 641,
          "user_id": 26286,
          "godfather_id": 19265,
          "ongoing": true,
          "created_at": "2017-11-08T12:09:36.343Z",
          "updated_at": "2020-10-28T06:11:33.003Z"
        },
        {
          "id": 746,
          "user_id": 26384,
          "godfather_id": 19265,
          "ongoing": true,
          "created_at": "2017-11-08T17:21:54.330Z",
          "updated_at": "2020-10-28T06:11:33.549Z"
        },
        {
          "id": 640,
          "user_id": 27119,
          "godfather_id": 19265,
          "ongoing": true,
          "created_at": "2017-11-08T12:09:36.143Z",
          "updated_at": "2020-10-28T06:11:33.181Z"
        },
        {
          "id": 642,
          "user_id": 28830,
          "godfather_id": 19265,
          "ongoing": true,
          "created_at": "2017-11-08T12:09:36.523Z",
          "updated_at": "2020-10-28T06:11:33.212Z"
        }
      ],
      "expertises_users": [
        {
          "id": 22552,
          "expertise_id": 30,
          "interested": false,
          "value": 3,
          "contact_me": false,
          "created_at": "2018-07-22T11:49:26.596Z",
          "user_id": 19265
        },
        {
          "id": 19215,
          "expertise_id": 26,
          "interested": false,
          "value": 3,
          "contact_me": false,
          "created_at": "2018-02-22T14:48:07.598Z",
          "user_id": 19265
        },
        {
          "id": 19213,
          "expertise_id": 12,
          "interested": false,
          "value": 4,
          "contact_me": false,
          "created_at": "2018-02-22T10:32:13.223Z",
          "user_id": 19265
        },
        {
          "id": 19212,
          "expertise_id": 13,
          "interested": false,
          "value": 3,
          "contact_me": false,
          "created_at": "2018-02-22T10:31:42.703Z",
          "user_id": 19265
        },
        {
          "id": 19211,
          "expertise_id": 15,
          "interested": false,
          "value": 2,
          "contact_me": false,
          "created_at": "2018-02-22T10:31:16.196Z",
          "user_id": 19265
        },
        {
          "id": 19210,
          "expertise_id": 33,
          "interested": false,
          "value": 4,
          "contact_me": false,
          "created_at": "2018-02-22T10:31:02.503Z",
          "user_id": 19265
        },
        {
          "id": 19209,
          "expertise_id": 31,
          "interested": false,
          "value": 5,
          "contact_me": false,
          "created_at": "2018-02-22T10:30:56.816Z",
          "user_id": 19265
        }
      ],
      "roles": [],
      "campus": [
        {
          "id": 1,
          "name": "Paris",
          "time_zone": "Europe/Paris",
          "language": {
            "id": 1,
            "name": "Français",
            "identifier": "fr",
            "created_at": "2014-11-02T16:43:38.466Z",
            "updated_at": "2021-04-14T12:59:04.679Z"
          },
          "users_count": 21241,
          "vogsphere_id": 1,
          "country": "France",
          "address": "96, boulevard Bessières",
          "zip": "75017",
          "city": "Paris",
          "website": "http://www.42.fr/",
          "facebook": "https://facebook.com/42born2code",
          "twitter": "https://twitter.com/42born2code",
          "active": true,
          "email_extension": "42.fr",
          "default_hidden_phone": false
        }
      ],
      "campus_users": [
        {
          "id": 8379,
          "user_id": 19265,
          "campus_id": 1,
          "is_primary": true
        }
      ]
    }
  }
}

Licence

The MIT License (MIT)

Copyright (c) 2015 Samy KACIMI

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.