The aim of the diagram is not to document each endpoint (this is the role of the swagger provided by the services).

It's goal is to have a global vision of the exchanges made between the Angular App (front) and the services, and among the services themselves for each functionality related to the authentication and the authorization.

```plantuml

!define BLACK   #333745
!define RED     #d5232a
!define GREEN   #37A77C

' Base Setting
skinparam BackgroundColor transparent

skinparam Sequence {
    ArrowThickness 1
    ArrowColor RED
    LifeLineBorderColor GREEN
    ParticipantBorderThickness 1
}
skinparam Participant {
    BackgroundColor #FFFFFF
    BorderColor BLACK
    FontColor BLACK
}

skinparam note {
    BackgroundColor #FFFFFF
    BorderColor BLACK
    FontColor BLACK
}

participant "Front" as front
participant "Authentication Service" as auth
participant "Middleware Legacy Auth" as middle
participant "Legacy Auth (Neogeo)" as django
participant "Email Service" as email
participant "Kong" as kong
participant "OIDC Server" as oidc

group Authentication with OIDC providers
    group Login
        front -> auth : <b>GET</b> /login/:identityProvider
        note over auth: Set redis key/value with Provider as value
        front <-- auth : [302] redirection to the appropriate url
    end

    group Exchange token against JWT
        front -> auth : <b>GET</b> /token
        note over auth: Get redis value corresponding to the OIDC Provider
        auth -> oidc : <b>POST</b> /token_endpoint
        auth <-- oidc : { id_token, access_token }
        auth -> oidc : <b>GET</b> /userInfo_endpoint
        auth <-- oidc : { userInfo }
        auth -> kong : <b>PUT</b> /consumers/:email
        auth <-- kong : Ok
        auth -> kong : <b>GET or POST</b> /consumers/:email/jwt (POST if no creadetials exist for this user)
        auth <-- kong : { credentials }
        front <-- auth: { token: jwt }
    end

    group Logout
        front -> auth : <b>GET</b> /logout
        front <-- auth : [302] redirection to the appropriate url
    end
end

group Authentication with Django Server
    group Get Public Key
        front -> middle : <b>GET</b> /publicKey
        front <-- middle : { publicKey }
    end

    group Legacy login
        front -> auth : <b>POST</b> /login/legacy
        auth -> middle : <b>POST</b> /user/login
        middle -> django : <b>POST</b> /get_user/
        middle <-- django : { userInfo }
        middle --> auth : { userInfo with encrypted password as authzKey}
        auth -> kong : <b>PUT</b> /consumers/:email
        auth <-- kong : Ok
        auth -> kong : <b>GET or POST</b> /consumers/:email/jwt (POST if no creadetials exist for this user)
        auth <-- kong : { credentials }
        front <-- auth : { token: jwt }
    end

    group Password forgotten
        front -> middle : <b>POST</b> /passwordForgotten
        note over middle: Set token in Redis with ttl 24h.
        middle -> email : <b>POST</b> /email/send (body contains the link to the reset password form)
        middle <-- email : void
        front <-- middle : void
    end

    group Verify Password reset token validity
        front -> middle : <b>GET</b> /isPasswordResetTokenValid
        note over middle: Look for token in Redis.
        front <-- middle : boolean
    end

    group Password reset
        front -> middle : <b>PUT</b> /user/resetPassword
        note over middle: Look for token in Redis.
        middle -> django : <b>POST</b> /update_user_password/
        middle <-- django
        note over middle: Delete token from Redis.
        front <-- auth : void
    end

    group Password update
        front -> middle : <b>PUT</b> /user/updatePassword
        middle -> django : <b>GET</b> /get_user/
        middle <-- django : Ok
        middle -> django : <b>PUT</b> /update_user_password/
        middle <-- django : Ok
        front <-- middle : void
    end

    group User update
        front -> auth : <b>PUT</b> /user/update
        auth -> middle : <b>PUT</b> /user/update
        middle -> django : <b>POST</b> /update_user/
        middle <-- django : Ok
        middle -> django : <b>POST</b> /get_user/
        middle <-- django : { userInfo }
        auth <-- middle : { userInfo with encrypted password as authzKey}
        auth -> kong : <b>PUT</b> /consumers/:email
        auth <-- kong : Ok
        auth -> kong : <b>GET or POST</b> /consumers/:email/jwt (POST if no creadetials exist for this user)
        auth <-- kong : { credentials }
        front <-- auth : { token: jwt }
    end

    group User Info
        front -> auth : <b>GET</b> /user
        auth -> middle : <b>GET</b> /user
        middle -> django : <b>POST</b> /get_user/
        middle <-- django : { userInfo }
        auth <-- middle : { userInfo }
        front <-- auth : { userInfo }
    end

    group User creation
        front -> middle : <b>POST</b> /user
        note over middle : Set token in redis with ttl 24h
        middle -> email : email : <b>POST</b> /email/send (body contains account validation link)
        middle <-- email : void
        front <-- middle : void
    end

    group Validate User creation
        front -> middle : <b>POST</b> /user/validateAccount
        note over middle : Validate token existance in redis
        middle -> django : <b>POST</b> /add_user/
        middle <-- django : Ok
        note over middle : Remove token from redis
        front <-- middle : void
    end

    group User account deletion
        front -> middle : <b>DELETE</b> /user
        middle -> django : <b>POST</b> /delete_user/
        middle <-- django : Ok
        front <-- middle : void
    end
end

group Authorization with Django server
    group List User resources
        front -> middle : <b>POST</b> /user/resources
        middle -> django : <b>POST</b> /get_user_service/
        middle <-- django : { rawRessources }
        front <-- middle : { Ressources }
    end

    group Add User access to resource
        front -> middle : <b>POST</b> user/resources/add
        middle -> django : <b>GET</b> /get_services/ (only needed to add names in email)
        middle <-- django : { datasets }
        middle -> django : <b>GET</b> /get_modes/ (only needed to add names in email)
        middle <-- django : { services }
        loop n times (n different datasets requested)
            middle -> django : <b>POST</b> /add_user_service/
            middle <-- django : Ok
        end
        middle -> email : <b>POST</b> /email/send (Admin + User email)
        middle <-- email : void
        front <-- middle: { successfullyRequested, unsuccessfullyRequested }
    end

    group Renew User access to resource
        front -> middle : <b>POST</b> user/resources/renew
        middle -> django : <b>POST</b> /get_user_service/ (check if access as already been validated)
        middle <-- django : { user Ressources }
        middle -> django : <b>GET</b> /get_services/ (only needed to add names in email)
        middle <-- django : { datasets }
        middle -> django : <b>GET</b> /get_modes/ (only needed to add names in email)
        middle <-- django : { services }
        middle -> email : <b>POST</b> /email/send (Admin + User email)
        middle <-- email : void
        front <-- middle: { successfullyRenewalRequested, unsuccessfullyRenewalRequested }
    end

    group Delete User access to resource
        front -> middle : <b>POST</b> user/resources/delete
        middle -> django : <b>GET</b> /get_services/ (only needed to add names in email)
        middle <-- django : { datasets }
        middle -> django : <b>GET</b> /get_modes/ (only needed to add names in email)
        middle <-- django : { services }
        loop n times (n different datasets to be deleted)
            middle -> django : <b>POST</b> /del_user_service/
            middle <-- django : Ok
        end
        middle -> email : <b>POST</b> /email/send (Admin + User email)
        middle <-- email : void
        front <-- middle: { successfullyDeleted, unsuccessfullyDeleted }
    end

    group List of services (modes)
        front -> middle : <b>GET</b> /services
        middle -> django : <b>GET</b> /get_modes/
        middle <-- django : { rawServices }
        front <-- middle : { services }
    end

    group List of restricted access datasets
        front -> middle : <b>GET</b> /restrictedAccessDatasets
        middle -> django : <b>GET</b> /get_services/
        middle <-- django : { datasets }
        front <-- middle : { datsets with "RESTRICTED" access}
    end
end
```