English content
This commit is contained in:
parent
a2c1e11f56
commit
be480ead88
10
API/src/main/java/me/braydon/profanity/common/Language.java
Normal file
10
API/src/main/java/me/braydon/profanity/common/Language.java
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
package me.braydon.profanity.common;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A list of supported languages.
|
||||||
|
*
|
||||||
|
* @author Braydon
|
||||||
|
*/
|
||||||
|
public enum Language {
|
||||||
|
ENGLISH
|
||||||
|
}
|
@ -0,0 +1,48 @@
|
|||||||
|
package me.braydon.profanity.controller;
|
||||||
|
|
||||||
|
import lombok.NonNull;
|
||||||
|
import me.braydon.profanity.exception.impl.BadRequestException;
|
||||||
|
import me.braydon.profanity.model.input.ContentProcessInput;
|
||||||
|
import me.braydon.profanity.model.response.ContentProcessResponse;
|
||||||
|
import me.braydon.profanity.service.FiltrationService;
|
||||||
|
import me.braydon.profanity.service.ModerationService;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.http.MediaType;
|
||||||
|
import org.springframework.http.ResponseEntity;
|
||||||
|
import org.springframework.web.bind.annotation.PostMapping;
|
||||||
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
|
import org.springframework.web.bind.annotation.ResponseBody;
|
||||||
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Braydon
|
||||||
|
*/
|
||||||
|
@RestController
|
||||||
|
@RequestMapping(value = "/content", produces = MediaType.APPLICATION_JSON_VALUE)
|
||||||
|
public final class ContentController {
|
||||||
|
/**
|
||||||
|
* The filtration service to use.
|
||||||
|
*/
|
||||||
|
@NonNull private final FiltrationService filtrationService;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The moderation service to use.
|
||||||
|
*/
|
||||||
|
@NonNull private final ModerationService moderationService;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
public ContentController(@NonNull FiltrationService filtrationService, @NonNull ModerationService moderationService) {
|
||||||
|
this.filtrationService = filtrationService;
|
||||||
|
this.moderationService = moderationService;
|
||||||
|
}
|
||||||
|
|
||||||
|
@PostMapping(path = "/process") @ResponseBody @NonNull
|
||||||
|
public ResponseEntity<ContentProcessResponse> process(ContentProcessInput input) throws BadRequestException {
|
||||||
|
if (input == null || (input.isMalformed())) { // Validate the input
|
||||||
|
throw new BadRequestException("Missing or malformed input.");
|
||||||
|
}
|
||||||
|
ContentProcessResponse response = filtrationService.process(input); // Filter the content
|
||||||
|
moderationService.handleAlerts(response); // Handle moderation
|
||||||
|
return ResponseEntity.ok(response);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,38 @@
|
|||||||
|
package me.braydon.profanity.exception;
|
||||||
|
|
||||||
|
import jakarta.servlet.http.HttpServletRequest;
|
||||||
|
import lombok.NonNull;
|
||||||
|
import me.braydon.profanity.model.response.ErrorResponse;
|
||||||
|
import org.springframework.boot.autoconfigure.web.servlet.error.AbstractErrorController;
|
||||||
|
import org.springframework.boot.web.error.ErrorAttributeOptions;
|
||||||
|
import org.springframework.boot.web.servlet.error.ErrorAttributes;
|
||||||
|
import org.springframework.http.HttpStatus;
|
||||||
|
import org.springframework.http.MediaType;
|
||||||
|
import org.springframework.http.ResponseEntity;
|
||||||
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
|
import org.springframework.web.bind.annotation.ResponseBody;
|
||||||
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The route to handle errors for this app.
|
||||||
|
*
|
||||||
|
* @author Braydon
|
||||||
|
*/
|
||||||
|
@RestController
|
||||||
|
@RequestMapping(value = "/error", produces = MediaType.APPLICATION_JSON_VALUE)
|
||||||
|
public final class ExceptionController extends AbstractErrorController {
|
||||||
|
public ExceptionController(@NonNull ErrorAttributes errorAttributes) {
|
||||||
|
super(errorAttributes);
|
||||||
|
}
|
||||||
|
|
||||||
|
@RequestMapping @ResponseBody @NonNull
|
||||||
|
public ResponseEntity<ErrorResponse> onError(@NonNull HttpServletRequest request) {
|
||||||
|
Map<String, Object> error = getErrorAttributes(request, ErrorAttributeOptions.of(
|
||||||
|
ErrorAttributeOptions.Include.MESSAGE
|
||||||
|
));
|
||||||
|
HttpStatus status = getStatus(request); // The status code
|
||||||
|
return new ResponseEntity<>(new ErrorResponse(status, (String) error.get("message")), status);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,18 @@
|
|||||||
|
package me.braydon.profanity.exception.impl;
|
||||||
|
|
||||||
|
import lombok.NonNull;
|
||||||
|
import org.springframework.http.HttpStatus;
|
||||||
|
import org.springframework.web.bind.annotation.ResponseStatus;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This exception is raised
|
||||||
|
* when a bad request is made.
|
||||||
|
*
|
||||||
|
* @author Braydon
|
||||||
|
*/
|
||||||
|
@ResponseStatus(HttpStatus.BAD_REQUEST)
|
||||||
|
public final class BadRequestException extends RuntimeException {
|
||||||
|
public BadRequestException(@NonNull String message) {
|
||||||
|
super(message);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,33 @@
|
|||||||
|
package me.braydon.profanity.model;
|
||||||
|
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Getter;
|
||||||
|
import lombok.NonNull;
|
||||||
|
import me.braydon.profanity.common.Language;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A list of profane words and
|
||||||
|
* phrases for each language.
|
||||||
|
*
|
||||||
|
* @author Braydon
|
||||||
|
*/
|
||||||
|
@AllArgsConstructor @Getter
|
||||||
|
public final class ProfanityList {
|
||||||
|
/**
|
||||||
|
* The links that are whitelisted from the filter.
|
||||||
|
*/
|
||||||
|
@NonNull private final List<String> whitelistedLinks;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Profane words for each language.
|
||||||
|
*/
|
||||||
|
@NonNull private final Map<Language, List<String>> profaneWords;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Profane phrases for each language.
|
||||||
|
*/
|
||||||
|
@NonNull private final Map<Language, List<String>> profanePhrases;
|
||||||
|
}
|
@ -0,0 +1,26 @@
|
|||||||
|
package me.braydon.profanity.model.input;
|
||||||
|
|
||||||
|
import lombok.Getter;
|
||||||
|
import lombok.Setter;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The input to use for processing content.
|
||||||
|
*
|
||||||
|
* @author Braydon
|
||||||
|
*/
|
||||||
|
@Setter @Getter
|
||||||
|
public final class ContentProcessInput {
|
||||||
|
/**
|
||||||
|
* The content to process.
|
||||||
|
*/
|
||||||
|
private String content;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if this input is malformed.
|
||||||
|
*
|
||||||
|
* @return whether the input is malformed
|
||||||
|
*/
|
||||||
|
public boolean isMalformed() {
|
||||||
|
return content == null || content.isEmpty();
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,37 @@
|
|||||||
|
package me.braydon.profanity.model.response;
|
||||||
|
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Getter;
|
||||||
|
import lombok.NonNull;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Braydon
|
||||||
|
*/
|
||||||
|
@AllArgsConstructor @Getter
|
||||||
|
public final class ContentProcessResponse {
|
||||||
|
/**
|
||||||
|
* The replacement for the content.
|
||||||
|
*/
|
||||||
|
@NonNull private final String replacement;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The matched elements in the content.
|
||||||
|
*/
|
||||||
|
@NonNull private final List<String> matched;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The tags obtained from the content.
|
||||||
|
*/
|
||||||
|
@NonNull private final List<String> tags;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The score of the content.
|
||||||
|
* <p>
|
||||||
|
* This is a value from 0-1 representing the
|
||||||
|
* probability that the content is profane.
|
||||||
|
* </p>
|
||||||
|
*/
|
||||||
|
private final double score;
|
||||||
|
}
|
@ -0,0 +1,43 @@
|
|||||||
|
package me.braydon.profanity.model.response;
|
||||||
|
|
||||||
|
import lombok.Getter;
|
||||||
|
import lombok.NonNull;
|
||||||
|
import lombok.ToString;
|
||||||
|
import org.springframework.http.HttpStatus;
|
||||||
|
|
||||||
|
import java.util.Date;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A response representing an error.
|
||||||
|
*
|
||||||
|
* @author Braydon
|
||||||
|
*/
|
||||||
|
@Getter @ToString
|
||||||
|
public class ErrorResponse {
|
||||||
|
/**
|
||||||
|
* The status code of this error.
|
||||||
|
*/
|
||||||
|
@NonNull private final HttpStatus status;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The HTTP code of this error.
|
||||||
|
*/
|
||||||
|
private final int code;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The message of this error.
|
||||||
|
*/
|
||||||
|
@NonNull private final String message;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The timestamp this error occurred.
|
||||||
|
*/
|
||||||
|
@NonNull private final Date timestamp;
|
||||||
|
|
||||||
|
public ErrorResponse(@NonNull HttpStatus status, @NonNull String message) {
|
||||||
|
this.status = status;
|
||||||
|
this.message = message;
|
||||||
|
this.code = status.value();
|
||||||
|
timestamp = new Date();
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,18 @@
|
|||||||
|
package me.braydon.profanity.repository;
|
||||||
|
|
||||||
|
import me.braydon.profanity.model.ProfanityList;
|
||||||
|
import org.springframework.data.mongodb.repository.MongoRepository;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Braydon
|
||||||
|
*/
|
||||||
|
public interface ProfanityListRepository extends MongoRepository<ProfanityList, String> {
|
||||||
|
/**
|
||||||
|
* Get the profanity list.
|
||||||
|
*
|
||||||
|
* @return the profanity list
|
||||||
|
*/
|
||||||
|
default ProfanityList getProfanityList() {
|
||||||
|
return findById("primary").orElse(null);
|
||||||
|
}
|
||||||
|
}
|
@ -1,7 +1,14 @@
|
|||||||
package me.braydon.profanity.service;
|
package me.braydon.profanity.service;
|
||||||
|
|
||||||
|
import lombok.NonNull;
|
||||||
|
import me.braydon.profanity.model.input.ContentProcessInput;
|
||||||
|
import me.braydon.profanity.model.response.ContentProcessResponse;
|
||||||
|
import me.braydon.profanity.repository.ProfanityListRepository;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This service is responsible
|
* This service is responsible
|
||||||
* for filtering text content.
|
* for filtering text content.
|
||||||
@ -9,4 +16,16 @@ import org.springframework.stereotype.Service;
|
|||||||
* @author Braydon
|
* @author Braydon
|
||||||
*/
|
*/
|
||||||
@Service
|
@Service
|
||||||
public final class FiltrationService { }
|
public final class FiltrationService {
|
||||||
|
@NonNull private final ProfanityListRepository profanityListRepository;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
public FiltrationService(@NonNull ProfanityListRepository profanityListRepository) {
|
||||||
|
this.profanityListRepository = profanityListRepository;
|
||||||
|
}
|
||||||
|
|
||||||
|
@NonNull
|
||||||
|
public ContentProcessResponse process(@NonNull ContentProcessInput input) {
|
||||||
|
return new ContentProcessResponse(input.getContent(), new ArrayList<>(), new ArrayList<>(), 0D);
|
||||||
|
}
|
||||||
|
}
|
@ -1,5 +1,7 @@
|
|||||||
package me.braydon.profanity.service;
|
package me.braydon.profanity.service;
|
||||||
|
|
||||||
|
import lombok.NonNull;
|
||||||
|
import me.braydon.profanity.model.response.ContentProcessResponse;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -9,4 +11,8 @@ import org.springframework.stereotype.Service;
|
|||||||
* @author Braydon
|
* @author Braydon
|
||||||
*/
|
*/
|
||||||
@Service
|
@Service
|
||||||
public final class ModerationService { }
|
public final class ModerationService {
|
||||||
|
public void handleAlerts(@NonNull ContentProcessResponse response) {
|
||||||
|
// TODO: handle alerting of the content to the appropriate parties
|
||||||
|
}
|
||||||
|
}
|
2596
lists/english.json
Normal file
2596
lists/english.json
Normal file
File diff suppressed because it is too large
Load Diff
Loading…
x
Reference in New Issue
Block a user