Submission System

Understanding the content submission and moderation system in NestSaaS

NestSaaS includes a powerful submission system that allows users to submit content to your platform. This system is particularly useful for directory listings, marketplaces, or any scenario where you want to accept user-generated content with moderation.

Submission Features

  • User Submissions: Allow registered users to submit content
  • Moderation Workflow: Review and approve or reject submissions
  • Payment Integration: Optionally charge for submissions
  • Subscription Plans: Offer different submission plans
  • Status Tracking: Keep users informed about submission status
  • Metadata Customization: Collect specific information based on content type

Submission Workflow

The submission process follows these steps:

  1. Creation: User creates a draft submission
  2. Editing: User completes the submission form with all required information
  3. Payment (optional): User pays for the submission if required
  4. Application: User submits the content for review
  5. Moderation: Admin reviews the submission
  6. Resolution: Submission is approved or rejected
  7. Publication: Approved submissions are published

Submission Status

Submissions can have the following statuses:

  • DRAFT: Initial creation, still being edited by the user
  • APPLICATION: Submitted for review
  • APPROVED: Submission has been approved
  • REJECTED: Submission has been rejected
  • PUBLISHED: Submission is live and publicly visible
  • ARCHIVED: Submission is no longer active

Submission Plans

NestSaaS supports different submission plans, allowing you to offer various levels of service:

Plan TypeDescription
FreeBasic submission without payment
One-time PaymentSingle payment for a submission
SubscriptionRecurring payment for ongoing submissions

Each plan can have different features, such as:

  • Priority review
  • Featured placement
  • Extended listing duration
  • Additional media attachments
  • Custom fields

Implementation

Data Model

Submissions in NestSaaS are implemented using the Article model with specific status values:

// Submission-specific fields in the Article model
status: "DRAFT" | "APPLICATION" | "APPROVED" | "REJECTED" | "PUBLISHED" | "ARCHIVED";
authorId: number; // The user who created the submission

Server Actions

NestSaaS provides server actions for handling submissions:

// Get all submissions for the current user
async function getUserSubmissions(): Promise<Submission[]> {
  // Implementation details...
}
 
// Get a specific submission by ID
async function getUserSubmission(submissionId: number): Promise<Submission> {
  // Implementation details...
}
 
// Create a new draft submission
async function createSubmission(data: {
  title: string;
  content: string;
  excerpt?: string;
  spaceSlug: string;
  categoryId?: number;
  metadata?: Record<string, any>;
  submissionPlan: SubmissionPlan;
}): Promise<{ id: number; message: string }> {
  // Implementation details...
}
 
// Update an existing submission
async function updateSubmission(data: {
  id: number;
  title?: string;
  content?: string;
  excerpt?: string;
  categoryId?: number;
  metadata?: Record<string, any>;
  status?: ArticleStatus;
}): Promise<{ success: boolean; message: string }> {
  // Implementation details...
}

Admin Moderation

Administrators can review and moderate submissions through the admin panel:

  1. View all pending submissions
  2. Review submission details and content
  3. Approve or reject submissions with feedback
  4. Edit submissions if necessary before approval
  5. Manage submission categories and metadata requirements

Payment Integration

The submission system integrates with the payment system to handle paid submissions:

One-time Payment Submissions

For submissions requiring a one-time payment:

  1. User creates a submission and selects a paid plan
  2. System creates a Purchase record linked to the submission
  3. User completes payment through Stripe
  4. Upon successful payment, the submission status is updated

Subscription-based Submissions

For submissions requiring a subscription:

  1. User subscribes to a submission plan
  2. System creates a Subscription record
  3. User can submit content as long as the subscription is active
  4. Subscription status is checked when creating new submissions

Customization

The submission system can be customized for different Space types:

Custom Submission Fields

Define custom metadata fields for submissions based on Space type, refer spaces docs for more details.

Custom Validation

Implement validation rules for submission fields:

// Example validation schema using Zod
const submissionFormSchema = z.object({
  title: z.string().min(3, "Title must be at least 3 characters").max(100),
  excerpt: z
    .string()
    .min(10, "Excerpt must be at least 10 characters")
    .max(300),
  website: z.string().url("Please enter a valid URL"),
  coverImage: z.string().min(1, "Cover image is required"),
  blurhash: z.string().optional(),
  draft: z.array(z.any()).optional(),
  content: z.string().min(50, "Content must be at least 50 characters"),
  categoryId: z.number().optional().nullable(),
  tags: z.array(z.number()).optional(),
  submissionPlan: z.enum(["free", "pro", "sponsor"]).default("free"),
})

Best Practices

  1. Clear Guidelines: Provide clear submission guidelines to users
  2. Responsive Moderation: Review submissions promptly to maintain user engagement
  3. Feedback: Provide helpful feedback for rejected submissions
  4. Automated Checks: Implement basic automated validation before human review
  5. Scalable Workflow: Design your moderation workflow to scale with volume
  6. User Communication: Keep users informed about submission status changes
  7. Spam Prevention: Implement measures to prevent spam submissions

Next Steps

On this page