All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.sap.cds.adapter.rest.CdsRestHandlers Maven / Gradle / Ivy

/**************************************************************************
 * (C) 2019-2021 SAP SE or an SAP affiliate company. All rights reserved. *
 **************************************************************************/
package com.sap.cds.adapter.rest;

import static javax.servlet.http.HttpServletResponse.SC_BAD_REQUEST;
import static javax.servlet.http.HttpServletResponse.SC_CREATED;
import static javax.servlet.http.HttpServletResponse.SC_NO_CONTENT;
import static javax.servlet.http.HttpServletResponse.SC_OK;

import java.util.EnumMap;
import java.util.HashMap;
import java.util.Map;

import com.sap.cds.Result;
import com.sap.cds.adapter.rest.utils.JsonException;
import com.sap.cds.ql.Delete;
import com.sap.cds.ql.Insert;
import com.sap.cds.ql.Select;
import com.sap.cds.ql.Update;
import com.sap.cds.ql.cqn.CqnDelete;
import com.sap.cds.services.ServiceCatalog;
import com.sap.cds.services.cds.ApplicationService;
import com.sap.cds.services.request.RequestContext;

public class CdsRestHandlers {

	private static final EnumMap event2Handler = new EnumMap<>(CdsRestEvent.class);

	static {
		event2Handler.put(CdsRestEvent.GET, CdsRestHandlers::get);
		event2Handler.put(CdsRestEvent.PUT, CdsRestHandlers::put);
		event2Handler.put(CdsRestEvent.POST, CdsRestHandlers::post);
		event2Handler.put(CdsRestEvent.PATCH, CdsRestHandlers::patch);
		event2Handler.put(CdsRestEvent.DELETE, CdsRestHandlers::delete);
	}

	public static CdsRestHandler getHandler(CdsRestEvent event) {
		return event2Handler.get(event);
	}

	public static CdsRestResponse get(CdsRestRequest request, RequestContext context) {
		ApplicationService applicationService = findApplicationService(request, context);

		// remove the sap-language query parameter because this is used to set the language for the request
		Map clearedQueryParameters = new HashMap<>(request.getQueryParameterMap());
		clearedQueryParameters.remove("sap-language");
		Result result = applicationService.run( Select.from(request.getEntity()).matching(valueMap(clearedQueryParameters)) );
		return new CdsRestResponseImpl(SC_OK, result.toJson());
	}

	public static CdsRestResponse post(CdsRestRequest request, RequestContext context) {
		ApplicationService applicationService = findApplicationService(request, context);

		Insert insert;
		try {
			insert = Insert.into(request.getEntity()).entry(request.getBody().asMap());
		} catch (JsonException e) { //NOSONAR
			return new CdsRestResponseImpl(SC_BAD_REQUEST, e.getMessage());
		}

		applicationService.run(insert);
		return new CdsRestResponseImpl(SC_CREATED);
	}

	public static CdsRestResponse put(CdsRestRequest request, RequestContext context) {
		ApplicationService applicationService = findApplicationService(request, context);

		try {
			applicationService.run( Update.entity(request.getEntity()).data(request.getBody().asMap()).matching(valueMap(request.getQueryParameterMap())) );
		} catch (JsonException e) { //NOSONAR
			return new CdsRestResponseImpl(SC_BAD_REQUEST, e.getMessage());
		}
		return new CdsRestResponseImpl(SC_OK);
	}

	public static CdsRestResponse patch(CdsRestRequest request, RequestContext context) {
		return put(request, context);
	}

	public static CdsRestResponse delete(CdsRestRequest request, RequestContext context) {

		ApplicationService applicationService = findApplicationService(request, context);
		CqnDelete delete = Delete.from(request.getEntity()).matching(valueMap(request.getQueryParameterMap()));
		applicationService.run(delete);
		return new CdsRestResponseImpl(SC_NO_CONTENT);
	}

	private static ApplicationService findApplicationService(CdsRestRequest request, RequestContext context) {
		ServiceCatalog catalog = context.getServiceCatalog();
		return catalog.getService(ApplicationService.class, request.getService());
	}

	@SuppressWarnings({ "unchecked", "rawtypes" })
	private static Map valueMap(Map queryParams) {
		return (Map)queryParams;
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy