@startuml ratatouille-login-model

interface LoginDAO {
	+authenticate(email: String, password: String, newPassword: String): LoggedUser
	+requestResetPassword(email: String): void
	+confirmResetPassword(email: String, newPassword: String, code: String): void
	+changePassword(user: LoggedUser, newPassword: String, oldPassword: String): void
}

class ChangePasswordRequest {
	-accessToken: String
	-previousPassword: String
	-proposedPassword: String
}

class LoginDAOImpl implements LoginDAO

interface LoginService {
	+authenticate(email: String, password: String, newPassword: String): Call<LoggedUser>
	+requestResetPassword(email: String): Call<void>
	+confirmResetPassword(email: String, newPassword: String, code: String): Call<void>
	+changePassword(user: LoggedUser, newPassword: String, oldPassword: String): Call<void>
}

class ServiceCaller {
	{static} +call(call: Call<R>): R
	{static} +call(call: Call<R>, exceptionSupplier: BiFunction<String, Throwable, E>): R
}

class ServiceGenerator {
	{static} +createService(serviceClass: Class<S>, baseUrl: String): S
}

LoginDAOImpl --+ LoginService
LoginDAOImpl --+ ChangePasswordRequest
LoginDAOImpl ..> ServiceCaller
LoginDAOImpl ..> ServiceGenerator

class LoggedUser extends Employee {
	-idToken: String
	-accessToken: String
	-refreshToken: String
}

together {
	class Employee {
		-id: String
		-name: String
		-mail: String
		-role: Role
	}
	
	enum Role {
		ADMINISTRATOR
		SUPERVISOR
		ROOM_ATTENDANT
		KITCHEN_ATTENDANT
	}
}

LoginDAO ..> LoggedUser

@enduml