RESTful endpoint for creating applications

Jens Pelzetter 2020-07-02 09:41:59 +02:00
parent 84c125128b
commit 14f084eef7
3 changed files with 101 additions and 2 deletions

View File

@ -33,7 +33,6 @@ import org.libreccm.sites.SiteRepository;
import org.libreccm.web.ApplicationRepository; import org.libreccm.web.ApplicationRepository;
import org.libreccm.web.CcmApplication; import org.libreccm.web.CcmApplication;
import java.util.List;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import javax.enterprise.context.RequestScoped; import javax.enterprise.context.RequestScoped;

View File

@ -24,21 +24,28 @@ import org.libreccm.api.admin.categorization.dto.DomainOwnershipData;
import org.libreccm.api.admin.web.dto.CcmApplicationDto; import org.libreccm.api.admin.web.dto.CcmApplicationDto;
import org.libreccm.api.dto.ListView; import org.libreccm.api.dto.ListView;
import org.libreccm.core.CoreConstants; import org.libreccm.core.CoreConstants;
import org.libreccm.l10n.LocalizedString;
import org.libreccm.security.AuthorizationRequired; import org.libreccm.security.AuthorizationRequired;
import org.libreccm.security.RequiresPrivilege; import org.libreccm.security.RequiresPrivilege;
import org.libreccm.sites.SiteAwareApplicationRepository; import org.libreccm.sites.SiteAwareApplicationRepository;
import org.libreccm.web.ApplicationCreateException;
import org.libreccm.web.ApplicationManager;
import org.libreccm.web.ApplicationRepository; import org.libreccm.web.ApplicationRepository;
import org.libreccm.web.ApplicationType;
import org.libreccm.web.CcmApplication; import org.libreccm.web.CcmApplication;
import java.util.Map;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import javax.enterprise.context.RequestScoped; import javax.enterprise.context.RequestScoped;
import javax.inject.Inject; import javax.inject.Inject;
import javax.transaction.Transactional; import javax.transaction.Transactional;
import javax.ws.rs.BadRequestException;
import javax.ws.rs.Consumes; import javax.ws.rs.Consumes;
import javax.ws.rs.DELETE; import javax.ws.rs.DELETE;
import javax.ws.rs.DefaultValue; import javax.ws.rs.DefaultValue;
import javax.ws.rs.GET; import javax.ws.rs.GET;
import javax.ws.rs.InternalServerErrorException;
import javax.ws.rs.NotFoundException; import javax.ws.rs.NotFoundException;
import javax.ws.rs.POST; import javax.ws.rs.POST;
import javax.ws.rs.PUT; import javax.ws.rs.PUT;
@ -46,8 +53,10 @@ import javax.ws.rs.Path;
import javax.ws.rs.PathParam; import javax.ws.rs.PathParam;
import javax.ws.rs.Produces; import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam; import javax.ws.rs.QueryParam;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType; import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response; import javax.ws.rs.core.Response;
import javax.ws.rs.core.UriInfo;
/** /**
* *
@ -57,6 +66,12 @@ import javax.ws.rs.core.Response;
@Path("/applications/") @Path("/applications/")
public class CcmApplicationsApi { public class CcmApplicationsApi {
@Context
private UriInfo uriInfo;
@Inject
private ApplicationManager applicationManager;
@Inject @Inject
private ApplicationRepository applicationRepository; private ApplicationRepository applicationRepository;
@ -121,8 +136,82 @@ public class CcmApplicationsApi {
@AuthorizationRequired @AuthorizationRequired
@RequiresPrivilege(CoreConstants.PRIVILEGE_ADMIN) @RequiresPrivilege(CoreConstants.PRIVILEGE_ADMIN)
@Transactional(Transactional.TxType.REQUIRED) @Transactional(Transactional.TxType.REQUIRED)
public Response createApplication(final CcmApplicationDto applicationData) { public Response createApplication(final CcmApplicationDto applicationData) {
throw new UnsupportedOperationException();
final String applicationClassName = applicationData
.getApplicationClassName();
final String path = applicationData.getPrimaryUrl();
final LocalizedString title = applicationData.getTitle();
final LocalizedString description = applicationData.getDescription();
final Class<?> clazz;
try {
clazz = Class.forName(applicationClassName);
} catch (ClassNotFoundException ex) {
throw new BadRequestException(
String.format(
"No class for applicationClassName \"%s\" found.",
applicationClassName
)
);
}
if (!CcmApplication.class.isAssignableFrom(clazz)) {
throw new BadRequestException(
String.format(
"The provided class \"%s\" is not an subclass of \"%s\".)",
clazz.getName(),
CcmApplication.class.getName()
)
);
}
@SuppressWarnings("unchecked")
final Class<? extends CcmApplication> applicationClass
= (Class<? extends CcmApplication>) clazz;
final Map<String, ApplicationType> applicationTypes = applicationManager
.getApplicationTypes();
if (!applicationTypes.containsKey(applicationClass.getName())) {
throw new NotFoundException(
String.format(
"No application type for class \"%s\" available.",
applicationClass.getName()
)
);
}
final ApplicationType applicationType = applicationTypes.get(
applicationClass.getName()
);
final CcmApplication application;
try {
application = applicationManager.createInstance(
applicationType, path, applicationClass
);
} catch (ApplicationCreateException ex) {
throw new InternalServerErrorException(
String.format(
"Failed to created new application of type \"%s\".",
applicationClass.getName()
)
);
}
application.setTitle(title);
application.setDescription(description);
return Response
.created(
uriInfo
.getBaseUriBuilder()
.path(path)
.build()
).build();
} }
@PUT @PUT

View File

@ -46,6 +46,8 @@ public class CcmApplicationDto {
private String created; private String created;
private String applicationClassName;
private String applicationType; private String applicationType;
private String primaryUrl; private String primaryUrl;
@ -74,6 +76,7 @@ public class CcmApplicationDto {
created = DateTimeFormatter.ISO_DATE_TIME.format( created = DateTimeFormatter.ISO_DATE_TIME.format(
application.getCreated().toInstant() application.getCreated().toInstant()
); );
applicationClassName = application.getClass().getName();
applicationType = application.getApplicationType(); applicationType = application.getApplicationType();
primaryUrl = application.getPrimaryUrl(); primaryUrl = application.getPrimaryUrl();
domains = application domains = application
@ -130,6 +133,14 @@ public class CcmApplicationDto {
this.created = created; this.created = created;
} }
public String getApplicationClassName() {
return applicationClassName;
}
protected void setApplicationClassName(final String applicationClassName) {
this.applicationClassName = applicationClassName;
}
public String getApplicationType() { public String getApplicationType() {
return applicationType; return applicationType;
} }