Skip to content
Snippets Groups Projects
Commit 0af3fc8a authored by JerichoFletcher's avatar JerichoFletcher
Browse files

feat: subscription pagination

parent 3615ee9b
Branches
Tags
No related merge requests found
...@@ -4,10 +4,8 @@ import com.bnmoboxd.middlewares.AuthMiddleware; ...@@ -4,10 +4,8 @@ import com.bnmoboxd.middlewares.AuthMiddleware;
import com.bnmoboxd.models.Subscription; import com.bnmoboxd.models.Subscription;
import com.bnmoboxd.repositories.SubscriptionRepository; import com.bnmoboxd.repositories.SubscriptionRepository;
import com.bnmoboxd.services.SubscriptionService; import com.bnmoboxd.services.SubscriptionService;
import com.bnmoboxd.struct.ApiResponse; import com.bnmoboxd.struct.Pagination;
import com.bnmoboxd.struct.ResponseStatus;
import com.bnmoboxd.struct.SubscriptionStatus; import com.bnmoboxd.struct.SubscriptionStatus;
import com.sun.org.apache.xpath.internal.operations.Bool;
import javax.annotation.Resource; import javax.annotation.Resource;
import javax.jws.*; import javax.jws.*;
...@@ -18,21 +16,26 @@ import java.util.List; ...@@ -18,21 +16,26 @@ import java.util.List;
@WebService @WebService
public class SubscriptionController { public class SubscriptionController {
private final SubscriptionService subscriptionService; private final SubscriptionService subscriptionService;
private final SubscriptionRepository subscriptionRepository;
@Resource @Resource
private WebServiceContext serviceContext; private WebServiceContext serviceContext;
// TODO: Logging // TODO: Logging
public SubscriptionController() { public SubscriptionController() {
subscriptionService = new SubscriptionService(); subscriptionService = new SubscriptionService();
subscriptionRepository = new SubscriptionRepository();
} }
@WebMethod(operationName = "getAll") @WebMethod(operationName = "getAll")
@WebResult(name = "response") @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()) { 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 { } else {
return null; return null;
} }
...@@ -45,8 +48,12 @@ public class SubscriptionController { ...@@ -45,8 +48,12 @@ public class SubscriptionController {
@XmlElement(required = true) @XmlElement(required = true)
String curatorUsername String curatorUsername
) { ) {
if(new AuthMiddleware(serviceContext).execute()) { if(new AuthMiddleware(serviceContext).execute() && curatorUsername != null) {
return subscriptionRepository.getAcceptedSubscriptions(curatorUsername).size(); return subscriptionService.getSubscriptions(new SubscriptionRepository.Filter(
curatorUsername,
null,
SubscriptionStatus.ACCEPTED
)).size();
} else { } else {
return null; return null;
} }
...@@ -67,8 +74,16 @@ public class SubscriptionController { ...@@ -67,8 +74,16 @@ public class SubscriptionController {
@XmlElement(required = true) @XmlElement(required = true)
String status String status
) { ) {
if(new AuthMiddleware(serviceContext).execute()) { if(new AuthMiddleware(serviceContext).execute()
return subscriptionRepository.addSubscription(new Subscription(curatorUsername, subscriberUsername, SubscriptionStatus.valueOf(status))); && curatorUsername != null
&& subscriberUsername != null
&& status != null
) {
return subscriptionService.addSubscription(
curatorUsername,
subscriberUsername,
SubscriptionStatus.valueOf(status)
);
} else { } else {
return null; return null;
} }
...@@ -89,8 +104,22 @@ public class SubscriptionController { ...@@ -89,8 +104,22 @@ public class SubscriptionController {
@XmlElement(required = true) @XmlElement(required = true)
String status String status
) { ) {
if(new AuthMiddleware(serviceContext).execute()) { if(new AuthMiddleware(serviceContext).execute()
return subscriptionRepository.updateSubscriptionStatus(new Subscription(curatorUsername, subscriberUsername, SubscriptionStatus.valueOf(status))); && 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 { } else {
return null; return null;
} }
......
...@@ -2,7 +2,10 @@ package com.bnmoboxd.repositories; ...@@ -2,7 +2,10 @@ package com.bnmoboxd.repositories;
import com.bnmoboxd.database.Database; import com.bnmoboxd.database.Database;
import com.bnmoboxd.models.Subscription; import com.bnmoboxd.models.Subscription;
import com.bnmoboxd.struct.Pagination;
import com.bnmoboxd.struct.SubscriptionStatus; import com.bnmoboxd.struct.SubscriptionStatus;
import lombok.Getter;
import org.jetbrains.annotations.Nullable;
import java.sql.Connection; import java.sql.Connection;
import java.sql.PreparedStatement; import java.sql.PreparedStatement;
...@@ -12,36 +15,38 @@ import java.util.ArrayList; ...@@ -12,36 +15,38 @@ import java.util.ArrayList;
import java.util.List; import java.util.List;
public class SubscriptionRepository { public class SubscriptionRepository {
public List<Subscription> getAllSubscriptions() { public List<Subscription> getSubscriptions(Filter filter, Pagination pagination) {
try(Connection connection = Database.getConnection()) { try(Connection connection = Database.getConnection()) {
String query = "SELECT * FROM subscriptions";
List<Subscription> subscriptions = new ArrayList<>(); List<Subscription> subscriptions = new ArrayList<>();
try(PreparedStatement statement = connection.prepareStatement(query); StringBuilder query = new StringBuilder("SELECT * FROM subscriptions");
ResultSet resultSet = statement.executeQuery()) { List<String> params = new ArrayList<>();
while(resultSet.next()) { if(filter != null) {
String curatorUsername = resultSet.getString("curator_username"); if(filter.getCuratorUsername() != null) {
String subscriberUsername = resultSet.getString("subscriber_username"); query.append(String.format(" %s curator_username = ?", "WHERE"));
String status = resultSet.getString("status"); params.add(filter.getCuratorUsername());
}
Subscription subscription = new Subscription(curatorUsername, subscriberUsername, SubscriptionStatus.valueOf(status)); if(filter.getSubscriberUsername() != null) {
subscriptions.add(subscription); 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; if(pagination != null) query.append(" LIMIT ? OFFSET ?");
} catch(SQLException e) {
e.printStackTrace();
return null;
}
}
public List<Subscription> getAcceptedSubscriptions(String subCuratorUsername) { try(PreparedStatement statement = connection.prepareStatement(query.toString())) {
try(Connection connection = Database.getConnection()) { for(int i = 0; i < params.size(); i++) {
String query = "SELECT * FROM subscriptions WHERE curator_username = ? AND status = 'ACCEPTED'"; statement.setString(i + 1, params.get(i));
List<Subscription> subscriptions = new ArrayList<>(); }
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()) { try(ResultSet resultSet = statement.executeQuery()) {
while(resultSet.next()) { while(resultSet.next()) {
String curatorUsername = resultSet.getString("curator_username"); String curatorUsername = resultSet.getString("curator_username");
...@@ -79,7 +84,7 @@ public class SubscriptionRepository { ...@@ -79,7 +84,7 @@ public class SubscriptionRepository {
} }
} }
public boolean updateSubscriptionStatus(Subscription subscription) { public boolean updateSubscription(Subscription subscription) {
try(Connection connection = Database.getConnection()) { try(Connection connection = Database.getConnection()) {
String query = "UPDATE subscriptions SET status = ? WHERE curator_username = ? AND subscriber_username = ?"; String query = "UPDATE subscriptions SET status = ? WHERE curator_username = ? AND subscriber_username = ?";
...@@ -96,4 +101,23 @@ public class SubscriptionRepository { ...@@ -96,4 +101,23 @@ public class SubscriptionRepository {
return false; 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;
}
} }
...@@ -2,6 +2,8 @@ package com.bnmoboxd.services; ...@@ -2,6 +2,8 @@ package com.bnmoboxd.services;
import com.bnmoboxd.models.Subscription; import com.bnmoboxd.models.Subscription;
import com.bnmoboxd.repositories.SubscriptionRepository; import com.bnmoboxd.repositories.SubscriptionRepository;
import com.bnmoboxd.struct.Pagination;
import com.bnmoboxd.struct.SubscriptionStatus;
import java.util.List; import java.util.List;
...@@ -12,7 +14,27 @@ public class SubscriptionService { ...@@ -12,7 +14,27 @@ public class SubscriptionService {
subscriptionRepository = new SubscriptionRepository(); subscriptionRepository = new SubscriptionRepository();
} }
public List<Subscription> getAllSubscriptions() { public List<Subscription> getSubscriptions(SubscriptionRepository.Filter filter) {
return subscriptionRepository.getAllSubscriptions(); 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
));
} }
} }
...@@ -6,6 +6,7 @@ import lombok.NoArgsConstructor; ...@@ -6,6 +6,7 @@ import lombok.NoArgsConstructor;
import javax.xml.bind.annotation.*; import javax.xml.bind.annotation.*;
// TODO: Either use or remove ApiResponse
@Getter @Getter
@AllArgsConstructor @AllArgsConstructor
@NoArgsConstructor @NoArgsConstructor
......
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;
}
...@@ -2,6 +2,7 @@ package com.bnmoboxd.struct; ...@@ -2,6 +2,7 @@ package com.bnmoboxd.struct;
import javax.xml.bind.annotation.XmlEnum; import javax.xml.bind.annotation.XmlEnum;
// TODO: Either use or remove ResponseStatus
@XmlEnum @XmlEnum
public enum ResponseStatus { public enum ResponseStatus {
SUCCESS, SUCCESS,
......
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment