Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

API models and endpoints #13

Merged
merged 15 commits into from
Mar 23, 2020
19 changes: 19 additions & 0 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
"i18next-xhr-backend": "^3.2.2",
"jsonwebtoken": "^8.5.1",
"mongoose": "^5.9.4",
"mongoose-unique-validator": "^2.0.3",
"node-sass": "^4.13.1",
"react": "^16.8.6",
"react-dom": "^16.8.6",
Expand Down
13 changes: 13 additions & 0 deletions src/api/controllers/ActionController.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
module.exports = {
approveAction: (req, res) => {},

cancelAction: (req, res) => {},

createAction: (req, res) => {},

declineAction: (req, res) => {},

search: (req, res) => {},

updateAction: (req, res) => {}
};
17 changes: 17 additions & 0 deletions src/api/controllers/ActionUserController.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
module.exports = {
addAttendant: (req, res) => {

},

addSavedAction: (req, res) => {

},

removeAttendant: (req, res) => {

},

removeSavedAction: (req, res) => {

}
};
29 changes: 29 additions & 0 deletions src/api/controllers/ContactFormController.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
const ContactForm = require("../models/ContactFormModel");

module.exports = {
contact: (req, res) => {
const contactForm = new ContactForm({
firstName: req.body.firstName,
lastName: req.body.lastName,
email: req.body.email,
message: req.body.message
});

contactForm
.save()
.then(() => {
res.status(201).send();
})
.catch(err => {
if (err.errors.email) {
if (err.errors.email.kind === "regexp") {
res.status(500).json({ error: "Invalid email address" });
}
res.status(500).json(err);
} else {
console.error(`Error during contactForm save():\n${err}`);
res.status(500).json(err);
}
});
}
};
13 changes: 13 additions & 0 deletions src/api/controllers/TeamController.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
module.exports = {
addMembers: (req, res) => {},

createTeam: (req, res) => {},

deleteMembers: (req, res) => {},

deleteTeam: (req, res) => {},

search: (req, res) => {},

updateTeam: (req, res) => {}
};
92 changes: 61 additions & 31 deletions src/api/controllers/UserController.js
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,29 @@ const authResponse = user => ({
});

