admin
parent
be88a7ff28
commit
0d957ab6af
|
@ -0,0 +1,37 @@
|
||||||
|
import { Request, Response } from "express";
|
||||||
|
import { User } from "../models/user";
|
||||||
|
import { ADMIN_MAX_USERS_PER_PAGE } from "../utils/utils";
|
||||||
|
|
||||||
|
export async function GetAllUsers(req: Request, res: Response) {
|
||||||
|
try {
|
||||||
|
const pageSize = ADMIN_MAX_USERS_PER_PAGE;
|
||||||
|
|
||||||
|
// Get the current page number (default: 1)
|
||||||
|
const page = parseInt(req.query.page as string, pageSize) || 1;
|
||||||
|
|
||||||
|
// Calculate the skipping (skip) based on the current page
|
||||||
|
const skip = (page - 1) * pageSize;
|
||||||
|
|
||||||
|
// Get the total number of users
|
||||||
|
const totalUsers = await User.countDocuments({}).lean();
|
||||||
|
|
||||||
|
// Calculate the total number of pages
|
||||||
|
const totalPages = Math.ceil(totalUsers / pageSize);
|
||||||
|
|
||||||
|
// Query for the current page with limit and skip
|
||||||
|
const users = await User.find({})
|
||||||
|
.lean()
|
||||||
|
.select("-password -_id -__v") // Exclude password and other fields
|
||||||
|
.skip(skip)
|
||||||
|
.limit(pageSize);
|
||||||
|
|
||||||
|
// Respond with users and page information
|
||||||
|
res.json({
|
||||||
|
users,
|
||||||
|
totalPages,
|
||||||
|
});
|
||||||
|
} catch (error) {
|
||||||
|
console.error("Error fetching users:", error);
|
||||||
|
res.status(500).json({ error: "Internal Server Error" });
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,8 +1,7 @@
|
||||||
import { Request, Response } from "express";
|
import { Request, Response } from "express";
|
||||||
import bcrypt from "bcrypt";
|
import bcrypt from "bcrypt";
|
||||||
import { User } from "../models/user";
|
import { User } from "../models/user";
|
||||||
import crypto from "crypto";
|
import { saveSession } from "../utils/utils";
|
||||||
import { Session } from "../models/session";
|
|
||||||
|
|
||||||
export async function SignUp(req: Request, res: Response) {
|
export async function SignUp(req: Request, res: Response) {
|
||||||
if (!req.body.accountName || !req.body.username || !req.body.password) {
|
if (!req.body.accountName || !req.body.username || !req.body.password) {
|
||||||
|
@ -11,7 +10,7 @@ export async function SignUp(req: Request, res: Response) {
|
||||||
|
|
||||||
const { accountName, username, password } = req.body;
|
const { accountName, username, password } = req.body;
|
||||||
|
|
||||||
const existingUser = await User.findOne({ accountName });
|
const existingUser = await User.findOne({ accountName }).lean();
|
||||||
|
|
||||||
if (existingUser) {
|
if (existingUser) {
|
||||||
return res.status(400).json({ status: "err" });
|
return res.status(400).json({ status: "err" });
|
||||||
|
@ -38,7 +37,7 @@ export async function SignUp(req: Request, res: Response) {
|
||||||
|
|
||||||
user
|
user
|
||||||
.save()
|
.save()
|
||||||
.then(() => res.status(200).json({ status: "ok" }))
|
.then(() => saveSession(res, accountName))
|
||||||
.catch((err) => {
|
.catch((err) => {
|
||||||
console.log(err);
|
console.log(err);
|
||||||
res.status(500).json({ status: "err" });
|
res.status(500).json({ status: "err" });
|
||||||
|
@ -53,13 +52,18 @@ export async function Login(req: Request, res: Response) {
|
||||||
|
|
||||||
const { accountName, password } = req.body;
|
const { accountName, password } = req.body;
|
||||||
|
|
||||||
const user = await User.findOne({ accountName });
|
const user = await User.findOne({ accountName }).lean();
|
||||||
|
|
||||||
if (!user) {
|
if (!user) {
|
||||||
return res.status(401).json({ status: "err" });
|
return res.status(401).json({ status: "err" });
|
||||||
}
|
}
|
||||||
|
|
||||||
if (user.password === undefined || user.password === null) {
|
if (
|
||||||
|
user.accountName === null ||
|
||||||
|
user.accountName === undefined ||
|
||||||
|
user.password === undefined ||
|
||||||
|
user.password === null
|
||||||
|
) {
|
||||||
return res.status(401).json({ status: "err" });
|
return res.status(401).json({ status: "err" });
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -74,19 +78,31 @@ export async function Login(req: Request, res: Response) {
|
||||||
return res.status(401).json({ status: "err" });
|
return res.status(401).json({ status: "err" });
|
||||||
}
|
}
|
||||||
|
|
||||||
const sessionId = crypto.randomBytes(32).toString("hex");
|
saveSession(res, user.accountName);
|
||||||
|
|
||||||
const session = new Session({
|
|
||||||
sessionId: sessionId,
|
|
||||||
accountName: user.accountName,
|
|
||||||
});
|
|
||||||
|
|
||||||
session
|
|
||||||
.save()
|
|
||||||
.then(() => res.status(200).json({ sessionId }))
|
|
||||||
.catch(() => res.status(500).json({ status: "err" }));
|
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error("error on login:", error);
|
console.error("error on login:", error);
|
||||||
res.status(500).json({ status: "err" });
|
res.status(500).json({ status: "err" });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export async function GetUserProfile(req: Request, res: Response) {
|
||||||
|
try {
|
||||||
|
const user = await User.findOne({
|
||||||
|
accountName: req.params.accountName,
|
||||||
|
}).lean();
|
||||||
|
|
||||||
|
if (!user) {
|
||||||
|
return res.status(404).json({ status: "err" });
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log("user:", user);
|
||||||
|
|
||||||
|
res.json({
|
||||||
|
accountName: user.accountName,
|
||||||
|
username: user.username,
|
||||||
|
});
|
||||||
|
} catch (error) {
|
||||||
|
console.error("error on get user profile:", error);
|
||||||
|
res.status(500).json({ status: "err" });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -1,8 +1,13 @@
|
||||||
import mongoose, { InferSchemaType, Schema } from "mongoose";
|
import mongoose, { InferSchemaType, Schema } from "mongoose";
|
||||||
|
import { ADMIN_MAX_USERS_PER_PAGE } from "../utils/utils";
|
||||||
|
|
||||||
export const sessionSchema = new Schema({
|
export const sessionSchema = new Schema({
|
||||||
sessionId: String,
|
sessionId: String,
|
||||||
accountName: String,
|
accountName: String,
|
||||||
|
expiresAt: {
|
||||||
|
type: Date,
|
||||||
|
default: new Date(Date.now() + ADMIN_MAX_USERS_PER_PAGE),
|
||||||
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
export type Session = InferSchemaType<typeof sessionSchema>;
|
export type Session = InferSchemaType<typeof sessionSchema>;
|
||||||
|
|
|
@ -4,6 +4,18 @@ export const userSchema = new Schema({
|
||||||
accountName: String,
|
accountName: String,
|
||||||
username: String,
|
username: String,
|
||||||
password: String,
|
password: String,
|
||||||
|
followers: {
|
||||||
|
type: Number,
|
||||||
|
default: 0,
|
||||||
|
},
|
||||||
|
following: {
|
||||||
|
type: Number,
|
||||||
|
default: 0,
|
||||||
|
},
|
||||||
|
visited: {
|
||||||
|
type: Number,
|
||||||
|
default: 0,
|
||||||
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
export type User = InferSchemaType<typeof userSchema>;
|
export type User = InferSchemaType<typeof userSchema>;
|
||||||
|
|
|
@ -2,8 +2,8 @@ import mongoose from "mongoose";
|
||||||
|
|
||||||
export function initDatabase() {
|
export function initDatabase() {
|
||||||
mongoose.connect("mongodb://localhost:27017/partyapp", {
|
mongoose.connect("mongodb://localhost:27017/partyapp", {
|
||||||
user: "partyapp",
|
user: process.env.MONGODB_USERNAME,
|
||||||
pass: "5ycwujPeNw9NoW9rXTEdwzVHqzb9XM57",
|
pass: process.env.MONGODB_PASSWORD,
|
||||||
});
|
});
|
||||||
|
|
||||||
mongoose.connection.on("connected", () => {
|
mongoose.connection.on("connected", () => {
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
import express from "express";
|
import express from "express";
|
||||||
const router = express.Router();
|
const router = express.Router();
|
||||||
import * as userController from "../controllers/userController";
|
import * as userController from "../controllers/userController";
|
||||||
|
import * as adminController from "../controllers/adminController";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @swagger
|
* @swagger
|
||||||
|
@ -126,4 +127,8 @@ router.post("/user/signup", userController.SignUp);
|
||||||
*/
|
*/
|
||||||
router.post("/user/login", userController.Login);
|
router.post("/user/login", userController.Login);
|
||||||
|
|
||||||
|
router.get("/user/profile/:accountName", userController.GetUserProfile);
|
||||||
|
|
||||||
|
router.get("/admin/users", adminController.GetAllUsers);
|
||||||
|
|
||||||
export default router;
|
export default router;
|
||||||
|
|
|
@ -0,0 +1,28 @@
|
||||||
|
import crypto from "crypto";
|
||||||
|
import { Session } from "../models/session";
|
||||||
|
import { Response } from "express";
|
||||||
|
|
||||||
|
export const DEFAULT_SESSION_EXPIRATION = 7 * 24 * 60 * 60 * 1000; // 7 days
|
||||||
|
export const ADMIN_MAX_USERS_PER_PAGE = 10;
|
||||||
|
|
||||||
|
export async function saveSession(res: Response, accountName: string) {
|
||||||
|
try {
|
||||||
|
// Generate a random session ID
|
||||||
|
const sessionId = crypto.randomBytes(32).toString("hex");
|
||||||
|
|
||||||
|
// Create a new session document
|
||||||
|
const session = new Session({
|
||||||
|
sessionId: sessionId,
|
||||||
|
accountName: accountName, // Assuming you have the user information in req.user
|
||||||
|
});
|
||||||
|
|
||||||
|
// Save the session to MongoDB
|
||||||
|
await session.save();
|
||||||
|
|
||||||
|
// Respond with the session ID
|
||||||
|
res.status(200).json({ sessionId });
|
||||||
|
} catch (error) {
|
||||||
|
console.error("Error saving session:", error);
|
||||||
|
res.status(500).json({ status: "err" });
|
||||||
|
}
|
||||||
|
}
|
Reference in New Issue