diff --git a/.vscode/vscode-kanban.json b/.vscode/vscode-kanban.json
new file mode 100644
index 00000000..47a6e887
--- /dev/null
+++ b/.vscode/vscode-kanban.json
@@ -0,0 +1,142 @@
+{
+ "done": [],
+ "in-progress": [],
+ "testing": [
+ {
+ "assignedTo": {
+ "name": "lesion"
+ },
+ "category": "feature",
+ "creation_time": "2019-04-23T19:47:35.777Z",
+ "id": "5",
+ "prio": 3,
+ "references": [],
+ "title": "server side auth"
+ }
+ ],
+ "todo": [
+ {
+ "assignedTo": {
+ "name": "lesion"
+ },
+ "category": "feature",
+ "creation_time": "2019-04-23T19:50:00.973Z",
+ "id": "7",
+ "prio": 1,
+ "references": [],
+ "title": "export page",
+ "type": "bug"
+ },
+ {
+ "assignedTo": {
+ "name": "lesion"
+ },
+ "category": "feature",
+ "creation_time": "2019-04-23T19:55:59.993Z",
+ "id": "10",
+ "prio": 1,
+ "references": [],
+ "title": "gestione errori form aggiungi evento",
+ "type": "bug"
+ },
+ {
+ "assignedTo": {
+ "name": "lesion"
+ },
+ "category": "feature",
+ "creation_time": "2019-04-23T19:50:55.458Z",
+ "id": "8",
+ "prio": 1,
+ "references": [],
+ "title": "rivedere ux / messaggi utente",
+ "type": "bug"
+ },
+ {
+ "assignedTo": {
+ "name": "lesion"
+ },
+ "category": "feature",
+ "creation_time": "2019-04-23T19:56:46.263Z",
+ "id": "11",
+ "prio": 1,
+ "references": [],
+ "title": "get comments / media from mastodon"
+ },
+ {
+ "assignedTo": {
+ "name": "lesion"
+ },
+ "category": "feature",
+ "creation_time": "2019-04-23T19:45:27.613Z",
+ "description": {
+ "content": "probabilmente devo far diventare il campo senza timezone",
+ "mime": "text/markdown"
+ },
+ "id": "2",
+ "prio": 0,
+ "references": [],
+ "title": "check date timezone",
+ "type": "bug"
+ },
+ {
+ "assignedTo": {
+ "name": "lesion"
+ },
+ "category": "feature",
+ "creation_time": "2019-04-23T19:48:54.407Z",
+ "description": {
+ "content": "probabilmente lato client dovrei aggiungere una classe css al body per capire se js e' attivo o meno e poi lavorare di css",
+ "mime": "text/markdown"
+ },
+ "id": "6",
+ "prio": 0,
+ "references": [],
+ "title": "risolvere le modali quando il js e' disabilitato",
+ "type": "bug"
+ },
+ {
+ "assignedTo": {
+ "name": "lesion"
+ },
+ "category": "feature",
+ "creation_time": "2019-04-23T19:46:46.332Z",
+ "id": "3",
+ "prio": 0,
+ "references": [],
+ "title": "export lista"
+ },
+ {
+ "assignedTo": {
+ "name": "lesion"
+ },
+ "category": "feature",
+ "creation_time": "2019-04-23T19:44:56.705Z",
+ "id": "1",
+ "references": [],
+ "title": "popup sul calendario"
+ },
+ {
+ "assignedTo": {
+ "name": "lesion"
+ },
+ "category": "feature",
+ "creation_time": "2019-04-23T19:47:10.704Z",
+ "id": "4",
+ "prio": 0,
+ "references": [],
+ "title": "traduzione in inglese"
+ },
+ {
+ "assignedTo": {
+ "name": "lesion"
+ },
+ "category": "feature",
+ "creation_time": "2019-04-23T19:51:05.917Z",
+ "id": "9",
+ "prio": -1,
+ "references": [],
+ "title": "documentare sorgenti",
+ "type": "bug"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/components/Nav.vue b/components/Nav.vue
index 892755e5..67a682e2 100644
--- a/components/Nav.vue
+++ b/components/Nav.vue
@@ -4,21 +4,21 @@
b-navbar-brand(to='/')
b-collapse#nav_collapse(is-nav)
b-navbar-nav
- b-nav-item(v-if='!logged' to='/login' v-b-tooltip :title='$t("Login")')
- span.d-md-none {{$t('User')}}
- b-nav-item(to='/new_event' v-b-tooltip :title='$t("Add Event")' )
- span.d-md-none {{$t('Add Event')}}
- b-nav-item(v-if='logged' to='/settings' v-b-tooltip :title='$t("Settings")')
- span.d-md-none {{$t('Settings')}}
- b-nav-item(v-if='user.is_admin' to='/admin' v-b-tooltip :title='$t("Admin")')
- span.d-md-none {{$t('Admin')}}
- b-nav-item(to='/export' v-b-tooltip :title='$t("Export")')
- span.d-md-none {{$t('Export')}}
- b-nav-item(v-if='logged' @click='logout' v-b-tooltip :title='$t("Logout")')
- span.d-md-none {{$t('Logout')}}
+ b-nav-item(v-if='!$auth.loggedIn' to='/login' v-b-tooltip :title='$t("common.login")')
+ span.d-md-none {{$t('common.login')}}
+ b-nav-item(to='/add' v-b-tooltip :title='$t("common.add_event")' )
+ span.d-md-none {{$t('common.add_event')}}
+ b-nav-item(v-if='$auth.loggedIn' to='/settings' v-b-tooltip :title='$t("common.settings")')
+ span.d-md-none {{$t('common.settings')}}
+ b-nav-item(v-if='$auth.hasScope(`admin`)' to='/admin' v-b-tooltip :title='$t("common.admin")')
+ span.d-md-none {{$t('common.admin')}}
+ b-nav-item(to='/export' v-b-tooltip :title='$t("common.export")')
+ span.d-md-none {{$t('common.export')}}
+ b-nav-item(v-if='auth.loggedIn' @click='logout' v-b-tooltip :title='$t("common.logout")')
+ span.d-md-none {{$t('common.logout')}}
b-navbar-nav.ml-auto
b-nav-item(to='/about')
- span {{$t('Info')}}
+ span {{$t('common.info')}}
diff --git a/locales/it.json b/locales/it.json
new file mode 100644
index 00000000..efa952cb
--- /dev/null
+++ b/locales/it.json
@@ -0,0 +1,46 @@
+{
+ "common": {
+ "login": "Entra",
+ "email": "Email",
+ "password": "Password",
+ "register": "Registrati",
+ "send": "Invia",
+ "description": "Descrizione",
+ "info": "Info",
+ "add_event": "Aggiungi evento",
+ "export": "Esporta",
+ "settings": "Impostazioni",
+ "admin": "Amministra",
+ "logout": "Esci",
+ "where": "Dove",
+ "when": "Quando",
+ "next": "Avanti",
+ "what": "Cosa",
+ "address": "Indirizzo",
+ "media": "Media"
+ },
+
+ "login": {
+ "description": "Entrando puoi pubblicare nuovi eventi.",
+ "not_registered": "Non sei registrata?",
+ "forgot_password": "Ho dimenticato la password",
+ "insert_email": "Inserisci la mail",
+ "check_email": "Controlla la tua casella di posta (anche la cartella spam)",
+ "error": "Errore nel login"
+ },
+
+ "register": {
+ "description": "I movimenti hanno bisogno di organizzarsi e autofinanziarsi.
Questo è un dono per voi, usatelo solo per eventi non commerciali e ovviamente antifascisti, antisessisti, antirazzisti.
Prima di poter pubblicare dobbiamo approvare l'account, considera che dietro questo sito ci sono delle persone di carne e sangue, scrivici quindi due righe per farci capire che eventi vorresti pubblicare.",
+ "complete": "",
+ "admin_complete": ""
+ },
+
+ "event": {
+ "anon": "",
+ "anon_description": "",
+ "where_description" : "Dov'è il gancio? Se è un luogo fisico, scrivi il suo nome del per esteso (tipo 'Mezcal Squat'), se è una Piazza/Via metti quella (tipo 'Piazza Castello, Torino'). Se trovi già il luogo dell'evento premilo e l'indirizzo verrà autocompletato.",
+ "address_description": "",
+ "tag_description": "Puoi inserire un tag (es. concerto, corteo)"
+ }
+}
+
diff --git a/nuxt.config.js b/nuxt.config.js
index e89df3e1..29c34492 100644
--- a/nuxt.config.js
+++ b/nuxt.config.js
@@ -15,7 +15,7 @@ module.exports = {
],
link: [{ rel: 'icon', type: 'image/x-icon', href: '/favicon.ico' }]
},
-
+
serverMiddleware: [
{ path: '/api', handler: '@/server/api/index.js' }
],
@@ -50,7 +50,8 @@ module.exports = {
*/
modules: [
// Doc: https://axios.nuxtjs.org/usage
- '@nuxtjs/axios'
+ '@nuxtjs/axios',
+ '@nuxtjs/auth'
],
/*
** Axios module configuration
@@ -61,6 +62,19 @@ module.exports = {
// See https://github.com/nuxt-community/axios-module#options
},
+ auth: {
+ strategies: {
+ local: {
+ endpoints: {
+ login: { url: '/auth/login', method: 'post', propertyName: 'token' },
+ logout: { url: '/auth/logout', method: 'post' },
+ user: { url: '/auth/user', method: 'get', propertyName: 'user' }
+ },
+ // tokenRequired: true,
+ // tokenType: 'bearer',
+ }
+ }
+ },
/*
** Build configuration
*/
diff --git a/package.json b/package.json
index 729e4b36..ecb78137 100644
--- a/package.json
+++ b/package.json
@@ -13,18 +13,22 @@
"precommit": "npm run lint"
},
"dependencies": {
+ "@nuxtjs/auth": "^4.5.3",
"@nuxtjs/axios": "^5.4.1",
"axios": "^0.18.0",
"bcrypt": "^3.0.5",
"body-parser": "^1.18.3",
"bootstrap-vue": "^2.0.0-rc.16",
+ "cookie-parser": "^1.4.4",
"cors": "^2.8.5",
"cross-env": "^5.2.0",
"dayjs": "^1.8.11",
"element-ui": "^2.4.11",
"email-templates": "^5.0.4",
"express": "^4.16.4",
+ "express-jwt": "^5.3.1",
"ics": "^2.13.2",
+ "js-cookie": "^2.2.0",
"jsonwebtoken": "^8.5.1",
"mastodon-api": "^1.3.0",
"morgan": "^1.9.1",
diff --git a/pages/new_event.vue b/pages/add.vue
similarity index 80%
rename from pages/new_event.vue
rename to pages/add.vue
index e0c9bf23..ae5c2ac1 100644
--- a/pages/new_event.vue
+++ b/pages/add.vue
@@ -1,62 +1,62 @@
b-modal(ref='modal' @hidden='$router.replace("/")' size='lg' :visible='true'
- :title="edit?$t('Edit event'):$t('New event')" hide-footer)
+ :title="edit?$t('common.edit_event'):$t('common.add_event')" hide-footer)
el-form
el-tabs.mb-2(v-model='activeTab' v-loading='sending')
//- NOT LOGGED EVENT
el-tab-pane(v-if='!logged')
- span(slot='label') {{$t('anon_newevent')}}
- p(v-html="$t('anon_newevent_explanation')")
- el-button.float-right(@click='next' :disabled='!couldProceed') {{$t('Next')}}
+ span(slot='label') {{$t('event.anon')}}
+ p(v-html="$t('event.anon_description')")
+ el-button.float-right(@click='next' :disabled='!couldProceed') {{$t('common.next')}}
//- WHERE
el-tab-pane
- span(slot='label') {{$t('Where')}}
- div {{$t('where_explanation')}}
+ span(slot='label') {{$t('common.where')}}
+ div {{$t('common.where')}}
el-select.mb-3(v-model='event.place.name' @change='placeChoosed' filterable allow-create default-first-option)
el-option(v-for='place in places_name' :label='place' :value='place' :key='place.id')
- div {{$t("Address")}}
- el-input.mb-3(ref='address' v-model='event.place.address' @keydown.native.enter='next')
- el-button.float-right(@click='next' :disabled='!couldProceed') {{$t('Next')}}
+ div {{$t("common.address")}}
+ el-input.mb-3(ref='address' v-model='event.place.address' :disabled='places_name.indexOf(event.place.name)>-1' @keydown.native.enter='next')
+ el-button.float-right(@click='next' :disabled='!couldProceed') {{$t('common.next')}}
//- WHEN
el-tab-pane
- span(slot='label') {{$t('When')}}
- span {{event.multidate ? $t('dates_explanation') : $t('date_explanation')}}
- el-switch.float-right(v-model='event.multidate' :active-text="$t('multidate_explanation')")
+ span(slot='label') {{$t('common.when')}}
+ span {{event.multidate ? $t('event.dates_description') : $t('event.date_description')}}
+ el-switch.float-right(v-model='event.multidate' :active-text="$t('event.multidate_description')")
v-date-picker.mb-3(:mode='event.multidate ? "range" : "single"' v-model='date' is-inline
is-expanded :min-date='new Date()' @input='date ? $refs.time_start.focus() : false')
- div {{$t('time_start_explanation')}}
+ div {{$t('event.time_start_description')}}
el-time-select.mb-3(ref='time_start'
v-model="time.start"
:picker-options="{ start: '00:00', step: '00:30', end: '24:00'}")
- div {{$t('time_end_explanation')}}
+ div {{$t('event.time_end_description')}}
el-time-select(v-model='time.end'
:picker-options="{start: '00:00', step: '00:30', end: '24:00'}")
- el-button.float-right(@click='next' :disabled='!couldProceed') {{$t('Next')}}
+ el-button.float-right(@click='next' :disabled='!couldProceed') {{$t('common.next')}}
//- WHAT
el-tab-pane
- span(slot='label') {{$t('What')}}
- span {{$t('what_explanation')}}
+ span(slot='label') {{$t('common.what')}}
+ span {{$t('event.what_description')}}
el-input.mb-3(v-model='event.title' ref='title')
- span {{$t('description_explanation')}}
+ span {{$t('event.description_description')}}
el-input.mb-3(v-model='event.description' type='textarea' :rows='9')
- span {{$t('tag_explanation')}}
+ span {{$t('event.tag_description')}}
br
el-select(v-model='event.tags' multiple filterable allow-create
default-first-option placeholder='Tag')
el-option(v-for='tag in tags' :key='tag.tag'
:label='tag' :value='tag')
- el-button.float-right(@click.native='next' :disabled='!couldProceed') {{$t('Next')}}
+ el-button.float-right(@click.native='next' :disabled='!couldProceed') {{$t('common.next')}}
el-tab-pane
- span(slot='label') {{$t('Media')}}
- span {{$t('media_explanation')}}
- b-form-file.mb-2(v-model='event.image', :placeholder='$t("Poster")' accept='image/*')
- el-button.float-right(@click='done') {{edit?$t('Edit'):$t('Send')}}
+ span(slot='label') {{$t('common.media')}}
+ span {{$t('event.media_description')}}
+ b-form-file.mb-2(v-model='event.image', :placeholder='$t("common.poster")' accept='image/*')
+ el-button.float-right(@click='done') {{edit?$t('common.edit'):$t('common.send')}}
@@ -121,6 +121,12 @@ export default {
user: state => state.user,
logged: state => state.logged
}),
+ disableAddress () {
+ console.log('dentro disable Address')
+ const ret = this.places_name.find(p => p.name === this.event.place.name)
+ console.log(ret)
+ return ret
+ },
couldProceed () {
const t = this.logged ? -1 : 0
switch(Number(this.activeTab)) {
@@ -203,7 +209,7 @@ export default {
this.updateMeta()
this.sending = false
this.$refs.modal.hide()
- Message({ type: 'success', message: this.logged ? this.$t('new_event_added') : this.$t('new_anon_event_added')})
+ Message({ type: 'success', message: this.logged ? this.$t('event.added') : this.$t('event.added_anon')})
} catch (e) {
this.sending = false
console.error(e)
diff --git a/pages/admin.vue b/pages/admin.vue
index 3ffdcc39..0b83f1a1 100644
--- a/pages/admin.vue
+++ b/pages/admin.vue
@@ -95,6 +95,7 @@ import { Message } from 'element-ui'
export default {
name: 'Admin',
+ middleware: ['auth'],
data () {
return {
perPage: 10,
@@ -116,18 +117,19 @@ export default {
tab: "0",
}
},
- async mounted () {
- const code = this.$route.query.code
- if (code) {
- this.tab = "4"
- const instance = await api.setCode({code, is_admin: true})
- }
- // this.users = await api.getUsers()
- // this.events = await api.getUnconfirmedEvents()
- // this.settings = await api.getAdminSettings()
- this.mastodon_instance = this.settings.mastodon_auth && this.settings.mastodon_auth.instance
- },
- async asyncData ({ $axios, params }) {
+ // async mounted () {
+ // const code = this.$route.query.code
+ // if (code) {
+ // this.tab = "4"
+ // const instance = await api.setCode({code, is_admin: true})
+ // }
+ // // this.users = await api.getUsers()
+ // // this.events = await api.getUnconfirmedEvents()
+ // // this.settings = await api.getAdminSettings()
+ // this.mastodon_instance = this.settings.mastodon_auth && this.settings.mastodon_auth.instance
+ // },
+ async asyncData ({ $axios, params, store }) {
+ console.log(store.state)
const users = await $axios.$get('/users')
return { users }
},
diff --git a/pages/export.vue b/pages/export.vue
new file mode 100644
index 00000000..10ea1d07
--- /dev/null
+++ b/pages/export.vue
@@ -0,0 +1,133 @@
+
+ b-modal(ref='modal' @hidden='$router.replace("/")'
+ :title='$t("Export")' :visible='true' size='lg' hide-footer)
+ p {{$t('export_intro')}}
+
+ li(v-if='filters.tags.length') {{$t('Tags')}}:
+ el-tag.ml-1(color='#409EFF' size='mini' v-for='tag in filters.tags' :key='tag.tag') {{tag}}
+ li(v-if='filters.places.length') {{$t('Places')}}:
+ el-tag.ml-1(color='#409EFF' size='mini' v-for='place in filters.places' :key='place.id') {{place}}
+ el-tabs.mt-2(tabPosition='left' v-model='type')
+
+ el-tab-pane.pt-1(label='email' name='email')
+ p(v-html='$t(`export_email_explanation`)')
+ el-form(@submit.native.prevent)
+ //- el-switch(v-model='notification.notify_on_add' :active-text="$t('notify_on_insert')")
+ //- br
+ //- el-switch.mt-2(v-model='notification.send_notification' :active-text="$t('send_notification')")
+ el-input.mt-2(v-model='notification.email' :placeholder="$t('Insert your address')" ref='email')
+ el-button.mt-2.float-right(native-type= 'submit' type='success' @click='add_notification') {{$t('Send')}}
+
+ el-tab-pane.pt-1(label='feed rss' name='feed')
+ span(v-html='$t(`export_feed_explanation`)')
+ el-input(v-model='link')
+ el-button(slot='append' plain type="primary" icon='el-icon-document' v-clipboard:copy="link") {{$t("Copy")}}
+
+ el-tab-pane.pt-1(label='ics/ical' name='ics')
+ p(v-html='$t(`export_ical_explanation`)')
+ el-input(v-model='link')
+ el-button(slot='append' plain type="primary" icon='el-icon-document' v-clipboard:copy="link") {{$t("Copy")}}
+
+ el-tab-pane.pt-1(label='list' name='list')
+ p(v-html='$t(`export_list_explanation`)')
+ el-card.mb-1(no-body header='Eventi')
+ b-list-group#list(flush)
+ b-list-group-item.flex-column.align-items-start(v-for="event in filteredEvents" :key='event.id'
+ :to='`/event/${event.id}`')
+ //- b-media
+ img(v-if='event.image_path' slot="aside" :src="imgPath(event)" alt="Meia Aside" style='max-height: 60px')
+ small.float-right {{event.start_datetime|datetime}}
+ strong.mb-1 {{event.title}}
+ br
+ small.float-right {{event.place.name}}
+ el-tag.mr-1(:color='tag.color || "grey"' size='mini' v-for='tag in event.tags' :key='tag.tag') {{tag.tag}}
+ el-input.mb-1(type='textarea' v-model='script')
+ el-button.float-right(plain type="primary" icon='el-icon-document' v-clipboard:copy="script") Copy
+
+
+ el-tab-pane.pt-1(label='calendar' name='calendar')
+ p(v-html='$t(`export_calendar_explanation`)')
+ Calendar.mb-1
+ el-input.mb-1(type='textarea' v-model='script')
+ el-button.float-right(plain type="primary" icon='el-icon-document' v-clipboard:copy="script") Copy
+
+
+
+
+
+
diff --git a/pages/Login.vue b/pages/login.vue
similarity index 58%
rename from pages/Login.vue
rename to pages/login.vue
index 6ed16bbe..eac775f2 100644
--- a/pages/Login.vue
+++ b/pages/login.vue
@@ -1,19 +1,20 @@
- b-modal(@shown="$refs.email.focus()" :title='$t("Login")' hide-footer
+ b-modal(@shown="$refs.email.focus()" :title='$t("common.login")' hide-footer
@hidden='$router.replace("/")' :visible='true' ref='modal')
el-form(v-loading='loading')
- p(v-html="$t('login_explanation')")
- el-input.mb-2(v-model='email' type='email' :placeholder='$t("Email")' autocomplete='email' ref='email')
+ p(v-html="$t('login.description')")
+ el-input.mb-2(v-model='email' type='email' :placeholder='$t("common.email")' autocomplete='email' ref='email')
v-icon(name='user' slot='prepend')
- el-input.mb-1(v-model='password' @keyup.enter.native="submit" type='password' :placeholder='$t("Password")')
+ el-input.mb-1(v-model='password' @keyup.enter.native="submit" type='password' :placeholder='$t("common.password")')
v-icon(name="lock" slot='prepend')
- el-button.mr-1(plain type="success" @click='submit') {{$t('Login')}}
+ el-button.mr-1(plain type="success" @click='submit') {{$t('common.login')}}
router-link(to='/register')
- el-button.mt-1(plain type="primary") {{$t('Not registered?')}}
- a.float-right(href='#' @click='forgot') {{$t('Forgot password?')}}
+ el-button.mt-1(plain type="primary") {{$t('login.not_registered')}}
+ a.float-right(href='#' @click='forgot') {{$t('login.forgot_password')}}
+
diff --git a/plugins/i18n.js b/plugins/i18n.js
index af35c413..c3a14c31 100644
--- a/plugins/i18n.js
+++ b/plugins/i18n.js
@@ -8,18 +8,18 @@ export default ({ app, store }) => {
// This way we can use it in middleware and pages asyncData/fetch
app.i18n = new VueI18n({
locale: store.state.locale,
- fallbackLocale: 'en'
- // messages: {
- // 'en': require('~/locales/en.json'),
+ fallbackLocale: 'it',
+ messages: {
+ 'it': require('~/locales/it.json')
// 'fr': require('~/locales/fr.json')
- // }
+ }
})
- app.i18n.path = (link) => {
- if (app.i18n.locale === app.i18n.fallbackLocale) {
- return `/${link}`
- }
+ // app.i18n.path = (link) => {
+ // if (app.i18n.locale === app.i18n.fallbackLocale) {
+ // return `/${link}`
+ // }
- return `/${app.i18n.locale}/${link}`
- }
+ // return `/${app.i18n.locale}/${link}`
+ // }
}
diff --git a/server/api/auth.js b/server/api/auth.js
index 9bcffee7..fc74a8b4 100644
--- a/server/api/auth.js
+++ b/server/api/auth.js
@@ -21,7 +21,6 @@ const Auth = {
(req.body && req.body.token) ||
req.params.token ||
req.headers.authorization
- console.error('sono dentro isAuth ', token, req.headers)
if (!token) return res.status(403).send({ message: 'Token not found' })
jwt.verify(token, config.secret, async (err, decoded) => {
if (err) {
diff --git a/server/api/controller/event.js b/server/api/controller/event.js
index d1c97801..d6925fec 100644
--- a/server/api/controller/event.js
+++ b/server/api/controller/event.js
@@ -160,7 +160,7 @@ const eventController = {
// { model: Place, required: false }
// ]
})
- console.log(events)
+ // console.log(events)
res.json(events)
}
diff --git a/server/api/controller/user.js b/server/api/controller/user.js
index 3e8c1938..432f5813 100644
--- a/server/api/controller/user.js
+++ b/server/api/controller/user.js
@@ -4,7 +4,7 @@ const crypto = require('crypto')
const jwt = require('jsonwebtoken')
const Mastodon = require('mastodon-api')
const { Op } = require('sequelize')
-
+const jsonwebtoken = require('jsonwebtoken')
const User = require('../models/user')
const config = require('../config')
const mail = require('../mail')
@@ -27,18 +27,24 @@ const userController = {
} else {
// if user is found and password is right
// create a token
- const payload = { email: user.email }
- const token = jwt.sign(payload, config.secret)
- res.json({
- success: true,
- message: 'Enjoy your token!',
- token,
- user
- })
+ const accessToken = jsonwebtoken.sign({ user:
+ {
+ id: user.id,
+ email: user.email,
+ scope: [user.is_admin ? 'admin' : 'user']
+ }},
+ config.secret
+ )
+
+ res.json({token: accessToken})
}
}
},
+ async logout(req, res) {
+
+ },
+
async setToken(req, res) {
req.user.mastodon_auth = req.body
await req.user.save()
diff --git a/server/api/index.js b/server/api/index.js
index ebf7fb8b..19f253c1 100644
--- a/server/api/index.js
+++ b/server/api/index.js
@@ -5,8 +5,10 @@ const eventController = require('./controller/event')
const exportController = require('./controller/export')
const userController = require('./controller/user')
const settingsController = require('./controller/settings')
+const config = require('./config')
// const botController = require('./controller/bot')
+const jwt = require('express-jwt')({secret: config.secret})
const storage = require('./storage')({
destination: 'uploads/'
@@ -14,8 +16,12 @@ const storage = require('./storage')({
const upload = multer({ storage })
const api = express.Router()
-// login
-api.post('/login', userController.login)
+
+// AUTH
+api.post('/auth/login', userController.login)
+api.post('/auth/logout', userController.logout)
+api.get('/auth/user', jwt, userController.current)
+
api.post('/user/recover', userController.forgotPassword)
api.post('/user/check_recover_code', userController.checkRecoverCode)
api.post('/user/recover_password', userController.updatePasswordWithRecoverCode)
@@ -25,7 +31,7 @@ api
// register
.post(userController.register)
// get current user
- .get(isAuth, userController.current)
+ // .get(isAuth, userController.current)
// update user (eg. confirm)
.put(isAuth, isAdmin, userController.update)
diff --git a/server/api/models/user.js b/server/api/models/user.js
index 2fcfbac5..e6a13ff3 100644
--- a/server/api/models/user.js
+++ b/server/api/models/user.js
@@ -1,6 +1,6 @@
+const Sequelize = require('sequelize')
const bcrypt = require('bcrypt')
const db = require('../db')
-const Sequelize = require('sequelize')
const User = db.define('user', {
email: {
diff --git a/server/index.js b/server/index.js
index edb79306..42ebd858 100644
--- a/server/index.js
+++ b/server/index.js
@@ -2,6 +2,7 @@ const express = require('express')
const consola = require('consola')
const morgan = require('morgan')
const bodyParser = require('body-parser')
+const cookieParser = require('cookie-parser')
const { Nuxt, Builder } = require('nuxt')
const app = express()
const cors = require('cors')
@@ -31,7 +32,7 @@ async function start() {
// Give nuxt middleware to express
app.use(cors(corsConfig))
app.use(morgan('dev'))
- // app.set('views', path.join)
+ app.use(cookieParser())
app.use(bodyParser.urlencoded({ extended: false }))
app.use(bodyParser.json())
app.use(nuxt.render)
diff --git a/store/index.js b/store/index.js
index f2172b0f..bd568e4a 100644
--- a/store/index.js
+++ b/store/index.js
@@ -1,19 +1,11 @@
import moment from 'dayjs'
import { intersection } from 'lodash'
-import api from '~/plugins/api'
import Vue from 'vue'
-Vue.config.errorHandler = function (err, vm, info) {
- // handle error
- // `info` is a Vue-specific error info, e.g. which lifecycle hook
- // the error was found in. Only available in 2.2.0+
- console.error(err)
- console.error(info)
-}
-
export const state = () => ({
events: [],
user: {},
+ locale: 'it',
logged: false,
token: '',
tags: [],
@@ -109,18 +101,20 @@ export const actions = {
// get current month's event
async nuxtServerInit({ commit }, { req }) {
// set user if logged! TODO
-
const now = new Date()
// const events = await api.getAllEvents(now.getMonth() - 1, now.getFullYear())
const events = await this.$axios.$get(`/event/${now.getMonth() - 1}/${now.getFullYear()}`)
commit('setEvents', events)
},
+ async updateEvents({ commit }, page) {
+ const events = await this.$axios.$get(`/event/${page.month}/${page.year}`)
+ commit('setEvents', events)
+ },
async updateMeta({ commit }) {
const { tags, places } = await this.$axios.$get('/event/meta')
commit('update', { tags, places })
},
async addEvent({ commit }, formData) {
- console.log('ciao addEvent')
const event = await this.$axios.$post('/user/event', formData) // .addEvent(formData)
if (this.state.logged) {
commit('addEvent', event)
@@ -133,14 +127,6 @@ export const actions = {
delEvent({ commit }, eventId) {
commit('delEvent', eventId)
},
- login({ commit }, user) {
- this.$axios.setToken(user.token)
- commit('login', user)
- },
- logout({ commit }) {
- this.$axios.setToken(false)
- commit('logout')
- },
// search
addSearchTag({ commit }, tag) {
commit('addSearchTag', tag)