feat: Initial commit of backend services and AGENTS.md

This commit is contained in:
William Valentin
2025-10-29 13:12:30 -07:00
commit 999d37babb
25 changed files with 3881 additions and 0 deletions

33
backend/models/Event.js Normal file
View File

@@ -0,0 +1,33 @@
const mongoose = require("mongoose");
const EventSchema = new mongoose.Schema(
{
title: {
type: String,
required: true,
},
description: {
type: String,
required: true,
},
date: {
type: Date,
required: true,
},
location: {
type: String,
required: true,
},
participants: [
{
type: mongoose.Schema.Types.ObjectId,
ref: "User",
},
],
},
{
timestamps: true,
},
);
module.exports = mongoose.model("Event", EventSchema);

29
backend/models/Post.js Normal file
View File

@@ -0,0 +1,29 @@
const mongoose = require("mongoose");
const PostSchema = new mongoose.Schema(
{
user: {
type: mongoose.Schema.Types.ObjectId,
ref: "User",
required: true,
},
content: {
type: String,
required: true,
},
imageUrl: {
type: String,
},
likes: [
{
type: mongoose.Schema.Types.ObjectId,
ref: "User",
},
],
},
{
timestamps: true,
},
);
module.exports = mongoose.model("Post", PostSchema);

30
backend/models/Report.js Normal file
View File

@@ -0,0 +1,30 @@
const mongoose = require("mongoose");
const ReportSchema = new mongoose.Schema(
{
street: {
type: mongoose.Schema.Types.ObjectId,
ref: "Street",
required: true,
},
user: {
type: mongoose.Schema.Types.ObjectId,
ref: "User",
required: true,
},
issue: {
type: String,
required: true,
},
status: {
type: String,
enum: ["open", "resolved"],
default: "open",
},
},
{
timestamps: true,
},
);
module.exports = mongoose.model("Report", ReportSchema);

27
backend/models/Reward.js Normal file
View File

@@ -0,0 +1,27 @@
const mongoose = require("mongoose");
const RewardSchema = new mongoose.Schema(
{
name: {
type: String,
required: true,
},
description: {
type: String,
required: true,
},
cost: {
type: Number,
required: true,
},
isPremium: {
type: Boolean,
default: false,
},
},
{
timestamps: true,
},
);
module.exports = mongoose.model("Reward", RewardSchema);

37
backend/models/Street.js Normal file
View File

@@ -0,0 +1,37 @@
const mongoose = require("mongoose");
const StreetSchema = new mongoose.Schema(
{
name: {
type: String,
required: true,
},
location: {
type: {
type: String,
enum: ["Point"],
required: true,
},
coordinates: {
type: [Number],
required: true,
},
},
adoptedBy: {
type: mongoose.Schema.Types.ObjectId,
ref: "User",
},
status: {
type: String,
enum: ["available", "adopted"],
default: "available",
},
},
{
timestamps: true,
},
);
StreetSchema.index({ location: "2dsphere" });
module.exports = mongoose.model("Street", StreetSchema);

29
backend/models/Task.js Normal file
View File

@@ -0,0 +1,29 @@
const mongoose = require("mongoose");
const TaskSchema = new mongoose.Schema(
{
street: {
type: mongoose.Schema.Types.ObjectId,
ref: "Street",
required: true,
},
description: {
type: String,
required: true,
},
completedBy: {
type: mongoose.Schema.Types.ObjectId,
ref: "User",
},
status: {
type: String,
enum: ["pending", "completed"],
default: "pending",
},
},
{
timestamps: true,
},
);
module.exports = mongoose.model("Task", TaskSchema);

45
backend/models/User.js Normal file
View File

@@ -0,0 +1,45 @@
const mongoose = require("mongoose");
const UserSchema = new mongoose.Schema(
{
name: {
type: String,
required: true,
},
email: {
type: String,
required: true,
unique: true,
},
password: {
type: String,
required: true,
},
isPremium: {
type: Boolean,
default: false,
},
points: {
type: Number,
default: 0,
},
adoptedStreets: [
{
type: mongoose.Schema.Types.ObjectId,
ref: "Street",
},
],
completedTasks: [
{
type: mongoose.Schema.Types.ObjectId,
ref: "Task",
},
],
badges: [String],
},
{
timestamps: true,
},
);
module.exports = mongoose.model("User", UserSchema);