package io.budgetapp.resource; import io.budgetapp.model.Budget; import io.budgetapp.model.Transaction; import io.budgetapp.model.User; import io.budgetapp.model.form.budget.AddBudgetForm; import io.budgetapp.model.form.budget.UpdateBudgetForm; 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.DELETE; import javax.ws.rs.GET; import javax.ws.rs.POST; import javax.ws.rs.PUT; import javax.ws.rs.Path; import javax.ws.rs.PathParam; 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.List; /** * */ @Path(ResourceURL.BUDGET) @Produces(MediaType.APPLICATION_JSON) @Consumes(MediaType.APPLICATION_JSON) public class BudgetResource extends AbstractResource { private final FinanceService financeService; public BudgetResource(FinanceService financeService) { this.financeService = financeService; } @Override public String getPath() { return ResourceURL.BUDGET; } @GET @UnitOfWork public List<Budget> getBudgets(@Auth User user) { return financeService.findBudgetsByUser(user); } @POST @UnitOfWork public Response add(@Auth User user, @Valid AddBudgetForm budgetForm) { Budget budget = financeService.addBudget(user, budgetForm); return created(budget, budget.getId()); } @PUT @UnitOfWork @Path("/{id}") public Response update(@Auth User user, @PathParam("id") long id, @Valid UpdateBudgetForm budgetForm) { budgetForm.setId(id); Budget budget = financeService.updateBudget(user, budgetForm); return ok(budget); } @DELETE @UnitOfWork @Path("/{id}") public Response delete(@Auth User user, @PathParam("id") long id) { financeService.deleteBudget(user, id); return deleted(); } @GET @UnitOfWork @Path("/{id}") public Budget findById(@Auth User user, @PathParam("id") long id) { return financeService.findBudgetById(user, id); } @GET @UnitOfWork @Path("/{id}/transactions") public List<Transaction> findTransactions(@Auth User user, @PathParam("id") long id) { return financeService.findTransactionsByBudget(user, id); } @GET @UnitOfWork @Path("/suggests") public List<String> findSuggestion(@Auth User user, @QueryParam("q") String q) { return financeService.findBudgetSuggestions(user, q); } }