package com.airlock.iam.publicselfservice.infrastructure.factory.shared;

import com.airlock.iam.base.api.domain.model.exception.FailureException;
import com.airlock.iam.common.domain.model.user.PrincipalInfo;
import com.airlock.iam.publicselfservice.api.domain.model.PublicSelfServiceUser;
import com.airlock.iam.publicselfservice.domain.service.PublicSelfServiceUserFactory;
import com.google.inject.Exposed;
import com.google.inject.PrivateModule;
import com.google.inject.Provides;
import com.google.inject.servlet.RequestScoped;

public final class PublicSelfServiceUserModule extends PrivateModule {
   @RequestScoped
   @Exposed
   @Provides
   PublicSelfServiceUser providePublicSelfServiceUser(PublicSelfServiceUserFactory service, PrincipalInfo principalInfo) {
      return principalInfo.getKnownIdentity()
         .map(service::createPublicSelfServiceUser)
         .orElseThrow(
            () -> new FailureException("User identity required but not found. A preceding user identification step might be missing. Configuration error?")
         );
   }

   protected void configure() {
   }
}
