Skip to content

Commit a2eebc3

Browse files
authored
Merge pull request #49 from CleanCode366/45-design-the-schema
Done with designing the schema
2 parents 75bae4b + a434c4e commit a2eebc3

9 files changed

Lines changed: 460 additions & 15 deletions

File tree

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
package com.cadac.stone_inscription.admin.entity;
2+
3+
import com.fasterxml.jackson.annotation.JsonProperty;
4+
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
5+
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
6+
import com.cadac.stone_inscription.entity.enums.PostStatus;
7+
import com.cadac.stone_inscription.entity.model.Report;
8+
import com.cadac.stone_inscription.moderation.model.ContentModeration;
9+
10+
import lombok.*;
11+
import org.bson.types.ObjectId;
12+
import org.springframework.data.annotation.CreatedDate;
13+
import org.springframework.data.annotation.Id;
14+
import org.springframework.data.annotation.LastModifiedDate;
15+
import org.springframework.data.mongodb.core.mapping.Document;
16+
import org.springframework.data.mongodb.core.mapping.Field;
17+
18+
import java.util.Date;
19+
20+
/**
21+
* Archive of rejected comments.
22+
* A comment is moved here from postdescription when admin rejects it.
23+
* Preserves the full original comment structure for audit/record purposes.
24+
*/
25+
@Data
26+
@Builder
27+
@NoArgsConstructor
28+
@AllArgsConstructor
29+
@Document(collection = "archive_comments")
30+
public class ArchiveComment {
31+
32+
@Id
33+
@JsonProperty("id")
34+
@JsonSerialize(using = ToStringSerializer.class)
35+
private ObjectId id;
36+
37+
@Field("postId")
38+
@JsonProperty("postId")
39+
@JsonSerialize(using = ToStringSerializer.class)
40+
private ObjectId postId;
41+
42+
@Field("userId")
43+
@JsonProperty("userId")
44+
@JsonSerialize(using = ToStringSerializer.class)
45+
private ObjectId userId;
46+
47+
@Field("username")
48+
@JsonProperty("username")
49+
private String username;
50+
51+
@Field("userImageUrl")
52+
@JsonProperty("userImageUrl")
53+
private String userImageUrl;
54+
55+
@Field("description")
56+
@JsonProperty("description")
57+
private String description;
58+
59+
@Field("moderation")
60+
@JsonProperty("moderation")
61+
private ContentModeration moderation;
62+
63+
@Field("upvote")
64+
@JsonProperty("upvote")
65+
@Builder.Default
66+
private Integer upvote = 0;
67+
68+
@CreatedDate
69+
@Field("createdAt")
70+
@JsonProperty("createdAt")
71+
private Date createdAt;
72+
73+
@LastModifiedDate
74+
@Field("updatedAt")
75+
@JsonProperty("updatedAt")
76+
private Date updatedAt;
77+
78+
@Field("status")
79+
@JsonProperty("status")
80+
@Builder.Default
81+
private PostStatus status = PostStatus.REJECTED;
82+
83+
@Field("report")
84+
@JsonProperty("report")
85+
@Builder.Default
86+
private Report report = new Report();
87+
}
Lines changed: 172 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,172 @@
1+
package com.cadac.stone_inscription.admin.entity;
2+
3+
import com.fasterxml.jackson.annotation.JsonProperty;
4+
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
5+
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
6+
import com.cadac.stone_inscription.entity.enums.PostStatus;
7+
import com.cadac.stone_inscription.entity.model.Report;
8+
import com.cadac.stone_inscription.moderation.model.ContentModeration;
9+
10+
import lombok.*;
11+
import org.bson.types.ObjectId;
12+
import org.springframework.data.annotation.CreatedDate;
13+
import org.springframework.data.annotation.Id;
14+
import org.springframework.data.annotation.LastModifiedDate;
15+
import org.springframework.data.mongodb.core.mapping.Document;
16+
import org.springframework.data.mongodb.core.mapping.Field;
17+
18+
import java.util.Date;
19+
import java.util.List;
20+
21+
/**
22+
* Archive of rejected posts.
23+
* A post is moved here from inscriptionposts when admin rejects it.
24+
* Preserves the full original post structure for audit/record purposes.
25+
*/
26+
@Data
27+
@Builder
28+
@NoArgsConstructor
29+
@AllArgsConstructor
30+
@Document(collection = "archive_posts")
31+
public class ArchivePost {
32+
33+
@Id
34+
@JsonProperty("_id")
35+
@JsonSerialize(using = ToStringSerializer.class)
36+
private ObjectId id;
37+
38+
@Field("user_id")
39+
@JsonProperty("user_id")
40+
@JsonSerialize(using = ToStringSerializer.class)
41+
private ObjectId userId;
42+
43+
@CreatedDate
44+
@Field("createdAt")
45+
@JsonProperty("createdAt")
46+
private Date createdAt;
47+
48+
@LastModifiedDate
49+
@Field("updatedAt")
50+
@JsonProperty("updatedAt")
51+
private Date updatedAt;
52+
53+
@Field("images")
54+
@JsonProperty("images")
55+
private Images images;
56+
57+
@Field("description")
58+
@JsonProperty("description")
59+
private Description description;
60+
61+
@Field("topic")
62+
@JsonProperty("topic")
63+
private String topic;
64+
65+
@Field("script")
66+
@JsonProperty("script")
67+
private List<String> script;
68+
69+
@Field("type")
70+
@JsonProperty("type")
71+
private String type;
72+
73+
@Field("status")
74+
@JsonProperty("status")
75+
@Builder.Default
76+
private PostStatus status = PostStatus.REJECTED;
77+
78+
@Field("report")
79+
@JsonProperty("report")
80+
@Builder.Default
81+
private Report report = new Report();
82+
83+
// ---------- Nested Classes ----------
84+
85+
@Data
86+
@Builder
87+
@NoArgsConstructor
88+
@AllArgsConstructor
89+
public static class Images {
90+
91+
@Field("thumbnailImage")
92+
@JsonProperty("thumbnailImage")
93+
private String thumbnailImage;
94+
95+
@Field("image")
96+
@JsonProperty("image")
97+
private List<String> image;
98+
}
99+
100+
@Data
101+
@Builder
102+
@NoArgsConstructor
103+
@AllArgsConstructor
104+
public static class Description {
105+
106+
@Field("title")
107+
@JsonProperty("title")
108+
private String title;
109+
110+
@Field("subject")
111+
@JsonProperty("subject")
112+
private String subject;
113+
114+
@Field("description")
115+
@JsonProperty("description")
116+
private String description;
117+
118+
@Field("scriptLanguage")
119+
@JsonProperty("scriptLanguage")
120+
private List<String> scriptLanguage;
121+
122+
@Field("language")
123+
@JsonProperty("language")
124+
private List<String> language;
125+
126+
@Field("englishTranslation")
127+
@JsonProperty("englishTranslation")
128+
private String englishTranslation;
129+
130+
@Field("moderation")
131+
@JsonProperty("moderation")
132+
private ContentModeration moderation;
133+
134+
@Field("upvote")
135+
@JsonProperty("upvote")
136+
@Builder.Default
137+
private Integer upvote = 0;
138+
139+
@Field("geolocation")
140+
@JsonProperty("geolocation")
141+
private GeoLocation geolocation;
142+
143+
@CreatedDate
144+
@Field("createdAt")
145+
@JsonProperty("createdAt")
146+
private Date createdAt;
147+
148+
@LastModifiedDate
149+
@Field("updatedAt")
150+
@JsonProperty("updatedAt")
151+
private Date updatedAt;
152+
}
153+
154+
@Data
155+
@Builder
156+
@NoArgsConstructor
157+
@AllArgsConstructor
158+
public static class GeoLocation {
159+
160+
@Field("lon")
161+
@JsonProperty("lon")
162+
private String lon;
163+
164+
@Field("lat")
165+
@JsonProperty("lat")
166+
private String lat;
167+
168+
private String state;
169+
private String city;
170+
private String country;
171+
}
172+
}
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
package com.cadac.stone_inscription.admin.entity;
2+
3+
import com.fasterxml.jackson.annotation.JsonProperty;
4+
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
5+
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
6+
7+
import lombok.*;
8+
import org.bson.types.ObjectId;
9+
import org.springframework.data.annotation.Id;
10+
import org.springframework.data.mongodb.core.mapping.Document;
11+
import org.springframework.data.mongodb.core.mapping.Field;
12+
13+
/**
14+
* Admin-facing registry of blacklisted users.
15+
* A record is created/updated here when a user's reportCount hits the
16+
* threshold.
17+
* Allows admin to quickly query all blacklisted users without scanning
18+
* users_profile.
19+
*/
20+
@Data
21+
@Builder
22+
@NoArgsConstructor
23+
@AllArgsConstructor
24+
@Document(collection = "blacklist_users")
25+
public class BlacklistUser {
26+
27+
@Id
28+
@JsonProperty("_id")
29+
@JsonSerialize(using = ToStringSerializer.class)
30+
private ObjectId id;
31+
32+
/**
33+
* Reference to the user in users_profile collection.
34+
*/
35+
@Field("userId")
36+
@JsonProperty("userId")
37+
@JsonSerialize(using = ToStringSerializer.class)
38+
private ObjectId userId;
39+
40+
@Field("name")
41+
@JsonProperty("name")
42+
private String name;
43+
44+
/**
45+
* Total number of admin-validated reports against this user.
46+
* Synced from User.reportCount at time of blacklisting.
47+
*/
48+
@Field("reportCount")
49+
@JsonProperty("reportCount")
50+
@Builder.Default
51+
private Integer reportCount = 0;
52+
53+
@Field("blackListed")
54+
@JsonProperty("blackListed")
55+
@Builder.Default
56+
private Boolean blackListed = true;
57+
}

