Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
package com.cadac.stone_inscription.admin.entity;

import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import com.cadac.stone_inscription.entity.enums.PostStatus;
import com.cadac.stone_inscription.entity.model.Report;
import com.cadac.stone_inscription.moderation.model.ContentModeration;

import lombok.*;
import org.bson.types.ObjectId;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.Id;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.mongodb.core.mapping.Document;
import org.springframework.data.mongodb.core.mapping.Field;

import java.util.Date;

/**
* Archive of rejected comments.
* A comment is moved here from postdescription when admin rejects it.
* Preserves the full original comment structure for audit/record purposes.
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Document(collection = "archive_comments")
public class ArchiveComment {

@Id
@JsonProperty("id")
@JsonSerialize(using = ToStringSerializer.class)
private ObjectId id;

@Field("postId")
@JsonProperty("postId")
@JsonSerialize(using = ToStringSerializer.class)
private ObjectId postId;

@Field("userId")
@JsonProperty("userId")
@JsonSerialize(using = ToStringSerializer.class)
private ObjectId userId;

@Field("username")
@JsonProperty("username")
private String username;

@Field("userImageUrl")
@JsonProperty("userImageUrl")
private String userImageUrl;

@Field("description")
@JsonProperty("description")
private String description;

@Field("moderation")
@JsonProperty("moderation")
private ContentModeration moderation;

@Field("upvote")
@JsonProperty("upvote")
@Builder.Default
private Integer upvote = 0;

@CreatedDate
@Field("createdAt")
@JsonProperty("createdAt")
private Date createdAt;

@LastModifiedDate
@Field("updatedAt")
@JsonProperty("updatedAt")
private Date updatedAt;

@Field("status")
@JsonProperty("status")
@Builder.Default
private PostStatus status = PostStatus.REJECTED;

@Field("report")
@JsonProperty("report")
@Builder.Default
private Report report = new Report();
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,172 @@
package com.cadac.stone_inscription.admin.entity;

import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import com.cadac.stone_inscription.entity.enums.PostStatus;
import com.cadac.stone_inscription.entity.model.Report;
import com.cadac.stone_inscription.moderation.model.ContentModeration;

import lombok.*;
import org.bson.types.ObjectId;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.Id;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.mongodb.core.mapping.Document;
import org.springframework.data.mongodb.core.mapping.Field;

import java.util.Date;
import java.util.List;

/**
* Archive of rejected posts.
* A post is moved here from inscriptionposts when admin rejects it.
* Preserves the full original post structure for audit/record purposes.
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Document(collection = "archive_posts")
public class ArchivePost {

@Id
@JsonProperty("_id")
@JsonSerialize(using = ToStringSerializer.class)
private ObjectId id;

@Field("user_id")
@JsonProperty("user_id")
@JsonSerialize(using = ToStringSerializer.class)
private ObjectId userId;

@CreatedDate
@Field("createdAt")
@JsonProperty("createdAt")
private Date createdAt;

@LastModifiedDate
@Field("updatedAt")
@JsonProperty("updatedAt")
private Date updatedAt;

@Field("images")
@JsonProperty("images")
private Images images;

@Field("description")
@JsonProperty("description")
private Description description;

@Field("topic")
@JsonProperty("topic")
private String topic;

@Field("script")
@JsonProperty("script")
private List<String> script;

@Field("type")
@JsonProperty("type")
private String type;

@Field("status")
@JsonProperty("status")
@Builder.Default
private PostStatus status = PostStatus.REJECTED;

@Field("report")
@JsonProperty("report")
@Builder.Default
private Report report = new Report();

// ---------- Nested Classes ----------

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public static class Images {

@Field("thumbnailImage")
@JsonProperty("thumbnailImage")
private String thumbnailImage;

@Field("image")
@JsonProperty("image")
private List<String> image;
}

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public static class Description {

@Field("title")
@JsonProperty("title")
private String title;

@Field("subject")
@JsonProperty("subject")
private String subject;

@Field("description")
@JsonProperty("description")
private String description;

@Field("scriptLanguage")
@JsonProperty("scriptLanguage")
private List<String> scriptLanguage;

@Field("language")
@JsonProperty("language")
private List<String> language;

@Field("englishTranslation")
@JsonProperty("englishTranslation")
private String englishTranslation;

@Field("moderation")
@JsonProperty("moderation")
private ContentModeration moderation;

@Field("upvote")
@JsonProperty("upvote")
@Builder.Default
private Integer upvote = 0;

@Field("geolocation")
@JsonProperty("geolocation")
private GeoLocation geolocation;

@CreatedDate
@Field("createdAt")
@JsonProperty("createdAt")
private Date createdAt;

@LastModifiedDate
@Field("updatedAt")
@JsonProperty("updatedAt")
private Date updatedAt;
}

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public static class GeoLocation {

@Field("lon")
@JsonProperty("lon")
private String lon;

@Field("lat")
@JsonProperty("lat")
private String lat;

private String state;
private String city;
private String country;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
package com.cadac.stone_inscription.admin.entity;

import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;

import lombok.*;
import org.bson.types.ObjectId;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;
import org.springframework.data.mongodb.core.mapping.Field;

/**
* Admin-facing registry of blacklisted users.
* A record is created/updated here when a user's reportCount hits the
* threshold.
* Allows admin to quickly query all blacklisted users without scanning
* users_profile.
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Document(collection = "blacklist_users")
public class BlacklistUser {

@Id
@JsonProperty("_id")
@JsonSerialize(using = ToStringSerializer.class)
private ObjectId id;

/**
* Reference to the user in users_profile collection.
*/
@Field("userId")
@JsonProperty("userId")
@JsonSerialize(using = ToStringSerializer.class)
private ObjectId userId;

