Skip to content
Snippets Groups Projects
Commit 27da5c29 authored by STEINMETZ THOMAS's avatar STEINMETZ THOMAS
Browse files

:construction: add endpoint pay_adhesion

parent 1847b4ec
Branches
No related merge requests found
......@@ -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
......
......@@ -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,
},
......
......@@ -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;
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;
......@@ -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);
......
......@@ -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} />
......
......@@ -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'
}
}
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;
}
}
import React from 'react';
export class User extends React.Component {
render() {
return (
<tr>
<td>{this.props.user.username}</td>
</tr>
);
}
}
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))
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
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,
......
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment