ActivityController.java

package com.oracle.interview.resources;

import com.codahale.metrics.annotation.Timed;
import com.oracle.interview.db.ActivityRepository;
import com.oracle.interview.db.entity.Activity;
import com.oracle.interview.db.entity.User;
import io.dropwizard.auth.Auth;
import io.dropwizard.hibernate.UnitOfWork;
import io.swagger.annotations.*;

import javax.annotation.security.PermitAll;
import javax.annotation.security.RolesAllowed;
import javax.ws.rs.*;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import java.net.URI;
import java.util.List;
import java.util.Optional;

import static com.oracle.interview.auth.SimpleDatabaseAuthenticator.GUEST_USER;

@Path("/activity")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
@Api(value = "ActivityController")
public class ActivityController {

    private final ActivityRepository repository;

    public ActivityController(ActivityRepository repository) {
        this.repository = repository;
    }


    @ApiOperation(value = "Add a new activity ", response = Activity.class, tags = "ActivityController")
    @ApiResponses(value = {
            @ApiResponse(code = 201, message = "Created"),
            @ApiResponse(code = 500, message = "In case of error"),
    })
    @POST
    @Timed
    @UnitOfWork
    public Response add(@ApiParam(name = "user", hidden = true) @Auth Optional<User> user, Activity activity) {
        activity.setUser(user.orElse(GUEST_USER));
        Activity a = repository.addActivity(activity);
        return Response.created(URI.create("/activity/" + a.getId())).entity(a).build();
    }

    @ApiOperation(value = "Get the list of all activities ", response = Iterable.class, tags = "ActivityController")
    @ApiResponses(value = {
            @ApiResponse(code = 200, message = "Success|OK"),
            @ApiResponse(code = 204, message = "No content if no activities are found"),
            @ApiResponse(code = 500, message = "In case of error")
    })
    @GET
    @Timed
    @UnitOfWork
    public Response activities(@ApiParam(name = "user", hidden = true) @Auth Optional<User> user) {
        Optional<List<Activity>> activities = repository.getActivities(user.orElse(GUEST_USER));
        if (!activities.isPresent()) {
            return Response.status(Response.Status.NO_CONTENT).build();
        }
        return Response.ok().entity(activities).build();
    }

    @ApiOperation(value = "Get a single activity ", response = Activity.class, tags = "ActivityController")
    @ApiResponses(value = {
            @ApiResponse(code = 200, message = "Success|OK", response = Activity.class),
            @ApiResponse(code = 404, message = "Not found"),
            @ApiResponse(code = 500, message = "In case of error") })
    @GET
    @Path("/{id}")
    @UnitOfWork
    public Response activity(@PathParam("id") String id) {
        Optional<Activity> activity = repository.getActivityById(id);
        if (!activity.isPresent()) {
            return  Response.status(Response.Status.NOT_FOUND).build();
        }
        return Response.ok().entity(activity).build();
    }


    @ApiOperation(value = "Remove a single activity ", response = Activity.class, tags = "ActivityController")
    @ApiResponses(value = {
            @ApiResponse(code = 200, message = "Success|OK", response = Activity.class),
            @ApiResponse(code = 404, message = "Not found"),
            @ApiResponse(code = 500, message = "In case of error") })
    @DELETE
    @Path("/{id}")
    @UnitOfWork
    public Response remove(@PathParam("id") String id) {
        Optional<Activity> activity = repository.removeById(id);
        if (!activity.isPresent()) {
            return  Response.status(Response.Status.NOT_FOUND).build();
        }
        return Response.status(Response.Status.OK).entity(activity.get()).build();
    }


    @ApiOperation(value = "Remove all activities", response = Activity.class, tags = "ActivityController")
    @ApiResponses(value = {
            @ApiResponse(code = 200, message = "Success|OK: number of deleter activities", response = Integer.class),
            @ApiResponse(code = 500, message = "In case of error") })
    @DELETE
    @UnitOfWork
    @RolesAllowed("AUTHENTICATED")
    public Response removeAll() {
        int entity = repository.removeAll();
        return Response.status(Response.Status.OK).entity(entity).build();
    }


    @ApiOperation(value = "Edit a single activity ", response = Activity.class, tags = "ActivityController")
    @ApiResponses(value = {
            @ApiResponse(code = 200, message = "Success|OK", response = Activity.class),
            @ApiResponse(code = 404, message = "Not found"),
            @ApiResponse(code = 500, message = "In case of error") })
    @PUT
    @UnitOfWork
    public Response edit(@ApiParam(name = "user", hidden = true) @Auth Optional<User> user, Activity activity){
        activity.setUser(user.orElse(GUEST_USER));
        Optional<Activity> a = repository.editActivity(activity);
        if (!a.isPresent()) {
            return  Response.status(Response.Status.NOT_FOUND).build();
        }
        return Response.ok().entity(a.get()).build();

    }


}