PermissionService.java

package org.europa.together.service.acl;

import java.util.List;
import jakarta.ws.rs.Consumes;
import jakarta.ws.rs.DELETE;
import jakarta.ws.rs.GET;
import jakarta.ws.rs.POST;
import jakarta.ws.rs.PUT;
import jakarta.ws.rs.Path;
import jakarta.ws.rs.PathParam;
import jakarta.ws.rs.Produces;
import jakarta.ws.rs.core.MediaType;
import jakarta.ws.rs.core.Response;
import org.apiguardian.api.API;
import static org.apiguardian.api.API.Status.STABLE;
import org.europa.together.application.LogbackLogger;
import org.europa.together.business.Logger;
import org.europa.together.business.acl.PermissionDAO;
import org.europa.together.business.acl.ResourcesDAO;
import org.europa.together.business.acl.RolesDAO;
import org.europa.together.domain.JpaPagination;
import org.europa.together.domain.LogLevel;
import org.europa.together.domain.acl.PermissionDO;
import org.europa.together.exceptions.JsonProcessingException;
import org.europa.together.utils.acl.Constraints;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

/**
 * RESTful Service for Resources.
 *
 * @author elmar.dott@gmail.com
 * @version 1.0
 * @since 1.0
 */
@Service
@Path("/acl/" + Constraints.REST_API_VERSION + "/permission")
public class PermissionService {

    private static final Logger LOGGER = new LogbackLogger(PermissionService.class);

    @Autowired
    private PermissionDAO permissionDAO;
    @Autowired
    private RolesDAO rolesDAO;
    @Autowired
    private ResourcesDAO resourcesDAO;

    public PermissionService() {
        LOGGER.log("instance class", LogLevel.INFO);
    }

    @GET
    @Path("/{id}")
    @Produces({MediaType.APPLICATION_JSON})
    @API(status = STABLE, since = "1")
    public Response fetchPermission(final @PathParam("id") String permissionId) {
        Response response = null;
        try {
            PermissionDO permission = permissionDAO.find(permissionId);
            String json = permissionDAO.serializeAsJson(permission);
            response = Response.status(Response.Status.OK)
                    .type(MediaType.APPLICATION_JSON)
                    .entity(json)
                    .encoding("UTF-8")
                    .build();

        } catch (Exception ex) {
            String exception = ex.getClass().getSimpleName();
            Response.Status status = Response.Status.INTERNAL_SERVER_ERROR;

            if (exception.equals("EmptyResultDataAccessException")) {
                status = Response.Status.NOT_FOUND;
            }

            LOGGER.log("ERROR CODE " + status.getStatusCode() + " - " + exception, LogLevel.DEBUG);
            response = Response.status(status).build();
        }
        return response;
    }

    @GET
    @Path("/list")
    @Produces({MediaType.APPLICATION_JSON})
    @API(status = STABLE, since = "1")
    public Response fetchAllPermissions() {
        Response response = null;
        try {
            JpaPagination seekElement = new JpaPagination();
            seekElement.setPrimaryKey("uuid");

            List<PermissionDO> permissions = permissionDAO.listAllElements(seekElement);
            String json = objectListToJson(permissions);
            response = Response.status(Response.Status.OK)
                    .type(MediaType.APPLICATION_JSON)
                    .entity(json)
                    .encoding("UTF-8")
                    .build();

        } catch (Exception ex) {
            LOGGER.log("ERROR CODE 500 " + ex.getMessage(), LogLevel.DEBUG);
            response = Response.status(Response.Status.INTERNAL_SERVER_ERROR).build();
        }
        return response;
    }

