From 27da5c29da933704bfa5360358b3ad132490c0dc Mon Sep 17 00:00:00 2001 From: STEINMETZ THOMAS <thomas.steinmetz2@etu.unistra.fr> Date: Fri, 19 Nov 2021 12:23:24 +0100 Subject: [PATCH] :construction: add endpoint pay_adhesion --- backend/app.js | 2 - backend/models/user.js | 3 +- backend/routes/auth.js | 20 +++++++ backend/routes/users.js | 27 --------- backend/tests/test.js | 17 ------ frontend/src/App.js | 6 +- frontend/src/actions/Login.actions.js | 5 +- frontend/src/actions/Users.actions.js | 50 ---------------- frontend/src/components/User.component.js | 11 ---- frontend/src/containers/Users.container.js | 69 ---------------------- frontend/src/reducers/Users.reducer.js | 20 ------- frontend/src/reducers/index.js | 2 - 12 files changed, 26 insertions(+), 206 deletions(-) delete mode 100644 backend/routes/users.js delete mode 100644 frontend/src/actions/Users.actions.js delete mode 100644 frontend/src/components/User.component.js delete mode 100644 frontend/src/containers/Users.container.js delete mode 100644 frontend/src/reducers/Users.reducer.js diff --git a/backend/app.js b/backend/app.js index 2af6a3a..87b275e 100644 --- a/backend/app.js +++ b/backend/app.js @@ -4,7 +4,6 @@ var path = require('path'); var logger = require('morgan'); var passport = require('passport'); const mongoose = require('mongoose'); -var usersRouter = require('./routes/users'); var authRouter = require('./routes/auth'); var app = express(); @@ -30,7 +29,6 @@ var env = process.env.NODE_ENV || 'dev'; if (env == 'production') { app.use("/", express.static(path.join(path.dirname(__dirname), '/frontend/build'))) } -app.use('/api/', usersRouter); app.use('/api/', authRouter); // catch 404 and forward to error handler diff --git a/backend/models/user.js b/backend/models/user.js index af22d66..5fcb0fc 100644 --- a/backend/models/user.js +++ b/backend/models/user.js @@ -43,6 +43,7 @@ const UserSchema = new mongoose.Schema({ student_number: { type: Number, required: true, + unique: true, minlength: 8, maxlength: 8, select: true, @@ -52,7 +53,7 @@ const UserSchema = new mongoose.Schema({ default: 'https://cdn.pixabay.com/photo/2018/09/06/18/26/person-3658927_960_720.png', }, date_subscription: { - type: String, + type: Date, select: false, default: null, }, diff --git a/backend/routes/auth.js b/backend/routes/auth.js index 5ad9797..287f473 100644 --- a/backend/routes/auth.js +++ b/backend/routes/auth.js @@ -123,4 +123,24 @@ router.post('/me/update', passport.authenticate('jwt', {session: false}), async res.status(200).json(); }); +router.post('/pay_adhesion', passport.authenticate('jwt', {session: false}), async function(req, res, next) { + const student_number = req.body.student_number; + + if (!student_number) + return res.status(400); + + const dbUser = await User.findOne({student_number: req.body.student_number}); + + + if (student_number) + dbUser.date_subscription = new Date(); + + try { + await dbUser.save(); + } catch (e) { + return res.status(400).json(e); + } + res.status(200).json(); +}); + module.exports = router; diff --git a/backend/routes/users.js b/backend/routes/users.js deleted file mode 100644 index 40d6752..0000000 --- a/backend/routes/users.js +++ /dev/null @@ -1,27 +0,0 @@ -var express = require('express'); -var router = express.Router(); -const passport = require('passport'); -const User = require('../models/user'); - -router.get('/most-liked', async function(req, res, next) { - - // handle authentication manually, as we want the API to work in both cases, - // but to return 'liked' property if logged in - passport.authenticate('jwt', async function(err, user, info) { - var match = {} - if (user) { - match = {liker: user.id}; - } - const users = await User.find( - ).populate({path:'liked', match: match}).populate({path:'likes'}).sort({'likes': -1}); - res.status(200).json(users); - })(req, res, next); - -}); - -router.get('/user/:username', async function(req, res, next) { - const user = await User.findOne({username: req.params.username}).populate('likes'); - res.status(200).json(user); -}); - -module.exports = router; diff --git a/backend/tests/test.js b/backend/tests/test.js index d9e27aa..46cdbb1 100644 --- a/backend/tests/test.js +++ b/backend/tests/test.js @@ -46,23 +46,6 @@ describe('app', function() { }) - describe('GET /most-liked', function() { - this.timeout(3000); - - before(async function () { - res = await baseUrl.get('/api/most-liked') - .set('Accept', 'application/json') - .set('Content-Type', 'application/json') - .send(); - }); - - it('respond with an array of most liked users', function(done) { - expect(res.status).to.equal(200); - expect(res.body).to.be.an('array'); - done(); - }); - }); - describe('POST /login', function() { this.timeout(3000); diff --git a/frontend/src/App.js b/frontend/src/App.js index 1b71b85..99e646c 100644 --- a/frontend/src/App.js +++ b/frontend/src/App.js @@ -2,7 +2,6 @@ import React, { Component } from 'react'; import './App.css'; import {connect} from 'react-redux'; import {BrowserRouter as Router, Route, Link, Redirect} from "react-router-dom"; -import Users from './containers/Users.container'; import SignUp from './containers/SignUp.container'; import Login from './containers/Login.container'; import Privacy from './containers/Privacy.container' @@ -38,9 +37,6 @@ class App extends Component { <Navbar bg="dark" expand="lg" variant="dark"> <Navbar.Brand>STUDENT</Navbar.Brand> <Nav className="mr-auto"> - <Nav.Link as={Link} to="/"> - Utilisateurs - </Nav.Link> {!this.props.loginState.loggedIn && <Nav.Link as={Link} to="/signup/"> S'inscrire @@ -101,7 +97,7 @@ class App extends Component { </Modal> } - <Route path="/" exact component={Users} /> + <Route path="/" exact component={this.props.loginState.loggedIn ? Profile : Login} /> <Route path="/signup/" component={SignUp} /> <Route path="/login/" component={Login} /> <Route path="/privacy/" component={Privacy} /> diff --git a/frontend/src/actions/Login.actions.js b/frontend/src/actions/Login.actions.js index 44c4a25..967ae30 100644 --- a/frontend/src/actions/Login.actions.js +++ b/frontend/src/actions/Login.actions.js @@ -54,9 +54,11 @@ export const login = (loginData, ownProps) => { if(response.ok){ response.json().then(data => { userService.setToken(data.token); - dispatch(fetchUserData()); + let user = dispatch(fetchUserData()); + //dispatch(user); ownProps.history.push('/'); // TODO: do another request to know if user paid adhesion + console.log(user) var paid=true; if(paid){ userService.setAdhesion(true); @@ -89,4 +91,3 @@ export const reinitializeState = () => { type:'REINITIALIZE_STATE' } } - diff --git a/frontend/src/actions/Users.actions.js b/frontend/src/actions/Users.actions.js deleted file mode 100644 index be9177a..0000000 --- a/frontend/src/actions/Users.actions.js +++ /dev/null @@ -1,50 +0,0 @@ -import { userService } from "../services/authentication.service"; - -export const fetchUsersSuccess = (users) => { - return { - type: 'FETCH_USERS_SUCCESS', - users: users, - receivedAt: Date.now - } -} - -export const fetchUsersFailed = (error) => { - return { - type:'FETCH_USERS_FAILED', - error - } -} - -export const fetchUsersRequest = () => { - return { - type:'FETCH_USERS_REQUEST' - } -} - -export const fetchUsers = () => { - return async (dispatch) => { - dispatch(fetchUsersRequest()); - - const response = await fetch( "/api/most-liked", { - headers: { - 'Authorization': userService.getToken() - } - }); - - if(response.ok){ - response.json().then(data => { - data.sort(function(a, b){ - return b.likes - a.likes; - }); - dispatch(fetchUsersSuccess(data)); - }).catch(err => dispatch(fetchUsersFailed(err))); - } - else{ - response.json().then(error => { - dispatch(fetchUsersFailed(error)); - }).catch(err => dispatch(fetchUsersFailed(err))); - } - - return response; - } -} diff --git a/frontend/src/components/User.component.js b/frontend/src/components/User.component.js deleted file mode 100644 index 5e1d9db..0000000 --- a/frontend/src/components/User.component.js +++ /dev/null @@ -1,11 +0,0 @@ -import React from 'react'; - -export class User extends React.Component { - render() { - return ( - <tr> - <td>{this.props.user.username}</td> - </tr> - ); - } -} diff --git a/frontend/src/containers/Users.container.js b/frontend/src/containers/Users.container.js deleted file mode 100644 index 207561f..0000000 --- a/frontend/src/containers/Users.container.js +++ /dev/null @@ -1,69 +0,0 @@ -import { connect } from 'react-redux'; -import React from 'react'; -import { withRouter } from 'react-router-dom' -import * as userActions from '../actions/Users.actions'; -import { User } from '../components/User.component'; -import { Card, Table, Nav } from 'react-bootstrap'; -import { Link} from "react-router-dom"; - -export class Users extends React.Component { - // constructor(props){ - // super(props); - // } - - componentDidMount(){ - this.props.fetchUsers(); - } - - render() { - return ( - <div> - <Card style={{ width: '90vw', margin: '0 auto', marginTop:'30px' }}> - <Card.Body> - <Card.Title>Utilisateurs</Card.Title> - <Table striped bordered hover> - <thead> - <tr> - <td>Nom d'utilisateur</td> - </tr> - </thead> - <tbody> - {this.props.state.users.map((value, index) => { - return <User key={index} likeUser={this.props.likeUser} unlikeUser={this.props.unlikeUser} user={value} appState={this.props.loginState} profileState={this.props.profileState}></User> - })} - </tbody> - </Table> - {this.props.state.error && <div>Une erreur est survenue pendant le chargement des utilisateurs.</div>} - {this.props.state.loading && <div>Chargement...</div>} - </Card.Body> - </Card> - <footer className="footer mt-auto py-3"> - <div className="container" style={{ textAlign : "center"}}> - <Nav.Link as={Link} to="/privacy/"> - Politique de confidentialité - </Nav.Link> - </div> - </footer> - </div> - ); - } -} - -// map state from store to props -const mapStateToProps = (state) => { - return { - state: state.users, - loginState: state.login, - profileState: state.profile, - } -} - -// map actions to props -const mapDispatchToProps = (dispatch) => { - return { - fetchUsers: () => dispatch(userActions.fetchUsers()), - } -} - - -export default withRouter(connect(mapStateToProps, mapDispatchToProps)(Users)) diff --git a/frontend/src/reducers/Users.reducer.js b/frontend/src/reducers/Users.reducer.js deleted file mode 100644 index 68ab73c..0000000 --- a/frontend/src/reducers/Users.reducer.js +++ /dev/null @@ -1,20 +0,0 @@ -const INITIAL_STATE = { - users: [], - loading: true, - error: false -} - -const usersReducer = (currentState = INITIAL_STATE, action) => { - switch (action.type) { - case 'FETCH_USERS_SUCCESS': - return {...currentState, loading: false, users: action.users, error: false}; - case 'FETCH_USERS_REQUEST': - return {...currentState, loading: true, error: false}; - case 'FETCH_USERS_FAILED': - return {...currentState, error: true, loading: false}; - default: - return currentState; - } -} - -export default usersReducer; \ No newline at end of file diff --git a/frontend/src/reducers/index.js b/frontend/src/reducers/index.js index b037e3a..c9bd461 100644 --- a/frontend/src/reducers/index.js +++ b/frontend/src/reducers/index.js @@ -1,14 +1,12 @@ import { routerReducer } from 'react-router-redux'; import { combineReducers } from 'redux'; import appReducer from './App.reducer'; -import usersReducer from './Users.reducer'; import signupReducer from './SignUp.reducer'; import loginReducer from './Login.reducer'; import profileReducer from './Profile.reducer'; export default combineReducers({ app:appReducer, - users:usersReducer, signup:signupReducer, login:loginReducer, profile:profileReducer, -- GitLab