src/main/java/com/cadac/stone_inscription/entity/InscriptionPost.java

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
55
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
66
import com.cadac.stone_inscription.moderation.model.ContentModeration;
7+
import com.cadac.stone_inscription.entity.enums.PostStatus;
8+
import com.cadac.stone_inscription.entity.model.Report;
79

810
import jakarta.validation.constraints.NotBlank;
911
import jakarta.validation.constraints.NotEmpty;
@@ -99,6 +101,26 @@ public class InscriptionPost {
99101
@Builder.Default
100102
private List<UsersRating> userRating = new LinkedList<>();
101103

104+
/**
105+
* Admin-managed status of the post.
106+
* Defaults to ACCEPTED. Set to UNDER_REVIEW when first report comes in.
107+
* Set to REJECTED when admin rejects — post is then archived.
108+
*/
109+
@Field("status")
110+
@JsonProperty("status")
111+
@Builder.Default
112+
private PostStatus status = PostStatus.ACCEPTED;
113+
114+
/**
115+
* Embedded report metadata.
116+
* reporters list grows with each user report.
117+
* count is incremented only when admin validates a report as genuine.
118+
*/
119+
@Field("report")
120+
@JsonProperty("report")
121+
@Builder.Default
122+
private Report report = new Report();
123+
102124
// ---------- Nested Classes ----------
103125

104126
@Data

src/main/java/com/cadac/stone_inscription/entity/PublicPostDescription.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
55
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
66
import com.cadac.stone_inscription.moderation.model.ContentModeration;
7+
import com.cadac.stone_inscription.entity.enums.PostStatus;
8+
import com.cadac.stone_inscription.entity.model.Report;
79

810
import lombok.*;
911
import org.bson.types.ObjectId;
@@ -76,6 +78,24 @@ public class PublicPostDescription {
7678
@JsonProperty("updatedAt")
7779
private Date updatedAt;
7880

81+
/**
82+
* Admin-managed status of the comment.
83+
* Defaults to ACCEPTED. Changes to UNDER_REVIEW on first report.
84+
*/
85+
@Field("status")
86+
@JsonProperty("status")
87+
@Builder.Default
88+
private PostStatus status = PostStatus.ACCEPTED;
89+
90+
/**
91+
* Embedded report metadata for this comment.
92+
* count incremented only when admin validates the report.
93+
*/
94+
@Field("report")
95+
@JsonProperty("report")
96+
@Builder.Default
97+
private Report report = new Report();
98+
7999
@Data
80100
@Builder
81101
@NoArgsConstructor

0 commit comments

Comments
 (0)