package io.budgetapp.resource;
import io.budgetapp.model.AccountSummary;
import io.budgetapp.model.UsageSummary;
import io.budgetapp.model.User;
import io.budgetapp.model.form.LoginForm;
import io.budgetapp.model.form.SignUpForm;
import io.budgetapp.model.form.user.Password;
import io.budgetapp.model.form.user.Profile;
import io.budgetapp.service.FinanceService;
import io.dropwizard.auth.Auth;
import io.dropwizard.hibernate.UnitOfWork;
import javax.validation.Valid;
import javax.ws.rs.Consumes;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import java.util.Optional;
/**
*
*/
@Path(ResourceURL.USER)
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public class UserResource extends AbstractResource {
private final FinanceService financeService;
public UserResource(FinanceService financeService) {
this.financeService = financeService;
}
@Override
public String getPath() {
return ResourceURL.USER;
}
@POST
@UnitOfWork
public Response add(@Valid SignUpForm signUp) {
User user = financeService.addUser(signUp);
return created(user, user.getId());
}
@PUT
@UnitOfWork
public Response update(@Auth User user, Profile profile) {
return ok(financeService.update(user, profile));
}
@PUT
@UnitOfWork
@Path("/password")
public Response changePassword(@Auth User user, @Valid Password password) {
financeService.changePassword(user, password);
return ok();
}
@GET
@UnitOfWork
@Path("/account")
public AccountSummary findAccountSummary(@Auth User user, @QueryParam("month") Integer month, @QueryParam("year") Integer year) {
return financeService.findAccountSummaryByUser(user, month, year);
}
@GET
@UnitOfWork
@Path("/usage")
public UsageSummary findUsageSummary(@Auth User user, @QueryParam("month") Integer month, @QueryParam("year") Integer year) {
return financeService.findUsageSummaryByUser(user, month, year);
}
@POST
@UnitOfWork
@Path("/auth")
public Response login(LoginForm login) {
Optional<User> user = financeService.login(login);
if(user.isPresent()) {
return ok(user.get());
} else {
return unauthorized();
}
}
/**
* return current user
*/
@GET
@UnitOfWork
@Path("/ping")
public Response ping(@Auth User user) {
if(user != null) {
return ok(user);
} else {
return unauthorized();
}
}
}