module.exports = {
changePassword: (req, res) => {},

getProfile: (req, res) => {
if (req.params.user_id === req.userData.userId) {
User.findOne({ _id: req.params.user_id })
.exec()
.then(user => {
user = sanitizeUser(user);
res.status(200).json({ user });
})
.catch(err => {
console.error(`Error during user find():\n${err}`);
res.status(500).send();
});
} else {
res.status(401).send();
}
},

getSelfProfile: (req, res) => {
res.redirect(`/users/${req.userData.userId}/profile`);
},

login: (req, res) => {
const email = req.body.email;
const password = req.body.password;
Expand Down Expand Up @@ -70,39 +93,46 @@ module.exports = {
const username = req.body.username;
const password = req.body.password;

User.find({ email })
.then(user => {
if (user.length == 1) {
return res.status(409).json({
error: "Email already exists"
});
}
bcrypt.hash(password, 10, (err, hash) => {
if (err) {
return res.status(400).json({
error: "Invalid request"
});
}

bcrypt.hash(password, 10, (err, hash) => {
if (err) {
return res.status(400).json({
error: "Invalid request"
});
}
const user = new User({
email,
username,
hash
});

const user = new User({
email,
username,
hash
});
user
.save()
.then(() => res.status(201).json(authResponse(user)))
.catch(err => {
if (err.name === "ValidationError") {
if (err.errors.email) {
if (err.errors.email.kind === "regexp") {
res.status(400).json({ error: "Invalid email address" });
} else if (err.errors.email.kind === "unique") {
res.status(400).json({ error: "Email already exists" });
}
}

user
.save()
.then(() => res.status(201).json(authResponse(user)))
.catch(err => {
console.error(`Error during user save():\n${err}`);
res.status(500).send();
});
if (err.errors.username) {
if (err.errors.username.kind === "unique") {
res.status(400).json({ error: "Username already exists" });
}
}
console.error(err);
res.status(500).send();
} else {
console.error(`Error during user save():\n${err}`);
res.status(500).json(err);
}
});
})
.catch(err => {
console.error(`Error during signup find():\n${err}`);
res.status(500).send();
});
}
});
},

updateProfile: (req, res) => {}
};
8 changes: 7 additions & 1 deletion src/api/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,11 @@ const mongo = require("mongoose");
require("dotenv").config();
require("dotenv-defaults").config();

const actionRoutes = require("./routes/action");
const authRoutes = require("./routes/auth");
const teamRoutes = require("./routes/team");
const userRoutes = require("./routes/user");
const contactRoutes = require("./routes/contact");

const app = express();
const port = 4000;
Expand All @@ -29,8 +32,11 @@ app.use(express.urlencoded({ extended: true }));
app.use(express.json());

// Routes
app.use("/actions", actionRoutes);
app.use("/auth", authRoutes);
app.use("/user", userRoutes);
app.use("/teams", teamRoutes);
app.use("/users", userRoutes);
app.use("/contact", contactRoutes);

/* Can't find the requested resourse */
app.use((req, res, next) => {
Expand Down
3 changes: 3 additions & 0 deletions src/api/middleware/check-admin.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
module.exports = (req, res, next) => {
next();
};
3 changes: 3 additions & 0 deletions src/api/middleware/check-owner.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
module.exports = (req, res, next) => {
next();
};
3 changes: 3 additions & 0 deletions src/api/middleware/check-permissions.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
module.exports = (req, res, next) => {
next();
};
3 changes: 3 additions & 0 deletions src/api/middleware/log-search.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
module.exports = (req, res, next) => {
next();
};
28 changes: 28 additions & 0 deletions src/api/models/ActionModel.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
const mongo = require("mongoose");

const ActionSchema = new mongo.Schema({
name: { type: String, required: true },
description: { type: String },
categories: { type: [mongo.Schema.Types.ObjectId] },
location: {
type: {
type: String,
enum: ["Point"],
required: true
},
coordinates: {
type: [Number],
required: true
}
},
date: { type: Date, required: true },
photo: { type: String },
organizer: {
required: true,
organizerId: { type: mongo.Schema.Types.ObjectId },
isTeam: { type: Boolean }
},
attendees: { type: [mongo.Schema.Types.ObjectId] }
});

module.exports = mongo.model("Action", ActionSchema);
7 changes: 7 additions & 0 deletions src/api/models/CategoryModel.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
const mongo = require("mongoose");

const CategorySchema = new mongo.Schema({
name: { type: String, required: true }
});

module.exports = mongo.model("Category", CategorySchema);
16 changes: 16 additions & 0 deletions src/api/models/ContactFormModel.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
const mongo = require("mongoose");
const uniqueValidator = require("mongoose-unique-validator");

const ContactFormSchema = new mongo.Schema({
firstName: { type: String, required: true },
lastName: { type: String, required: true },
email: {
type: String,
required: true,
match: /[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?/
},
message: { type: String, required: true }
});

ContactFormSchema.plugin(uniqueValidator);
module.exports = mongo.model("ContactForm", ContactFormSchema);
11 changes: 11 additions & 0 deletions src/api/models/SearchModel.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
const mongo = require("mongoose");

const SearchSchema = new mongo.Schema(
{
user_id: { type: mongo.Schema.Types.ObjectId, required: true },
query: { type: String, required: true }
},
{ _id: false }
);

module.exports = mongo.model("Search", SearchSchema);
12 changes: 12 additions & 0 deletions src/api/models/TeamModel.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
const mongo = require("mongoose");

const TeamSchema = new mongo.Schema({
name: { type: String, required: true },
description: { type: String },
logo: { type: String },
owner: { type: mongo.Schema.Types.ObjectId, required: true },
members: { type: [mongo.Schema.Types.ObjectId] },
categories: { type: [String] }
});

module.exports = mongo.model("Team", TeamSchema);
24 changes: 16 additions & 8 deletions src/api/models/UserModel.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
const mongo = require("mongoose");
const uniqueValidator = require("mongoose-unique-validator");

const UserSchema = new mongo.Schema({
email: {
Expand All @@ -7,16 +8,23 @@ const UserSchema = new mongo.Schema({
unique: true,
match: /[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?/
},
username: { type: String, required: true },
username: { type: String, required: true, unique: true },
hash: { type: String, required: true },
hometown: { type: String },
favoriteEventTypes: { type: [String] },
profilePhoto: { type: String },
location: {
type: {
type: String,
enum: ["Point"]
},
coordinates: {
type: [Number]
}
},
favoriteCategories: { type: [mongo.Schema.Types.ObjectId] },
language: { type: String },
eventsOrganized: { type: [mongo.Schema.Types.ObjectId] },
actionsAttended: { type: [mongo.Schema.Types.ObjectId] },
actionsSaved: { type: [mongo.Schema.Types.ObjectId] }
});

// const eventTypes = ['environment','student','animals','arts','culture','hunger','health'];

// const languages = ['en','ελ']

UserSchema.plugin(uniqueValidator);
module.exports = mongo.model("User", UserSchema);
Loading