package org.xcolab.client.flagging;
import org.xcolab.client.flagging.exceptions.ReportNotFoundException;
import org.xcolab.client.flagging.exceptions.ReportTargetNotFoundException;
import org.xcolab.client.flagging.pojo.AggregatedReport;
import org.xcolab.client.flagging.pojo.Report;
import org.xcolab.client.flagging.pojo.ReportTarget;
import org.xcolab.client.members.pojo.Member;
import org.xcolab.util.clients.CoLabService;
import org.xcolab.util.enums.flagging.ManagerAction;
import org.xcolab.util.enums.flagging.TargetType;
import org.xcolab.util.http.ServiceRequestUtils;
import org.xcolab.util.http.caching.CacheKeys;
import org.xcolab.util.http.caching.CacheName;
import org.xcolab.util.http.client.RestResource;
import org.xcolab.util.http.client.RestResource1;
import org.xcolab.util.http.client.RestService;
import org.xcolab.util.http.exceptions.EntityNotFoundException;
import java.util.List;
public final class FlaggingClient {
private static final RestService moderationService = new RestService(CoLabService.MODERATION,
ServiceRequestUtils.getNamespace());
private static final RestResource<Report, Long> reportResource = new RestResource1<>(
moderationService, "reports", Report.TYPES);
private static final RestResource<AggregatedReport, Long> aggregatedReportResource = new RestResource1<>(
moderationService, "aggregatedReports", AggregatedReport.TYPES);
private static final RestResource<ReportTarget, Long> reportTargetResource = new RestResource1<>(
moderationService, "reportTargets", ReportTarget.TYPES);
private FlaggingClient() {
}
public static List<Report> listReports(int start, int last) {
return listReports(start, last, null, null, null, null, null);
}
public static List<Report> listReports(int start, int last, Long reporterMemberId,
TargetType targetType, Long targetId, Long targetAdditionalId, Long managerMemberId) {
return reportResource.list()
.addRange(start, last)
.queryParam("sort", "createDate")
.optionalQueryParam("reporterMemberId", reporterMemberId)
.optionalQueryParam("targetType", targetType)
.optionalQueryParam("targetId", targetId)
.optionalQueryParam("targetAdditionalId", targetAdditionalId)
.optionalQueryParam("managerMemberId", managerMemberId)
.execute();
}
public static int countReports(Long reporterMemberId, TargetType targetType, Long targetId,
Long targetAdditionalId, Long managerMemberId) {
return reportResource.count()
.optionalQueryParam("reporterMemberId", reporterMemberId)
.optionalQueryParam("targetType", targetType)
.optionalQueryParam("targetId", targetId)
.optionalQueryParam("targetAdditionalId", targetAdditionalId)
.optionalQueryParam("managerMemberId", managerMemberId)
.execute();
}
public static List<AggregatedReport> listAggregatedReports(int start, int last) {
return aggregatedReportResource.list()
.addRange(start, last)
.queryParam("managerAction", ManagerAction.PENDING)
.queryParam("sort", "firstReportDate")
.execute();
}
public static Report getReport(long reportId) throws ReportNotFoundException {
try {
return reportResource.get(reportId)
.withCache(CacheKeys.of(Report.class, reportId),
CacheName.MISC_REQUEST).executeChecked();
} catch (EntityNotFoundException e) {
throw new ReportNotFoundException(reportId);
}
}
public static boolean updateReport(Report report) {
return reportResource.update(report, report.getReportId()).execute();
}
public static Report createReport(Report report) {
return reportResource.create(report).execute();
}
public static List<ReportTarget> listReportTargets(int start, int last) {
return listReportTargets(start, last, null);
}
public static List<ReportTarget> listReportTargets(TargetType targetType) {
return listReportTargets(0, Integer.MAX_VALUE, targetType);
}
public static List<ReportTarget> listReportTargets(int start, int last, TargetType targetType) {
return reportTargetResource.list()
.addRange(start, last)
.optionalQueryParam("type", targetType)
.withCache(CacheKeys.withClass(ReportTarget.class)
.withParameter("type", targetType).asList(), CacheName.MISC_MEDIUM)
.execute();
}
public static ReportTarget getReportTarget(long reportTargetId)
throws ReportTargetNotFoundException {
try {
return reportTargetResource.get(reportTargetId)
.withCache(CacheKeys.of(ReportTarget.class, reportTargetId),
CacheName.MISC_REQUEST)
.executeChecked();
} catch (EntityNotFoundException e) {
throw new ReportTargetNotFoundException(reportTargetId);
}
}
public static ReportTarget getReportTarget(TargetType type, String reason)
throws ReportTargetNotFoundException {
final ReportTarget reportTarget = reportTargetResource.list()
.queryParam("type", type.name())
.queryParam("reason", reason)
.withCache(CacheKeys.withClass(ReportTarget.class)
.withParameter("type", type.name())
.withParameter("reason", reason).asList(), CacheName.MISC_REQUEST)
.executeWithResult().getFirstIfExists();
if (reportTarget == null) {
throw new ReportTargetNotFoundException(type, reason);
}
return reportTarget;
}
public static boolean updateReportTarget(ReportTarget reportTarget) {
return reportTargetResource.update(reportTarget, reportTarget.getReportTargetId())
.execute();
}
public static boolean deleteReportTarget(long reportTargetId) {
return reportTargetResource.delete(reportTargetId).execute();
}
public static ReportTarget createReportTarget(ReportTarget reportTarget) {
return reportTargetResource.create(reportTarget).execute();
}
public static Report reportProposal(Member reporter, long proposalId, long proposalVersion,
String reason, String comment) {
return report(reporter, proposalId, proposalVersion, TargetType.PROPOSAL, reason, comment);
}
public static Report reportComment(Member reporter, long commentId,
String reason, String comment) {
return report(reporter, commentId, 0L, TargetType.COMMENT, reason, comment);
}
public static Report report(Member reporter, long targetId, Long targetAdditionalId,
TargetType targetType, String reason, String comment) {
Report report = new Report();
report.setReporterMemberId(reporter.getId_());
report.setTargetType(targetType.name());
report.setTargetId(targetId);
report.setTargetAdditionalId(targetAdditionalId);
report.setWeight(reporter.getReportKarma());
report.setReason(reason);
report.setComment(comment);
report.setManagerAction(ManagerAction.PENDING.name());
return createReport(report);
}
public static boolean handleReport(long managerId, ManagerAction managerAction, long reportId) {
return reportResource.service(reportId, "handle", Boolean.class)
.queryParam("managerMemberId", managerId)
.queryParam("managerAction", managerAction)
.post();
}
}