Some fixes
This commit is contained in:
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
@@ -0,0 +1 @@
|
||||
node_modules
|
||||
@@ -1,7 +0,0 @@
|
||||
{
|
||||
"folders": [
|
||||
{
|
||||
"path": "."
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -21,6 +21,7 @@ const activate = async (req, res, next) => {
|
||||
};
|
||||
|
||||
const loginUser = async (req, res, next) => {
|
||||
console.log('login');
|
||||
try {
|
||||
const { email, password } = req.body;
|
||||
const result = await login(email, password);
|
||||
|
||||
@@ -6,49 +6,72 @@ import { getUserByToken } from '../utils/userUtils.js';
|
||||
|
||||
const getClubs = async (req, res) => {
|
||||
const clubs = await Club.findAll();
|
||||
console.log(clubs);
|
||||
res.status(200).json(clubs);
|
||||
};
|
||||
|
||||
const addClub = async (req, res) => {
|
||||
const { hashedId: token} = req.headers;
|
||||
const addClub = async (req, res) => {
|
||||
const { authcode: token } = req.headers;
|
||||
const { name: clubName } = req.body;
|
||||
const club = await Club.findOne({
|
||||
where: where(fn('LOWER', col('name')), 'LIKE', `%${clubName.toLowerCase()}%`)
|
||||
});
|
||||
const user = getUserByToken(token);
|
||||
const user = await getUserByToken(token);
|
||||
if (club) {
|
||||
res.status(409).json({ error: "alreadyexists" });
|
||||
return;
|
||||
}
|
||||
const newClub = Club.create({ name: clubName });
|
||||
UserClub.create({userId: user.id, clubId: newClub.id });
|
||||
UserClub.create({ userId: user.id, clubId: newClub.id, approved: true });
|
||||
res.status(200).json(newClub);
|
||||
}
|
||||
|
||||
const getClub = async(req, res) => {
|
||||
const { hashedId: token } = req.headers;
|
||||
const getClub = async (req, res) => {
|
||||
const { authcode: token } = req.headers;
|
||||
const { clubid: clubId } = req.params;
|
||||
const user = getUserByToken(token);
|
||||
console.log('load club', token)
|
||||
const user = await getUserByToken(token);
|
||||
console.log(user);
|
||||
const access = await UserClub.findAll({
|
||||
where: {
|
||||
userId: user.id,
|
||||
clubId: clubId,
|
||||
approved: true
|
||||
clubId: clubId,
|
||||
}
|
||||
});
|
||||
if (access.length === 0) {
|
||||
res.status(403).json({ error: "noaccess" });
|
||||
if (access.length === 0 || !access[0].approved) {
|
||||
res.status(403).json({ error: "noaccess", status: access.length === 0 ? "notrequested" : "requested" });
|
||||
return;
|
||||
}
|
||||
const club = await Club.findOne({ where: { id: clubId }});
|
||||
res.status(200).json(club);
|
||||
try {
|
||||
const club = await Club.findByPk(clubId, {
|
||||
include: [
|
||||
{
|
||||
model: Member,
|
||||
as: 'Members',
|
||||
},
|
||||
{
|
||||
model: User,
|
||||
as: 'Users',
|
||||
through: {
|
||||
attributes: []
|
||||
}
|
||||
}
|
||||
]
|
||||
});
|
||||
|
||||
if (!club) {
|
||||
return res.status(404).json({ message: 'Club not found' });
|
||||
}
|
||||
res.status(200).json(club);
|
||||
} catch (error) {
|
||||
console.error('err', error);
|
||||
res.status(500).json({ message: 'Server error' });
|
||||
}
|
||||
}
|
||||
|
||||
const approveClubAccess = async(req, res) => {
|
||||
const { hashedId: token } = req.headers;
|
||||
const approveClubAccess = async (req, res) => {
|
||||
const { authcode: token } = req.headers;
|
||||
const { clubid: clubId, approveemail: toApproveEmail } = req.body;
|
||||
const user = getUserByToken(token);
|
||||
const user = await getUserByToken(token);
|
||||
const access = await UserClub.findAll({
|
||||
where: {
|
||||
userId: user.id,
|
||||
@@ -83,4 +106,34 @@ const approveClubAccess = async(req, res) => {
|
||||
res.status(200).json({ status: 'ok' });
|
||||
}
|
||||
|
||||
export { getClubs, addClub, getClub, approveClubAccess };
|
||||
const requestClubAccess = async(req, res) => {
|
||||
const { authcode: token } = req.headers;
|
||||
const { clubid: clubId } = req.params;
|
||||
const user = await getUserByToken(token);
|
||||
console.log(user);
|
||||
const access = await UserClub.findAll({
|
||||
where: {
|
||||
userId: user.id,
|
||||
clubId: clubId,
|
||||
}
|
||||
});
|
||||
if (access.length > 0) {
|
||||
res.status(409).json({ err: "alreadyrequested"});
|
||||
return;
|
||||
}
|
||||
const club = Club.findOne({ where: {
|
||||
id: clubId
|
||||
}});
|
||||
if (!club) {
|
||||
res.status(404).json({ err: "clubnotfound" });
|
||||
return;
|
||||
}
|
||||
UserClub.create({
|
||||
userId: user.id,
|
||||
clubId: clubId,
|
||||
approved: false
|
||||
});
|
||||
res.status(200).json({});
|
||||
}
|
||||
|
||||
export { getClubs, addClub, getClub, approveClubAccess, requestClubAccess };
|
||||
@@ -1,4 +1,4 @@
|
||||
import MemberService from "../services/memberService";
|
||||
import MemberService from "../services/memberService.js";
|
||||
|
||||
const getClubMembers = async(req, res) => {
|
||||
const { clubid: clubId } = req.body;
|
||||
@@ -8,7 +8,7 @@ const getClubMembers = async(req, res) => {
|
||||
const getWaitingApprovals = async(req, res) => {
|
||||
try {
|
||||
const { clubid: clubId } = req.params;
|
||||
const { hashedId: userToken} = req.headers;
|
||||
const { authcode: userToken} = req.headers;
|
||||
const waitingApprovals = MemberService.getApprovalRequests(userToken, clubId);
|
||||
res.status(200).json(waitingApprovals);
|
||||
} catch(error) {
|
||||
@@ -16,4 +16,4 @@ const getWaitingApprovals = async(req, res) => {
|
||||
}
|
||||
}
|
||||
|
||||
export default { getClubMembers, getWaitingApprovals };
|
||||
export { getClubMembers, getWaitingApprovals };
|
||||
@@ -18,6 +18,9 @@ const Log = sequelize.define('Log', {
|
||||
key: 'id',
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
underscored: true
|
||||
});
|
||||
|
||||
export default Log;
|
||||
|
||||
@@ -82,10 +82,12 @@ Member.init({
|
||||
}
|
||||
}
|
||||
}, {
|
||||
underscored: true,
|
||||
sequelize,
|
||||
modelName: 'Member',
|
||||
tableName: 'members',
|
||||
timestamps: true,
|
||||
|
||||
hooks: {
|
||||
beforeCreate: (member) => {
|
||||
member.hashedId = crypto.createHash('sha256').update(String(member.id)).digest('hex');
|
||||
|
||||
@@ -29,6 +29,8 @@ const User = sequelize.define('User', {
|
||||
allowNull: true
|
||||
}
|
||||
}, {
|
||||
underscored: true,
|
||||
table: 'user',
|
||||
hooks: {
|
||||
beforeCreate: async (user) => {
|
||||
const salt = await bcrypt.genSalt(10);
|
||||
|
||||
@@ -17,11 +17,13 @@ const UserClub = sequelize.define('UserClub', {
|
||||
model: Club,
|
||||
key: 'id',
|
||||
},
|
||||
},
|
||||
},
|
||||
approved: {
|
||||
type: DataTypes.BOOLEAN,
|
||||
defaultValue: false,
|
||||
},
|
||||
}, {
|
||||
underscored: true
|
||||
});
|
||||
|
||||
User.belongsToMany(Club, { through: UserClub, foreignKey: 'userId' });
|
||||
|
||||
1184
backend/node_modules/.package-lock.json
generated
vendored
1184
backend/node_modules/.package-lock.json
generated
vendored
File diff suppressed because it is too large
Load Diff
1188
backend/package-lock.json
generated
1188
backend/package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@@ -13,6 +13,7 @@
|
||||
"description": "",
|
||||
"dependencies": {
|
||||
"bcrypt": "^5.1.1",
|
||||
"cors": "^2.8.5",
|
||||
"crypto": "^1.0.1",
|
||||
"dotenv": "^16.4.5",
|
||||
"express": "^4.19.2",
|
||||
|
||||
@@ -1,11 +1,12 @@
|
||||
import express from 'express';
|
||||
import { authenticate } from '../middleware/authMiddleware.js';
|
||||
import { getClubs, addClub, getClub } from '../controllers/clubsController.js';
|
||||
import { getClubs, addClub, getClub, requestClubAccess } from '../controllers/clubsController.js';
|
||||
|
||||
const router = express.Router();
|
||||
|
||||
router.get('/', authenticate, getClubs);
|
||||
router.post('/', authenticate, addClub);
|
||||
router.get('/:clubid', authenticate, getClub);
|
||||
router.get('/request/:clubid', authenticate, requestClubAccess);
|
||||
|
||||
export default router;
|
||||
@@ -1,8 +1,8 @@
|
||||
import { getClubMembers, getWaitingApprovals } from '../controllers/memberController';
|
||||
import { getClubMembers, getWaitingApprovals } from '../controllers/memberController.js';
|
||||
import express from 'express';
|
||||
import { authenticate } from '../middleware/authMiddleware';
|
||||
import { authenticate } from '../middleware/authMiddleware.js';
|
||||
|
||||
const router = express.Router;
|
||||
const router = express.Router();
|
||||
|
||||
router.post('/', authenticate, getClubMembers);
|
||||
router.get('/notapproved/:id', authenticate, getWaitingApprovals);
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import { UserClub } from "../models";
|
||||
import { checkAccess } from "../utils/userUtils";
|
||||
import UserClub from "../models/UserClub.js";
|
||||
import { checkAccess } from "../utils/userUtils.js";
|
||||
|
||||
class MemberService {
|
||||
async getApprovalRequests(userToken, clubId) {
|
||||
|
||||
@@ -1,9 +1,10 @@
|
||||
import { User, UserClub } from "../models";
|
||||
import User from '../models/User.js'
|
||||
import UserClub from '../models/UserClub.js';
|
||||
|
||||
export const getUserByToken = async(token) => {
|
||||
const user = await User.findOne({
|
||||
where: [
|
||||
{hashedId: token}
|
||||
{hashed_id: token}
|
||||
]
|
||||
});
|
||||
return user;
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
<option value="new">Neuer Verein</option>
|
||||
<option v-for="club in clubs" :key="club.id" :value="club.id">{{ club.name }}</option>
|
||||
</select>
|
||||
<button @click="loadClub">-></button>
|
||||
</div>
|
||||
<router-view></router-view>
|
||||
</div>
|
||||
@@ -40,6 +41,10 @@ export default {
|
||||
},
|
||||
methods: {
|
||||
...mapActions(['setCurrentClub', 'setClubs']),
|
||||
loadClub() {
|
||||
this.setCurrentClub(this.currentClub);
|
||||
this.$router.push(`/showclub/${this.currentClub}`);
|
||||
},
|
||||
},
|
||||
async mounted() {
|
||||
const response = await apiClient.get('/clubs');
|
||||
|
||||
@@ -1,13 +1,24 @@
|
||||
<template>
|
||||
<h2>Verein {{ club.name }}</h2>
|
||||
<div v-if="openRequests.length > 0">
|
||||
<h3>Offene Anfragen auf Zugriff</h3>
|
||||
</div>
|
||||
<div>
|
||||
<h3>Mitglieder</h3>
|
||||
</div>
|
||||
<div>
|
||||
<h3>Traingstagebuch</h3>
|
||||
<h2>Verein {{ club.name }}</h2>
|
||||
<div v-if="accessAllowed">
|
||||
<div v-if="openRequests.length > 0">
|
||||
<h3>Offene Anfragen auf Zugriff</h3>
|
||||
<!-- Hier könntest du die offenen Anfragen anzeigen -->
|
||||
</div>
|
||||
<div>
|
||||
<h3>Mitglieder</h3>
|
||||
<!-- Hier könntest du die Mitglieder anzeigen -->
|
||||
</div>
|
||||
<div>
|
||||
<h3>Trainingstagebuch</h3>
|
||||
<!-- Hier könntest du das Trainingstagebuch anzeigen -->
|
||||
</div>
|
||||
</div>
|
||||
<div v-else>
|
||||
<div>Für diesen Verein wurde Dir noch kein Zugriff gestattet.</div>
|
||||
<button @click="requestAccess">Zugriff beantragen</button>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
@@ -17,19 +28,54 @@ import apiClient from '../apiClient';
|
||||
|
||||
export default {
|
||||
name: "ClubView",
|
||||
computed: {
|
||||
...mapGetters(['isAuthenticated', 'currentClub', 'clubs']),
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
club: {
|
||||
club: {
|
||||
name: '',
|
||||
},
|
||||
openRequests: []
|
||||
openRequests: [],
|
||||
accessAllowed: false
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
async loadClub() {
|
||||
try {
|
||||
const response = await apiClient.get(`/clubs/${this.currentClub}`);
|
||||
this.club = response.data;
|
||||
this.accessAllowed = true;
|
||||
} catch (error) {
|
||||
console.error("Zugriff auf den Verein nicht gestattet", error);
|
||||
this.accessAllowed = false;
|
||||
}
|
||||
},
|
||||
async loadOpenRequests() {
|
||||
const notApproved = apiClient.get('/clubmembers/notapproved/' + id);
|
||||
this.openRequests = notApproved.data;
|
||||
try {
|
||||
const response = await apiClient.get(`/clubmembers/notapproved/${this.currentClub}`);
|
||||
this.openRequests = response.data;
|
||||
} catch (error) {
|
||||
console.error("Fehler beim Laden der offenen Anfragen", error);
|
||||
}
|
||||
},
|
||||
async requestAccess() {
|
||||
console.log('start request');
|
||||
const response = await apiClient.get(`/clubs/request/${this.currentClub}`);
|
||||
if (response.status === 200) {
|
||||
alert('Zugriff wurde angefragt');
|
||||
}
|
||||
}
|
||||
},
|
||||
async mounted() {
|
||||
await this.loadClub();
|
||||
await this.loadOpenRequests();
|
||||
}
|
||||
}
|
||||
</script>
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
h2 {
|
||||
display: block;
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
<template>
|
||||
<div>
|
||||
<h2>Home</h2>
|
||||
<p v-if="!isAuthenticated">You are not logged in. <router-link to="/login">Login</router-link> or <router-link to="/register">Register</router-link></p>
|
||||
<p v-else>Welcome! <button @click="logout">Logout</button></p>
|
||||
<p v-if="!isAuthenticated">Du bist nicht eingeloggt.<router-link to="/login">Einloggen</router-link> oder <router-link to="/register">Registrieren</router-link></p>
|
||||
<p v-else>Herzlich Willkommen <button @click="logout">Ausloggen</button></p>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
|
||||
4906
package-lock.json
generated
Normal file
4906
package-lock.json
generated
Normal file
File diff suppressed because it is too large
Load Diff
24
package.json
Normal file
24
package.json
Normal file
@@ -0,0 +1,24 @@
|
||||
{
|
||||
"name": "trainingstagebuch",
|
||||
"version": "1.0.0",
|
||||
"main": "index.js",
|
||||
"scripts": {
|
||||
"test": "echo \"Error: no test specified\" && exit 1"
|
||||
},
|
||||
"keywords": [],
|
||||
"author": "",
|
||||
"license": "ISC",
|
||||
"description": "",
|
||||
"devDependencies": {
|
||||
"@babel/cli": "^7.24.8",
|
||||
"@babel/core": "^7.25.2",
|
||||
"@babel/preset-env": "^7.25.3",
|
||||
"eslint": "^8.57.0",
|
||||
"eslint-config-airbnb-base": "^15.0.0",
|
||||
"eslint-plugin-import": "^2.29.1"
|
||||
},
|
||||
"dependencies": {
|
||||
"@babel/eslint-parser": "^7.25.1",
|
||||
"vue-eslint-parser": "^9.4.3"
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user