mirror of
https://github.com/muerwre/orchidmap-front.git
synced 2025-04-25 11:06:40 +07:00
routes: backend endpoint
This commit is contained in:
parent
d11dd9043c
commit
c69da00b2a
10 changed files with 106 additions and 15 deletions
|
@ -1,10 +1,12 @@
|
||||||
const express = require('express');
|
const express = require('express');
|
||||||
const post = require('./route/post');
|
const post = require('./route/post');
|
||||||
const get = require('./route/get');
|
const get = require('./route/get');
|
||||||
|
const list = require('./route/list');
|
||||||
|
|
||||||
const router = express.Router();
|
const router = express.Router();
|
||||||
|
|
||||||
router.post('/', post);
|
router.post('/', post);
|
||||||
router.get('/', get);
|
router.get('/', get);
|
||||||
|
router.get('/list', list);
|
||||||
|
|
||||||
module.exports = router;
|
module.exports = router;
|
||||||
|
|
50
backend/routes/route/list.js
Normal file
50
backend/routes/route/list.js
Normal file
|
@ -0,0 +1,50 @@
|
||||||
|
const { Route, User } = require('../../models');
|
||||||
|
|
||||||
|
module.exports = async (req, res) => {
|
||||||
|
const {
|
||||||
|
query: {
|
||||||
|
id, token, title, distance, author, starred,
|
||||||
|
}
|
||||||
|
} = req;
|
||||||
|
|
||||||
|
const user = await User.findOne({ _id: id, token });
|
||||||
|
|
||||||
|
let criteria = {};
|
||||||
|
|
||||||
|
if (title) {
|
||||||
|
criteria = {
|
||||||
|
...criteria,
|
||||||
|
$or: [
|
||||||
|
{ title: new RegExp(title, 'ig') },
|
||||||
|
{ _id: new RegExp(title, 'ig') },
|
||||||
|
],
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!author || !user || (user._id !== author)) {
|
||||||
|
criteria = {
|
||||||
|
...criteria,
|
||||||
|
public: true,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
const list = await Route.find({
|
||||||
|
...criteria,
|
||||||
|
distance: {
|
||||||
|
$gte: parseInt(distance[0], 10),
|
||||||
|
$lte: parseInt(distance[1], 10),
|
||||||
|
},
|
||||||
|
public: true,
|
||||||
|
}, '_id title distance owner updated_at', { limit: 500 }).populate('owner');
|
||||||
|
|
||||||
|
|
||||||
|
const filtered = list.filter(item => (
|
||||||
|
!author || item.owner._id === author
|
||||||
|
));
|
||||||
|
|
||||||
|
res.send({
|
||||||
|
success: true,
|
||||||
|
list: filtered,
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
|
@ -5,7 +5,6 @@ import { connect } from 'react-redux';
|
||||||
import { RouteRow } from '$components/maps/RouteRow';
|
import { RouteRow } from '$components/maps/RouteRow';
|
||||||
import { Scroll } from '$components/Scroll';
|
import { Scroll } from '$components/Scroll';
|
||||||
import {
|
import {
|
||||||
searchSetAuthor,
|
|
||||||
searchSetDistance,
|
searchSetDistance,
|
||||||
searchSetTitle,
|
searchSetTitle,
|
||||||
} from '$redux/user/actions';
|
} from '$redux/user/actions';
|
||||||
|
@ -98,11 +97,11 @@ class Component extends React.Component<Props> {
|
||||||
<Scroll className="dialog-shader">
|
<Scroll className="dialog-shader">
|
||||||
<div className="dialog-maplist">
|
<div className="dialog-maplist">
|
||||||
{
|
{
|
||||||
list.map((route, index) => (
|
list.map(route => (
|
||||||
<RouteRow
|
<RouteRow
|
||||||
editing={editing}
|
editing={editing}
|
||||||
{...route}
|
{...route}
|
||||||
key={index}
|
key={route._id}
|
||||||
/>
|
/>
|
||||||
))
|
))
|
||||||
}
|
}
|
||||||
|
@ -120,7 +119,6 @@ const mapStateToProps = ({ user: { editing, routes } }) => ({
|
||||||
});
|
});
|
||||||
|
|
||||||
const mapDispatchToProps = dispatch => bindActionCreators({
|
const mapDispatchToProps = dispatch => bindActionCreators({
|
||||||
searchSetAuthor,
|
|
||||||
searchSetDistance,
|
searchSetDistance,
|
||||||
searchSetTitle,
|
searchSetTitle,
|
||||||
}, dispatch);
|
}, dispatch);
|
||||||
|
|
|
@ -33,7 +33,7 @@ type Props = {
|
||||||
|
|
||||||
class Component extends React.PureComponent<Props, void> {
|
class Component extends React.PureComponent<Props, void> {
|
||||||
componentDidMount() {
|
componentDidMount() {
|
||||||
window.addEventListener('keydown', this.props.keyPressed);
|
window.addEventListener('keydown', this.keyPressed);
|
||||||
|
|
||||||
const obj = document.getElementById('control-dialog');
|
const obj = document.getElementById('control-dialog');
|
||||||
const { width } = this.panel.getBoundingClientRect();
|
const { width } = this.panel.getBoundingClientRect();
|
||||||
|
@ -44,9 +44,21 @@ class Component extends React.PureComponent<Props, void> {
|
||||||
}
|
}
|
||||||
|
|
||||||
componentWillUnmount() {
|
componentWillUnmount() {
|
||||||
window.removeEventListener('keydown', this.props.keyPressed);
|
window.removeEventListener('keydown', this.keyPressed);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
keyPressed = e => {
|
||||||
|
// if (
|
||||||
|
// e.target.tagName === 'INPUT' ||
|
||||||
|
// e.target.tagName === 'TEXTAREA'
|
||||||
|
// ) {
|
||||||
|
// if (e.key === 'Escape') e.target.blur();
|
||||||
|
// return;
|
||||||
|
// }
|
||||||
|
|
||||||
|
this.props.keyPressed(e);
|
||||||
|
};
|
||||||
|
|
||||||
startPolyMode = () => this.props.setMode(MODES.POLY);
|
startPolyMode = () => this.props.setMode(MODES.POLY);
|
||||||
startStickerMode = () => this.props.setMode(MODES.STICKERS_SELECT);
|
startStickerMode = () => this.props.setMode(MODES.STICKERS_SELECT);
|
||||||
startRouterMode = () => this.props.setMode(MODES.ROUTER);
|
startRouterMode = () => this.props.setMode(MODES.ROUTER);
|
||||||
|
|
|
@ -6,4 +6,6 @@ export const API = {
|
||||||
IFRAME_LOGIN_VK: `${CLIENT.API_ADDR}/auth/iframe/vk`,
|
IFRAME_LOGIN_VK: `${CLIENT.API_ADDR}/auth/iframe/vk`,
|
||||||
GET_MAP: `${CLIENT.API_ADDR}/route`,
|
GET_MAP: `${CLIENT.API_ADDR}/route`,
|
||||||
POST_MAP: `${CLIENT.API_ADDR}/route`,
|
POST_MAP: `${CLIENT.API_ADDR}/route`,
|
||||||
|
|
||||||
|
GET_ROUTE_LIST: `${CLIENT.API_ADDR}/route/list`,
|
||||||
};
|
};
|
||||||
|
|
|
@ -51,3 +51,4 @@ export const keyPressed = ({ key }) => ({ type: ACTIONS.KEY_PRESSED, key });
|
||||||
export const searchSetTitle = title => ({ type: ACTIONS.SEARCH_SET_TITLE, title });
|
export const searchSetTitle = title => ({ type: ACTIONS.SEARCH_SET_TITLE, title });
|
||||||
export const searchSetDistance = distance => ({ type: ACTIONS.SEARCH_SET_DISTANCE, distance });
|
export const searchSetDistance = distance => ({ type: ACTIONS.SEARCH_SET_DISTANCE, distance });
|
||||||
export const searchSetTab = tab => ({ type: ACTIONS.SEARCH_SET_TAB, tab });
|
export const searchSetTab = tab => ({ type: ACTIONS.SEARCH_SET_TAB, tab });
|
||||||
|
export const searchPutRoutes = list => ({ type: ACTIONS.SEARCH_PUT_ROUTES, list })
|
||||||
|
|
|
@ -55,4 +55,5 @@ export const ACTIONS = ({
|
||||||
SEARCH_SET_DISTANCE: 'SEARCH_SET_DISTANCE',
|
SEARCH_SET_DISTANCE: 'SEARCH_SET_DISTANCE',
|
||||||
|
|
||||||
SEARCH_SET_TAB: 'SEARCH_SET_TAB',
|
SEARCH_SET_TAB: 'SEARCH_SET_TAB',
|
||||||
|
SEARCH_PUT_ROUTES: 'SEARCH_PUT_ROUTES',
|
||||||
}: { [key: String]: String });
|
}: { [key: String]: String });
|
||||||
|
|
|
@ -128,6 +128,14 @@ const searchSetTab = (state, { tab = 'mine' }) => ({
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const searchPutRoutes = (state, { list = [] }) => ({
|
||||||
|
...state,
|
||||||
|
routes: {
|
||||||
|
...state.routes,
|
||||||
|
list,
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
const HANDLERS = ({
|
const HANDLERS = ({
|
||||||
[ACTIONS.SET_USER]: setUser,
|
[ACTIONS.SET_USER]: setUser,
|
||||||
[ACTIONS.SET_EDITING]: setEditing,
|
[ACTIONS.SET_EDITING]: setEditing,
|
||||||
|
@ -159,13 +167,13 @@ const HANDLERS = ({
|
||||||
[ACTIONS.SEARCH_SET_TITLE]: searchSetTitle,
|
[ACTIONS.SEARCH_SET_TITLE]: searchSetTitle,
|
||||||
[ACTIONS.SEARCH_SET_DISTANCE]: searchSetDistance,
|
[ACTIONS.SEARCH_SET_DISTANCE]: searchSetDistance,
|
||||||
[ACTIONS.SEARCH_SET_TAB]: searchSetTab,
|
[ACTIONS.SEARCH_SET_TAB]: searchSetTab,
|
||||||
|
[ACTIONS.SEARCH_PUT_ROUTES]: searchPutRoutes,
|
||||||
}: { [key: String]: Function });
|
}: { [key: String]: Function });
|
||||||
|
|
||||||
export const INITIAL_STATE = {
|
export const INITIAL_STATE = {
|
||||||
ready: false,
|
ready: false,
|
||||||
user: { ...DEFAULT_USER },
|
user: { ...DEFAULT_USER },
|
||||||
editing: false,
|
editing: false,
|
||||||
// mode: MODES.NONE,
|
|
||||||
mode: MODES.NONE,
|
mode: MODES.NONE,
|
||||||
logo: DEFAULT_LOGO,
|
logo: DEFAULT_LOGO,
|
||||||
routerPoints: 0,
|
routerPoints: 0,
|
||||||
|
|
|
@ -4,12 +4,12 @@ import { takeLatest, select, call, put, takeEvery, race, take } from 'redux-saga
|
||||||
import {
|
import {
|
||||||
checkIframeToken,
|
checkIframeToken,
|
||||||
checkUserToken,
|
checkUserToken,
|
||||||
getGuestToken,
|
getGuestToken, getRouteList,
|
||||||
getStoredMap,
|
getStoredMap,
|
||||||
postMap
|
postMap
|
||||||
} from '$utils/api';
|
} from '$utils/api';
|
||||||
import {
|
import {
|
||||||
hideRenderer,
|
hideRenderer, searchPutRoutes,
|
||||||
setActiveSticker, setAddress,
|
setActiveSticker, setAddress,
|
||||||
setChanged, setDialogActive,
|
setChanged, setDialogActive,
|
||||||
setEditing,
|
setEditing,
|
||||||
|
@ -431,15 +431,24 @@ function* keyPressedSaga({ key }): void {
|
||||||
if (dialog_active) return yield put(setDialogActive(false));
|
if (dialog_active) return yield put(setDialogActive(false));
|
||||||
if (mode !== MODES.NONE) return yield put(setMode(MODES.NONE));
|
if (mode !== MODES.NONE) return yield put(setMode(MODES.NONE));
|
||||||
}
|
}
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function* searchSetSaga() {
|
function* searchSetSaga() {
|
||||||
yield delay(500);
|
const { id, token } = yield select(getUser);
|
||||||
const { routes: { filter: { title, distance, tab }}} = yield select(getState);
|
|
||||||
|
|
||||||
console.log({ title, distance, tab });
|
yield delay(500);
|
||||||
|
const { routes: { filter: { title, distance, tab } } } = yield select(getState);
|
||||||
|
|
||||||
|
const list = yield call(getRouteList, {
|
||||||
|
id,
|
||||||
|
token,
|
||||||
|
title,
|
||||||
|
distance,
|
||||||
|
author: tab === 'mine' ? id : '',
|
||||||
|
starred: tab === 'starred',
|
||||||
|
});
|
||||||
|
|
||||||
|
yield put(searchPutRoutes(list));
|
||||||
}
|
}
|
||||||
|
|
||||||
export function* userSaga() {
|
export function* userSaga() {
|
||||||
|
@ -478,5 +487,5 @@ export function* userSaga() {
|
||||||
yield takeLatest([
|
yield takeLatest([
|
||||||
ACTIONS.SEARCH_SET_TITLE,
|
ACTIONS.SEARCH_SET_TITLE,
|
||||||
ACTIONS.SEARCH_SET_DISTANCE,
|
ACTIONS.SEARCH_SET_DISTANCE,
|
||||||
], searchSetSaga)
|
], searchSetSaga);
|
||||||
}
|
}
|
||||||
|
|
|
@ -37,3 +37,11 @@ export const postMap = ({
|
||||||
export const checkIframeToken = ({ viewer_id, auth_key }) => axios.get(API.IFRAME_LOGIN_VK, {
|
export const checkIframeToken = ({ viewer_id, auth_key }) => axios.get(API.IFRAME_LOGIN_VK, {
|
||||||
params: { viewer_id, auth_key }
|
params: { viewer_id, auth_key }
|
||||||
}).then(result => (result && result.data && result.data.success && result.data.user)).catch(() => (false));
|
}).then(result => (result && result.data && result.data.success && result.data.user)).catch(() => (false));
|
||||||
|
|
||||||
|
export const getRouteList = ({
|
||||||
|
title, distance, author, starred
|
||||||
|
}) => axios.get(API.GET_ROUTE_LIST, {
|
||||||
|
params: {
|
||||||
|
title, distance, author, starred
|
||||||
|
}
|
||||||
|
}).then(result => (result && result.data && result.data.success && result.data.list)).catch(() => ([]));
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue