oglimmer/lunchy

View on GitHub
src/main/java/de/oglimmer/lunchy/rest/resources/OfficeResource.java

Summary

Maintainability
A
0 mins
Test Coverage
package de.oglimmer.lunchy.rest.resources;

import java.util.ArrayList;
import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.ws.rs.Consumes;
import javax.ws.rs.DELETE;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import org.jooq.Record;

import de.oglimmer.lunchy.beanMapping.BeanMappingProvider;
import de.oglimmer.lunchy.database.dao.LocationDao;
import de.oglimmer.lunchy.database.dao.OfficeDao;
import de.oglimmer.lunchy.database.generated.tables.records.OfficesRecord;
import de.oglimmer.lunchy.rest.SessionProvider;
import de.oglimmer.lunchy.rest.dto.LocationQuery;
import de.oglimmer.lunchy.rest.dto.OfficeCreateInput;
import de.oglimmer.lunchy.rest.dto.OfficeResponse;
import de.oglimmer.lunchy.rest.dto.OfficeUpdateInput;
import de.oglimmer.lunchy.security.SecurityProvider;
import de.oglimmer.lunchy.services.CommunityService;

@Path("offices")
public class OfficeResource extends BaseResource {

    @GET
    @Produces(MediaType.APPLICATION_JSON)
    public List<OfficeResponse> queryOffices(@Context HttpServletRequest request) {
        return query(CommunityService.get(request), OfficeResponse.class);
    }

    @GET
    @Produces(MediaType.APPLICATION_JSON)
    @Path("{id}")
    public Response get(@Context HttpServletRequest request, @PathParam("id") int id) {
        return get(request, id, OfficeResponse.class);
    }

    @GET
    @Produces(MediaType.APPLICATION_JSON)
    @Path("defaultOffice")
    public DefaultOfficeResponse getDefaultOffice(@Context HttpServletRequest request) {
        return new DefaultOfficeResponse(true, OfficeDao.INSTANCE.getDefaultOffice(CommunityService.get(request)));
    }

    @GET
    @Produces(MediaType.APPLICATION_JSON)
    @Path("{id}/locations")
    public List<LocationQuery> queryLocations(@Context HttpServletRequest request, @PathParam("id") int id) {
        Integer fkUser = SessionProvider.INSTANCE.getLoggedInUserId(request);
        List<LocationQuery> resultList = new ArrayList<>();
        for (Record rec : LocationDao.INSTANCE.getList(fkUser, id)) {
            resultList.add(LocationQuery.getInstance(rec, CommunityService.get(request)));
        }
        return resultList;
    }

    @POST
    @Produces(MediaType.APPLICATION_JSON)
    @Consumes(MediaType.APPLICATION_JSON)
    public OfficeResponse create(@Context HttpServletRequest request, OfficeCreateInput officeDto) {
        SecurityProvider.INSTANCE.checkAdmin(request);
        return new CreateUpdateLogic(request, officeDto).create();
    }

    @POST
    @Produces(MediaType.APPLICATION_JSON)
    @Consumes(MediaType.APPLICATION_JSON)
    @Path("{id}")
    public OfficeResponse update(@Context HttpServletRequest request, @PathParam("id") int id, OfficeUpdateInput officeDto) {
        SecurityProvider.INSTANCE.checkAdmin(request);
        return new CreateUpdateLogic(request, officeDto).update(id);
    }

    @DELETE
    @Path("{id}")
    public void delete(@Context HttpServletRequest request, @PathParam("id") int id) {
        SecurityProvider.INSTANCE.checkAdmin(request);
        OfficeDao.INSTANCE.delete(id, CommunityService.get(request));
    }

    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    public static class DefaultOfficeResponse {
        private boolean success;
        private Integer defaultOffice;
    }

    @AllArgsConstructor
    class CreateUpdateLogic {

        private HttpServletRequest request;
        private OfficeUpdateInput officeDto;

        public OfficeResponse create() {
            OfficesRecord locationRec = copyDtoToRecord(new OfficesRecord());
            addInitialData(locationRec);
            return updateRec(locationRec);
        }

        public OfficeResponse update(Integer id) {
            OfficesRecord locationRec = copyDtoToRecord(OfficeDao.INSTANCE.getById(id, CommunityService.get(request)));
            return updateRec(locationRec);
        }

        private void addInitialData(OfficesRecord locationRec) {
            locationRec.setFkCommunity(CommunityService.get(request));
            if (locationRec.getCountry() == null) {
                locationRec.setCountry("");
            }
        }

        private OfficesRecord copyDtoToRecord(OfficesRecord locationRec) {
            BeanMappingProvider.INSTANCE.map(officeDto, locationRec);
            return locationRec;
        }

        private OfficeResponse updateRec(OfficesRecord locationRec) {
            OfficeDao.INSTANCE.store(locationRec);
            return BeanMappingProvider.INSTANCE.map(locationRec, OfficeResponse.class);
        }

    }
}