Skip to content

Commit 110d741

Browse files
committed
content moderation restored
1 parent eb960f4 commit 110d741

7 files changed

Lines changed: 423 additions & 0 deletions

File tree

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
package com.cadac.stone_inscription.moderation.client;
2+
3+
import java.security.GeneralSecurityException;
4+
import java.security.SecureRandom;
5+
import java.time.Duration;
6+
import java.util.List;
7+
8+
import javax.net.ssl.HostnameVerifier;
9+
import javax.net.ssl.HttpsURLConnection;
10+
import javax.net.ssl.SSLContext;
11+
import javax.net.ssl.SSLSession;
12+
import javax.net.ssl.TrustManager;
13+
import javax.net.ssl.X509TrustManager;
14+
15+
import org.springframework.core.ParameterizedTypeReference;
16+
import org.springframework.http.HttpEntity;
17+
import org.springframework.http.HttpHeaders;
18+
import org.springframework.http.HttpMethod;
19+
import org.springframework.http.MediaType;
20+
import org.springframework.http.client.SimpleClientHttpRequestFactory;
21+
import org.springframework.stereotype.Component;
22+
import org.springframework.web.client.RestTemplate;
23+
24+
import com.cadac.stone_inscription.moderation.config.ContentModerationProperties;
25+
import com.cadac.stone_inscription.moderation.dto.ContentModerationRequestDto;
26+
27+
@Component
28+
public class N8nModerationClient {
29+
30+
private final ContentModerationProperties properties;
31+
private final RestTemplate restTemplate;
32+
33+
public N8nModerationClient(ContentModerationProperties properties) {
34+
this.properties = properties;
35+
this.restTemplate = buildRestTemplate(properties);
36+
}
37+
38+
public String moderate(ContentModerationRequestDto request) {
39+
HttpHeaders headers = new HttpHeaders();
40+
headers.setContentType(MediaType.APPLICATION_JSON);
41+
42+
return restTemplate.exchange(
43+
properties.getWebhookUrl(),
44+
HttpMethod.POST,
45+
new HttpEntity<>(request, headers),
46+
new ParameterizedTypeReference<String>() {
47+
}).getBody();
48+
}
49+
50+
private RestTemplate buildRestTemplate(ContentModerationProperties properties) {
51+
SimpleClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory();
52+
requestFactory.setConnectTimeout(Duration.ofMillis(properties.getConnectTimeoutMs()));
53+
requestFactory.setReadTimeout(Duration.ofMillis(properties.getReadTimeoutMs()));
54+
55+
if (Boolean.TRUE.equals(properties.getInsecureSsl())) {
56+
configureInsecureSsl();
57+
}
58+
59+
return new RestTemplate(requestFactory);
60+
}
61+
62+
private void configureInsecureSsl() {
63+
try {
64+
TrustManager[] trustAllCerts = new TrustManager[] {
65+
new X509TrustManager() {
66+
@Override
67+
public java.security.cert.X509Certificate[] getAcceptedIssuers() {
68+
return new java.security.cert.X509Certificate[0];
69+
}
70+
71+
@Override
72+
public void checkClientTrusted(java.security.cert.X509Certificate[] chain, String authType) {
73+
}
74+
75+
@Override
76+
public void checkServerTrusted(java.security.cert.X509Certificate[] chain, String authType) {
77+
}
78+
}
79+
};
80+
81+
SSLContext sslContext = SSLContext.getInstance("TLS");
82+
sslContext.init(null, trustAllCerts, new SecureRandom());
83+
HttpsURLConnection.setDefaultSSLSocketFactory(sslContext.getSocketFactory());
84+
HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() {
85+
@Override
86+
public boolean verify(String hostname, SSLSession session) {
87+
return true;
88+
}
89+
});
90+
} catch (GeneralSecurityException ex) {
91+
throw new IllegalStateException("Failed to configure insecure SSL for content moderation", ex);
92+
}
93+
}
94+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package com.cadac.stone_inscription.moderation.config;
2+
3+
import org.springframework.boot.context.properties.ConfigurationProperties;
4+
import org.springframework.stereotype.Component;
5+
6+
import lombok.Getter;
7+
import lombok.Setter;
8+
9+
@Getter
10+
@Setter
11+
@Component
12+
@ConfigurationProperties(prefix = "content.moderation")
13+
public class ContentModerationProperties {
14+
15+
private String webhookUrl;
16+
17+
private Double safeThreshold = 0.7;
18+
19+
private Integer connectTimeoutMs = 5000;
20+
21+
private Integer readTimeoutMs = 10000;
22+
23+
private Boolean insecureSsl = false;
24+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package com.cadac.stone_inscription.moderation.dto;
2+
3+
import com.fasterxml.jackson.annotation.JsonProperty;
4+
5+
import lombok.AllArgsConstructor;
6+
import lombok.Builder;
7+
import lombok.Data;
8+
import lombok.NoArgsConstructor;
9+
10+
@Data
11+
@Builder
12+
@NoArgsConstructor
13+
@AllArgsConstructor
14+
public class ContentModerationRequestDto {
15+
16+
@JsonProperty("title")
17+
private String title;
18+
19+
@JsonProperty("topic")
20+
private String topic;
21+
22+
@JsonProperty("description")
23+
private String description;
24+
}
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
package com.cadac.stone_inscription.moderation.dto;
2+
3+
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
4+
import com.fasterxml.jackson.annotation.JsonProperty;
5+
6+
import lombok.AllArgsConstructor;
7+
import lombok.Builder;
8+
import lombok.Data;
9+
import lombok.NoArgsConstructor;
10+
11+
@Data
12+
@Builder
13+
@NoArgsConstructor
14+
@AllArgsConstructor
15+
@JsonIgnoreProperties(ignoreUnknown = true)
16+
public class ContentModerationResponseDto {
17+
18+
@JsonProperty("timestamp")
19+
private String timestamp;
20+
21+
@JsonProperty("decision")
22+
private String decision;
23+
24+
@JsonProperty("label")
25+
private String label;
26+
27+
@JsonProperty("confidence")
28+
private Double confidence;
29+
30+
@JsonProperty("reason")
31+
private String reason;
32+
33+
@JsonProperty("status")
34+
private String status;
35+
36+
@JsonProperty("description")
37+
private String description;
38+
39+
@JsonProperty("id")
40+
private Long id;
41+
42+
@JsonProperty("createdAt")
43+
private String createdAt;
44+
45+
@JsonProperty("updatedAt")
46+
private String updatedAt;
47+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package com.cadac.stone_inscription.moderation.model;
2+
3+
import com.fasterxml.jackson.annotation.JsonProperty;
4+
5+
import lombok.AllArgsConstructor;
6+
import lombok.Builder;
7+
import lombok.Data;
8+
import lombok.NoArgsConstructor;
9+
10+
@Data
11+
@Builder
12+
@NoArgsConstructor
13+
@AllArgsConstructor
14+
public class ContentModeration {
15+
16+
@JsonProperty("label")
17+
private String label;
18+
19+
@JsonProperty("confidence")
20+
private Double confidence;
21+
22+
@JsonProperty("decision")
23+
private String decision;
24+
25+
@JsonProperty("status")
26+
private String status;
27+
28+
@JsonProperty("reason")
29+
private String reason;
30+
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package com.cadac.stone_inscription.moderation.model;
2+
3+
import lombok.AllArgsConstructor;
4+
import lombok.Builder;
5+
import lombok.Data;
6+
import lombok.NoArgsConstructor;
7+
8+
@Data
9+
@Builder
10+
@NoArgsConstructor
11+
@AllArgsConstructor
12+
public class ContentModerationResult {
13+
14+
private boolean approved;
15+
16+
private String label;
17+
18+
private Double confidence;
19+
20+
private String decision;
21+
22+
private String status;
23+
24+
private String reason;
25+
26+
public ContentModeration toContentModeration() {
27+
return ContentModeration.builder()
28+
.label(label)
29+
.confidence(confidence)
30+
.decision(decision)
31+
.status(status)
32+
.reason(reason)
33+
.build();
34+
}
35+
}

0 commit comments

Comments
 (0)