Started to refactor PageModelsApi to same structure used for other endpoints

Jens Pelzetter 2020-08-05 17:46:55 +02:00
parent 1c34927e92
commit 7819bd4146
4 changed files with 315 additions and 97 deletions

View File

@ -18,12 +18,12 @@
*/ */
package org.libreccm.api.pagemodels; package org.libreccm.api.pagemodels;
import com.arsdigita.kernel.KernelConfig;
import org.libreccm.api.dto.ListView;
import org.libreccm.api.pagemodels.dto.PageModelDto;
import org.libreccm.configuration.ConfigurationManager; import org.libreccm.configuration.ConfigurationManager;
import org.libreccm.core.CoreConstants; import org.libreccm.core.CoreConstants;
import org.libreccm.l10n.GlobalizationHelper; import org.libreccm.l10n.GlobalizationHelper;
import org.libreccm.pagemodel.ContainerModel;
import org.libreccm.pagemodel.PageModel; import org.libreccm.pagemodel.PageModel;
import org.libreccm.pagemodel.PageModelManager; import org.libreccm.pagemodel.PageModelManager;
import org.libreccm.pagemodel.PageModelRepository; import org.libreccm.pagemodel.PageModelRepository;
@ -35,10 +35,6 @@ import java.net.URI;
import javax.enterprise.context.RequestScoped; import javax.enterprise.context.RequestScoped;
import javax.inject.Inject; import javax.inject.Inject;
import javax.json.Json;
import javax.json.JsonArray;
import javax.json.JsonArrayBuilder;
import javax.json.JsonObject;
import javax.transaction.Transactional; import javax.transaction.Transactional;
import javax.ws.rs.Consumes; import javax.ws.rs.Consumes;
import javax.ws.rs.DELETE; import javax.ws.rs.DELETE;
@ -53,7 +49,10 @@ import javax.ws.rs.Produces;
import java.util.Objects; import java.util.Objects;
import java.util.Optional; import java.util.Optional;
import java.util.stream.Collectors;
import javax.ws.rs.DefaultValue;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.MediaType; import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response; import javax.ws.rs.core.Response;
@ -87,6 +86,8 @@ public class PageModels {
* CcmApplication}. * CcmApplication}.
* *
* @param appName The path of the {@code app}. * @param appName The path of the {@code app}.
* @param limit
* @param offset
* *
* @return A JSON array with the data of all {@link PageModel}s of the * @return A JSON array with the data of all {@link PageModel}s of the
* {@link CcmApplication} {@code app}. * {@link CcmApplication} {@code app}.
@ -101,22 +102,26 @@ public class PageModels {
@Transactional(Transactional.TxType.REQUIRED) @Transactional(Transactional.TxType.REQUIRED)
@AuthorizationRequired @AuthorizationRequired
@RequiresPrivilege(CoreConstants.PRIVILEGE_ADMIN) @RequiresPrivilege(CoreConstants.PRIVILEGE_ADMIN)
public JsonArray getAllPageModels( public ListView<PageModelDto> getAllPageModels(
@PathParam("appName") String appName @PathParam("appName") String appName,
@QueryParam("limit") @DefaultValue("20") final int limit,
@QueryParam("offset") @DefaultValue("0") final int offset
) { ) {
Objects.requireNonNull(appName); Objects.requireNonNull(appName);
final CcmApplication app = controller.findCcmApplication( final CcmApplication app = controller.findCcmApplication(
String.format("/%s/", appName) String.format("/%s/", appName)
); );
final JsonArrayBuilder arrayBuilder = Json.createArrayBuilder(); return new ListView<>(
pageModelRepo pageModelRepo
.findDraftByApplication(app) .findDraftByApplication(app, limit, offset)
.stream() .stream()
.map(this::mapPageModelToJson) .map(this::buildPageModelDto)
.forEach(arrayBuilder::add); .collect(Collectors.toList()),
pageModelRepo.countByApplication(app),
return arrayBuilder.build(); limit,
offset
);
} }
/** /**
@ -145,7 +150,7 @@ public class PageModels {
@Transactional(Transactional.TxType.REQUIRED) @Transactional(Transactional.TxType.REQUIRED)
@AuthorizationRequired @AuthorizationRequired
@RequiresPrivilege(CoreConstants.PRIVILEGE_ADMIN) @RequiresPrivilege(CoreConstants.PRIVILEGE_ADMIN)
public JsonObject getPageModel( public PageModelDto getPageModel(
@PathParam("appName") final String appName, @PathParam("appName") final String appName,
@PathParam("pageModelName") final String pageModelName @PathParam("pageModelName") final String pageModelName
) { ) {
@ -158,7 +163,7 @@ public class PageModels {
final PageModel pageModel = controller.findPageModel( final PageModel pageModel = controller.findPageModel(
app, pageModelName app, pageModelName
); );
return mapPageModelToJson(pageModel); return buildPageModelDto(pageModel);
} }
@POST @POST
@ -221,7 +226,7 @@ public class PageModels {
public Response putPageModel( public Response putPageModel(
@PathParam("appName") final String appName, @PathParam("appName") final String appName,
@PathParam("pageModelName") final String pageModelName, @PathParam("pageModelName") final String pageModelName,
final JsonObject pageModelData final PageModelDto pageModelData
) { ) {
Objects.requireNonNull(appName); Objects.requireNonNull(appName);
Objects.requireNonNull(pageModelName); Objects.requireNonNull(pageModelName);
@ -230,9 +235,6 @@ public class PageModels {
String.format("/%s/", appName) String.format("/%s/", appName)
); );
final KernelConfig kernelConfig = confManager
.findConfiguration(KernelConfig.class);
final PageModel pageModel; final PageModel pageModel;
final boolean created; final boolean created;
if (controller.existsPageModel(app, pageModelName)) { if (controller.existsPageModel(app, pageModelName)) {
@ -242,18 +244,28 @@ public class PageModels {
pageModel = pageModelManager.createPageModel(pageModelName, app); pageModel = pageModelManager.createPageModel(pageModelName, app);
created = true; created = true;
} }
if (pageModelData.containsKey("title")) { if (pageModelData.getTitle() != null) {
pageModel.getTitle().addValue( pageModelData
kernelConfig.getDefaultLocale(), .getTitle()
pageModelData.getString("title") .getValues()
); .entrySet()
.stream()
.forEach(
entry -> pageModel.getTitle().addValue(
entry.getKey(), entry.getValue()
)
);
} }
if (pageModelData.containsKey("description")) { if (pageModelData.getDescription() != null) {
pageModel pageModelData.
.getDescription() getDescription()
.addValue( .getValues()
kernelConfig.getDefaultLocale(), .entrySet()
pageModelData.getString("description") .stream()
.forEach(
entry -> pageModel.getDescription().addValue(
entry.getKey(), entry.getValue()
)
); );
} }
@ -319,22 +331,14 @@ public class PageModels {
).build(); ).build();
} }
/** private PageModelDto buildPageModelDto(final PageModel pageModel) {
* Helper method for mapping a {@link PageModel} object to JSON:
*
* @param pageModel The {@link PageModel} to map.
*
* @return A {@link JsonObject} object with the data of the provided {@link
* PageModel}.
*/
private JsonObject mapPageModelToJson(final PageModel pageModel) {
Objects.requireNonNull(pageModel); Objects.requireNonNull(pageModel);
final long lastPublished; final long lastPublished;
final Optional<PageModel> liveModel = pageModelManager.getLiveVersion( final Optional<PageModel> liveModel = pageModelManager.getLiveVersion(
pageModel pageModel
); );
if (liveModel.isPresent() if (liveModel.isPresent()
&& liveModel.get().getLastModified() != null) { && liveModel.get().getLastModified() != null) {
lastPublished = liveModel.get().getLastModified().getTime(); lastPublished = liveModel.get().getLastModified().getTime();
@ -348,54 +352,12 @@ public class PageModels {
lastModified = pageModel.getLastModified().getTime(); lastModified = pageModel.getLastModified().getTime();
} }
return Json return new PageModelDto(
.createObjectBuilder() pageModel,
.add("containers", mapContainersToJson(pageModel)) lastPublished,
.add( lastModified,
"description", getPublicationStatus(pageModel)
globalizationHelper.getValueFromLocalizedString( );
pageModel.getDescription()
)
)
.add("modelUuid", pageModel.getModelUuid())
.add("name", pageModel.getName())
.add("pageModelId", Long.toString(pageModel.getPageModelId()))
.add(
"title",
globalizationHelper.getValueFromLocalizedString(
pageModel.getTitle()
)
)
.add("type", pageModel.getType())
.add("uuid", pageModel.getUuid())
.add("version", pageModel.getVersion().toString())
.add("publicationStatus",
getPublicationStatus(pageModel).toString()
)
.add("lastModified", lastModified)
.add("lastPublished", lastPublished)
.build();
}
private JsonArray mapContainersToJson(final PageModel pageModel) {
final JsonArrayBuilder containers = Json.createArrayBuilder();
pageModel
.getContainers()
.stream()
.map(this::mapContainerToJson)
.forEach(container -> containers.add(container));
return containers.build();
}
private JsonObject mapContainerToJson(final ContainerModel container) {
return Json
.createObjectBuilder()
.add("containerUuid", container.getContainerUuid())
.add("key", container.getKey())
.add("uuid", container.getUuid())
.build();
} }
/** /**

View File

@ -64,14 +64,14 @@ class PageModelsController {
*/ */
@Transactional(Transactional.TxType.REQUIRED) @Transactional(Transactional.TxType.REQUIRED)
protected CcmApplication findCcmApplication(final String appPath) { protected CcmApplication findCcmApplication(final String appPath) {
return appRepo return appRepo
.retrieveApplicationForPath(Objects.requireNonNull(appPath)) .retrieveApplicationForPath(Objects.requireNonNull(appPath))
.orElseThrow(() -> new NotFoundException( .orElseThrow(
String.format( () -> new NotFoundException(
"No application with path \"%s\" found.", String.format(
appPath) "No application with path \"%s\" found.",
) appPath)
)
); );
} }

View File

@ -0,0 +1,72 @@
/*
* Copyright (C) 2020 LibreCCM Foundation.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
* MA 02110-1301 USA
*/
package org.libreccm.api.pagemodels.dto;
import org.libreccm.pagemodel.ContainerModel;
/**
*
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
*/
public class ContainerModelDto {
private long containerId;
private String uuid;
private String containerUuid;
private String key;
public ContainerModelDto() {
// Nothing
}
public ContainerModelDto(final ContainerModel fromContainerModel) {
this.containerId = fromContainerModel.getContainerId();
this.uuid = fromContainerModel.getUuid();
this.containerUuid = fromContainerModel.getContainerUuid();
this.key = fromContainerModel.getKey();
}
public String getUuid() {
return uuid;
}
public void setUuid(final String uuid) {
this.uuid = uuid;
}
public String getContainerUuid() {
return containerUuid;
}
public void setContainerUuid(final String containerUuid) {
this.containerUuid = containerUuid;
}
public String getKey() {
return key;
}
public void setKey(final String key) {
this.key = key;
}
}

View File

@ -0,0 +1,184 @@
/*
* Copyright (C) 2020 LibreCCM Foundation.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
* MA 02110-1301 USA
*/
package org.libreccm.api.pagemodels.dto;
import org.libreccm.api.pagemodels.PublicationStatus;
import org.libreccm.l10n.LocalizedString;
import org.libreccm.pagemodel.PageModel;
import org.libreccm.pagemodel.PageModelVersion;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
/**
*
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
*/
public class PageModelDto {
private long pageModelId;
private String uuid;
private String modelUuid;
private String name;
private PageModelVersion version;
private LocalizedString title;
private LocalizedString description;
private String type;
private long lastPublished;
private long lastModified;
private PublicationStatus publicationStatus;
private List<ContainerModelDto> containers;
public PageModelDto() {
containers = new ArrayList<>();
}
public PageModelDto(
final PageModel fromPageModel,
final long lastPublished,
final long lastModified,
final PublicationStatus publicationStatus
) {
this.pageModelId = fromPageModel.getPageModelId();
this.uuid = fromPageModel.getUuid();
this.modelUuid = fromPageModel.getModelUuid();
this.name = fromPageModel.getName();
this.version = fromPageModel.getVersion();
this.title = fromPageModel.getTitle();
this.description = fromPageModel.getDescription();
this.type = fromPageModel.getType();
this.lastPublished = lastPublished;
this.lastModified = lastModified;
this.publicationStatus = publicationStatus;
this.containers = fromPageModel
.getContainers()
.stream()
.map(ContainerModelDto::new)
.collect(Collectors.toList());
}
public long getPageModelId() {
return pageModelId;
}
public void setPageModelId(final long pageModelId) {
this.pageModelId = pageModelId;
}
public String getUuid() {
return uuid;
}
public void setUuid(final String uuid) {
this.uuid = uuid;
}
public String getModelUuid() {
return modelUuid;
}
public void setModelUuid(final String modelUuid) {
this.modelUuid = modelUuid;
}
public String getName() {
return name;
}
public void setName(final String name) {
this.name = name;
}
public PageModelVersion getVersion() {
return version;
}
public void setVersion(final PageModelVersion version) {
this.version = version;
}
public LocalizedString getTitle() {
return title;
}
public void setTitle(final LocalizedString title) {
this.title = title;
}
public LocalizedString getDescription() {
return description;
}
public void setDescription(final LocalizedString description) {
this.description = description;
}
public String getType() {
return type;
}
public void setType(final String type) {
this.type = type;
}
public long getLastPublished() {
return lastPublished;
}
public void setLastPublished(final long lastPublished) {
this.lastPublished = lastPublished;
}
public long getLastModified() {
return lastModified;
}
public void setLastModified(final long lastModified) {
this.lastModified = lastModified;
}
public PublicationStatus getPublicationStatus() {
return publicationStatus;
}
public void setPublicationStatus(final PublicationStatus publicationStatus) {
this.publicationStatus = publicationStatus;
}
public List<ContainerModelDto> getContainers() {
return new ArrayList<>(containers);
}
public void setContainers(List<ContainerModelDto> containers) {
this.containers = new ArrayList<>(containers);
}
}