@Field("name")
@JsonProperty("name")
private String name;

/**
* Total number of admin-validated reports against this user.
* Synced from User.reportCount at time of blacklisting.
*/
@Field("reportCount")
@JsonProperty("reportCount")
@Builder.Default
private Integer reportCount = 0;

@Field("blackListed")
@JsonProperty("blackListed")
@Builder.Default
private Boolean blackListed = true;
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import com.cadac.stone_inscription.moderation.model.ContentModeration;
import com.cadac.stone_inscription.entity.enums.PostStatus;
import com.cadac.stone_inscription.entity.model.Report;

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

/**
* Admin-managed status of the post.
* Defaults to ACCEPTED. Set to UNDER_REVIEW when first report comes in.
* Set to REJECTED when admin rejects — post is then archived.
*/
@Field("status")
@JsonProperty("status")
@Builder.Default
private PostStatus status = PostStatus.ACCEPTED;

/**
* Embedded report metadata.
* reporters list grows with each user report.
* count is incremented only when admin validates a report as genuine.
*/
@Field("report")
@JsonProperty("report")
@Builder.Default
private Report report = new Report();

// ---------- Nested Classes ----------

@Data
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import com.cadac.stone_inscription.moderation.model.ContentModeration;
import com.cadac.stone_inscription.entity.enums.PostStatus;
import com.cadac.stone_inscription.entity.model.Report;

import lombok.*;
import org.bson.types.ObjectId;
Expand Down Expand Up @@ -76,6 +78,24 @@ public class PublicPostDescription {
@JsonProperty("updatedAt")
private Date updatedAt;

/**
* Admin-managed status of the comment.
* Defaults to ACCEPTED. Changes to UNDER_REVIEW on first report.
*/
@Field("status")
@JsonProperty("status")
@Builder.Default
private PostStatus status = PostStatus.ACCEPTED;

/**
* Embedded report metadata for this comment.
* count incremented only when admin validates the report.
*/
@Field("report")
@JsonProperty("report")
@Builder.Default
private Report report = new Report();

@Data
@Builder
@NoArgsConstructor
Expand Down
Loading
Loading