diff --git a/src/main/java/com/bnmoboxd/controllers/SubscriptionController.java b/src/main/java/com/bnmoboxd/controllers/SubscriptionController.java index b0f349398fe83c322e0e5b926943a91270aa44f9..2b53687e234dd0646e749309486528f1fbda22f4 100644 --- a/src/main/java/com/bnmoboxd/controllers/SubscriptionController.java +++ b/src/main/java/com/bnmoboxd/controllers/SubscriptionController.java @@ -4,10 +4,8 @@ import com.bnmoboxd.middlewares.AuthMiddleware; import com.bnmoboxd.models.Subscription; import com.bnmoboxd.repositories.SubscriptionRepository; import com.bnmoboxd.services.SubscriptionService; -import com.bnmoboxd.struct.ApiResponse; -import com.bnmoboxd.struct.ResponseStatus; +import com.bnmoboxd.struct.Pagination; import com.bnmoboxd.struct.SubscriptionStatus; -import com.sun.org.apache.xpath.internal.operations.Bool; import javax.annotation.Resource; import javax.jws.*; @@ -18,21 +16,26 @@ import java.util.List; @WebService public class SubscriptionController { private final SubscriptionService subscriptionService; - private final SubscriptionRepository subscriptionRepository; @Resource private WebServiceContext serviceContext; // TODO: Logging public SubscriptionController() { subscriptionService = new SubscriptionService(); - subscriptionRepository = new SubscriptionRepository(); } @WebMethod(operationName = "getAll") @WebResult(name = "response") - public List<Subscription> getAll() { + public List<Subscription> getAll( + @WebParam(name = "page") + Integer page, + + @WebParam(name = "take") + Integer take + ) { if(new AuthMiddleware(serviceContext).execute()) { - return subscriptionService.getAllSubscriptions(); + Pagination pagination = page != null && take != null ? new Pagination(page, take) : null; + return subscriptionService.getSubscriptions(null, pagination); } else { return null; } @@ -45,8 +48,12 @@ public class SubscriptionController { @XmlElement(required = true) String curatorUsername ) { - if(new AuthMiddleware(serviceContext).execute()) { - return subscriptionRepository.getAcceptedSubscriptions(curatorUsername).size(); + if(new AuthMiddleware(serviceContext).execute() && curatorUsername != null) { + return subscriptionService.getSubscriptions(new SubscriptionRepository.Filter( + curatorUsername, + null, + SubscriptionStatus.ACCEPTED + )).size(); } else { return null; } @@ -67,8 +74,16 @@ public class SubscriptionController { @XmlElement(required = true) String status ) { - if(new AuthMiddleware(serviceContext).execute()) { - return subscriptionRepository.addSubscription(new Subscription(curatorUsername, subscriberUsername, SubscriptionStatus.valueOf(status))); + if(new AuthMiddleware(serviceContext).execute() + && curatorUsername != null + && subscriberUsername != null + && status != null + ) { + return subscriptionService.addSubscription( + curatorUsername, + subscriberUsername, + SubscriptionStatus.valueOf(status) + ); } else { return null; } @@ -89,8 +104,22 @@ public class SubscriptionController { @XmlElement(required = true) String status ) { - if(new AuthMiddleware(serviceContext).execute()) { - return subscriptionRepository.updateSubscriptionStatus(new Subscription(curatorUsername, subscriberUsername, SubscriptionStatus.valueOf(status))); + if(new AuthMiddleware(serviceContext).execute() + && curatorUsername != null + && subscriberUsername != null + && status != null + ) { + try { + SubscriptionStatus newStatus = SubscriptionStatus.valueOf(status); + return subscriptionService.updateSubscription( + curatorUsername, + subscriberUsername, + newStatus + ); + } catch(IllegalArgumentException e) { + e.printStackTrace(); + return null; + } } else { return null; } diff --git a/src/main/java/com/bnmoboxd/repositories/SubscriptionRepository.java b/src/main/java/com/bnmoboxd/repositories/SubscriptionRepository.java index c548463b8af1b53a5a7af2d493cb85a4ab954949..ca4ab1ded6cb587f31a909c12ecb0b01ced4a1a0 100644 --- a/src/main/java/com/bnmoboxd/repositories/SubscriptionRepository.java +++ b/src/main/java/com/bnmoboxd/repositories/SubscriptionRepository.java @@ -2,7 +2,10 @@ package com.bnmoboxd.repositories; import com.bnmoboxd.database.Database; import com.bnmoboxd.models.Subscription; +import com.bnmoboxd.struct.Pagination; import com.bnmoboxd.struct.SubscriptionStatus; +import lombok.Getter; +import org.jetbrains.annotations.Nullable; import java.sql.Connection; import java.sql.PreparedStatement; @@ -12,36 +15,38 @@ import java.util.ArrayList; import java.util.List; public class SubscriptionRepository { - public List<Subscription> getAllSubscriptions() { + public List<Subscription> getSubscriptions(Filter filter, Pagination pagination) { try(Connection connection = Database.getConnection()) { - String query = "SELECT * FROM subscriptions"; List<Subscription> subscriptions = new ArrayList<>(); - try(PreparedStatement statement = connection.prepareStatement(query); - ResultSet resultSet = statement.executeQuery()) { - while(resultSet.next()) { - String curatorUsername = resultSet.getString("curator_username"); - String subscriberUsername = resultSet.getString("subscriber_username"); - String status = resultSet.getString("status"); - - Subscription subscription = new Subscription(curatorUsername, subscriberUsername, SubscriptionStatus.valueOf(status)); - subscriptions.add(subscription); + StringBuilder query = new StringBuilder("SELECT * FROM subscriptions"); + List<String> params = new ArrayList<>(); + if(filter != null) { + if(filter.getCuratorUsername() != null) { + query.append(String.format(" %s curator_username = ?", "WHERE")); + params.add(filter.getCuratorUsername()); + } + if(filter.getSubscriberUsername() != null) { + query.append(String.format(" %s subscriber_username = ?", params.isEmpty() ? "WHERE" : "AND")); + params.add(filter.getSubscriberUsername()); + } + if(filter.getStatus() != null) { + query.append(String.format(" %s status = ?", params.isEmpty() ? "WHERE" : "AND")); + params.add(filter.getStatus().toString()); } } - return subscriptions; - } catch(SQLException e) { - e.printStackTrace(); - return null; - } - } + if(pagination != null) query.append(" LIMIT ? OFFSET ?"); - public List<Subscription> getAcceptedSubscriptions(String subCuratorUsername) { - try(Connection connection = Database.getConnection()) { - String query = "SELECT * FROM subscriptions WHERE curator_username = ? AND status = 'ACCEPTED'"; - List<Subscription> subscriptions = new ArrayList<>(); + try(PreparedStatement statement = connection.prepareStatement(query.toString())) { + for(int i = 0; i < params.size(); i++) { + statement.setString(i + 1, params.get(i)); + } + if(pagination != null) { + int skip = pagination.getTake() * (pagination.getPage() - 1); + statement.setInt(params.size() + 1, pagination.getTake()); + statement.setInt(params.size() + 2, skip); + } - try(PreparedStatement statement = connection.prepareStatement(query)) { - statement.setString(1, subCuratorUsername); try(ResultSet resultSet = statement.executeQuery()) { while(resultSet.next()) { String curatorUsername = resultSet.getString("curator_username"); @@ -79,7 +84,7 @@ public class SubscriptionRepository { } } - public boolean updateSubscriptionStatus(Subscription subscription) { + public boolean updateSubscription(Subscription subscription) { try(Connection connection = Database.getConnection()) { String query = "UPDATE subscriptions SET status = ? WHERE curator_username = ? AND subscriber_username = ?"; @@ -96,4 +101,23 @@ public class SubscriptionRepository { return false; } } + + @Getter + public static class Filter { + public Filter(String curatorUsername, String subscriberUsername, String status) { + this.curatorUsername = curatorUsername; + this.subscriberUsername = subscriberUsername; + this.status = status != null ? SubscriptionStatus.valueOf(status) : null; + } + + public Filter(String curatorUsername, String subscriberUsername, @Nullable SubscriptionStatus status) { + this.curatorUsername = curatorUsername; + this.subscriberUsername = subscriberUsername; + this.status = status; + } + + private final String curatorUsername; + private final String subscriberUsername; + private final @Nullable SubscriptionStatus status; + } } diff --git a/src/main/java/com/bnmoboxd/services/SubscriptionService.java b/src/main/java/com/bnmoboxd/services/SubscriptionService.java index 28b4dd77d55c6027102d706348bbd23697254712..3e00b5c861bf8df6f80ad00cfb7949cf10b076c3 100644 --- a/src/main/java/com/bnmoboxd/services/SubscriptionService.java +++ b/src/main/java/com/bnmoboxd/services/SubscriptionService.java @@ -2,6 +2,8 @@ package com.bnmoboxd.services; import com.bnmoboxd.models.Subscription; import com.bnmoboxd.repositories.SubscriptionRepository; +import com.bnmoboxd.struct.Pagination; +import com.bnmoboxd.struct.SubscriptionStatus; import java.util.List; @@ -12,7 +14,27 @@ public class SubscriptionService { subscriptionRepository = new SubscriptionRepository(); } - public List<Subscription> getAllSubscriptions() { - return subscriptionRepository.getAllSubscriptions(); + public List<Subscription> getSubscriptions(SubscriptionRepository.Filter filter) { + return subscriptionRepository.getSubscriptions(filter, null); + } + + public List<Subscription> getSubscriptions(SubscriptionRepository.Filter filter, Pagination pagination) { + return subscriptionRepository.getSubscriptions(filter, pagination); + } + + public boolean addSubscription(String curatorUsername, String subscriberUsername, SubscriptionStatus status) { + return subscriptionRepository.addSubscription(new Subscription( + curatorUsername, + subscriberUsername, + status + )); + } + + public boolean updateSubscription(String curatorUsername, String subscriberUsername, SubscriptionStatus status) { + return subscriptionRepository.updateSubscription(new Subscription( + curatorUsername, + subscriberUsername, + status + )); } } diff --git a/src/main/java/com/bnmoboxd/struct/ApiResponse.java b/src/main/java/com/bnmoboxd/struct/ApiResponse.java index ed16907e54a189f55f76a3fd008a26e0bbce8700..456a8c3354fddd7bda97973bfa7740b7d4a7d379 100644 --- a/src/main/java/com/bnmoboxd/struct/ApiResponse.java +++ b/src/main/java/com/bnmoboxd/struct/ApiResponse.java @@ -6,6 +6,7 @@ import lombok.NoArgsConstructor; import javax.xml.bind.annotation.*; +// TODO: Either use or remove ApiResponse @Getter @AllArgsConstructor @NoArgsConstructor diff --git a/src/main/java/com/bnmoboxd/struct/Pagination.java b/src/main/java/com/bnmoboxd/struct/Pagination.java new file mode 100644 index 0000000000000000000000000000000000000000..31e79e30d5caade727d96f4365d54965b4b1d59e --- /dev/null +++ b/src/main/java/com/bnmoboxd/struct/Pagination.java @@ -0,0 +1,14 @@ +package com.bnmoboxd.struct; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import javax.xml.bind.annotation.XmlRootElement; + +@Getter +@AllArgsConstructor +public class Pagination { + private int page; + private int take; +} diff --git a/src/main/java/com/bnmoboxd/struct/ResponseStatus.java b/src/main/java/com/bnmoboxd/struct/ResponseStatus.java index bda5b7c85b58cb7a48832ff743f1e846d1005757..66e4d7d516742eca966486ef4d6a0557447ae38e 100644 --- a/src/main/java/com/bnmoboxd/struct/ResponseStatus.java +++ b/src/main/java/com/bnmoboxd/struct/ResponseStatus.java @@ -2,6 +2,7 @@ package com.bnmoboxd.struct; import javax.xml.bind.annotation.XmlEnum; +// TODO: Either use or remove ResponseStatus @XmlEnum public enum ResponseStatus { SUCCESS,