    @GET
    @Path("/list/forRole/{roleName}")
    @Produces({MediaType.APPLICATION_JSON})
    @API(status = STABLE, since = "1")
    public Response fetchAllPermissionsOfARole(final @PathParam("roleName") String roleName
    ) {
        Response response = null;
        try {
            List<PermissionDO> permissions = permissionDAO.listRolePermissions(roleName);
            if (!permissions.isEmpty()) {
                String json = objectListToJson(permissions);
                response = Response.status(Response.Status.OK)
                        .type(MediaType.APPLICATION_JSON)
                        .entity(json)
                        .encoding("UTF-8")
                        .build();
            } else {
                response = Response.status(Response.Status.NOT_FOUND).build();
            }

        } catch (Exception ex) {
            LOGGER.log("ERROR CODE 500 " + ex.getMessage(), LogLevel.DEBUG);
            response = Response.status(Response.Status.INTERNAL_SERVER_ERROR).build();
        }
        return response;
    }

    @PUT
    @Consumes({MediaType.APPLICATION_JSON})
    @API(status = STABLE, since = "1")
    public Response updatePermission(final PermissionDO permission
    ) {
        Response response = null;
        try {
            permissionDAO.update(permission.getUuid(), permission);
            response = Response.status(Response.Status.ACCEPTED).build();

        } catch (Exception ex) {
            String exception = ex.getClass().getSimpleName();
            Response.Status status = Response.Status.INTERNAL_SERVER_ERROR;

            if (exception.equals("EmptyResultDataAccessException")) {
                status = Response.Status.NOT_FOUND;
            }

            LOGGER.log("ERROR CODE " + status.getStatusCode() + " - " + exception, LogLevel.DEBUG);
            response = Response.status(status).build();
        }
        return response;
    }

    @POST
    @Consumes({MediaType.APPLICATION_JSON})
    @API(status = STABLE, since = "1")
    public Response createPermission(final PermissionDO entity
    ) {
        Response response = null;
        try {
            PermissionDO permission = new PermissionDO(
                    rolesDAO.find(entity.getRole().getName()),
                    resourcesDAO.find(entity.getResource().getName(), entity.getResource().getView())
            );
            permission.setUuid(entity.getUuid());
            permission.setChange(entity.isChange());
            permission.setCreate(entity.isCreate());
            permission.setDelete(entity.isDelete());
            permission.setRead(entity.isRead());

            LOGGER.log("Service: " + permission.getRole().toString(),
                    LogLevel.DEBUG);
            LOGGER.log("Service: " + permission.getResource().toString(),
                    LogLevel.DEBUG);
            LOGGER.log("Service: " + permission.toString(), LogLevel.DEBUG);

            permissionDAO.create(permission);
            response = Response.status(Response.Status.CREATED).build();

        } catch (Exception ex) {
            LOGGER.log("ERROR CODE 500 " + ex.getMessage(), LogLevel.DEBUG);
            if (ex.equals("NullPointerException")) {
                LOGGER.catchException(ex);
            }
            response = Response.status(Response.Status.INTERNAL_SERVER_ERROR).build();
        }
        return response;
    }

    @DELETE
    @Path("/{id}")
    @API(status = STABLE, since = "1")
    public Response deletePermission(final @PathParam("id") String permissionId
    ) {
        Response response = null;
        try {
            PermissionDO selection = permissionDAO.find(permissionId);
            permissionDAO.delete(selection.getUuid());
            response = Response.status(Response.Status.GONE).build();

        } catch (Exception ex) {
            String exception = ex.getClass().getSimpleName();
            Response.Status status = Response.Status.INTERNAL_SERVER_ERROR;

            if (exception.equals("EntityNotFoundException")
                    || exception.equals("EmptyResultDataAccessException")) {
                status = Response.Status.NOT_FOUND;
            }
            if (exception.equals("DataIntegrityViolationException")) {
                status = Response.Status.CONFLICT;
            }

            LOGGER.log("ERROR CODE " + status.getStatusCode() + " - " + exception, LogLevel.DEBUG);
            response = Response.status(status).build();
        }
        return response;
    }
    // #########################################################################

    private String objectListToJson(final List<PermissionDO> permissions)
            throws JsonProcessingException {

        int cnt = 0;
        StringBuilder json = new StringBuilder();
        json.append("[");
        for (PermissionDO permission : permissions) {
            if (cnt != 0) {
                json.append(", \n");
            }
            json.append(permissionDAO.serializeAsJson(permission));
            cnt++;
        }
        json.append("]");
        return json.toString();
    }
}