200 lines
6.7 KiB
JavaScript

import { defineStore } from 'pinia'
import { ConcernementsStore as concrnmtStore } from '@/stores/concernements'
import REST from '@api/rest-axios'
import JSONAPI from '@api/json-axios'
import qs from 'querystring-es3'
import { print } from 'graphql/language/printer'
import gql from 'graphql-tag'
import GQL from '@api/graphql-axios'
export const UserStore = defineStore({
id: 'user',
state: () => ({
isloggedin: false,
csrf_token: null,
logout_token: null,
uid: 0,
uuid: 0,
mail: '',
name: null,
roles: [],
isAdmin: false,
logginMessage: null
}),
getters: {
},
actions: {
checkUser () {
JSONAPI.get('').then(({ data }) => {
console.log('checkuser jsonapi', data)
if (data.meta && data.meta.links.me) {
JSONAPI.get(data.meta.links.me.href).then(({ data : { data } }) => {
console.log('checkuser jsonapi get user', data)
this.uid = data.attributes.drupal_internal__uid
this.mail = data.attributes.mail
this.name = data.attributes.name
this.isloggedin = true //data.attributes.status
console.log('user store checkuser isloggedin', this.isloggedin);
this.getUser(); // necessery to get the csrf-token
// this.userGetRoles()
// .then(({ data : { data : { user } } }) => {
// console.log('graphql user loaded', user)
// this.roles = user.roles
// this.checkIsAdmin()
// })
// .catch(error => {
// console.warn('Issue with graphql user loading', error)
// Promise.reject(error)
// })
})
}
})
},
getSessionToken(){
},
userLogin (credentials) {
console.log('user store userLogin', credentials);
return new Promise((resolve, reject) => {
this.postCredentials(credentials)
.then((response) => {
console.log('userLogin postCredentials response', response)
if (response.status === 200) {
this.uid = response.data.current_user.uid
// state.username = data.username;
this.mail = response.data.current_user.mail
this.csrf_token = response.data.csrf_token
// this.isloggedin = true
this.logout_token = response.data.logout_token
this.getUser().then(userdata => {
console.log('User Loggedin')
// todo reload concernements
// concrnmtStore().reloadConcernements(); // INFO would be good but to much complicated for now, just reload the page
// window.location.reload();
resolve()
})
} else {
this.loginMessage = response.data.message
console.warn('Issue with postCredentials', response)
console.log('user loggein failed', this.loginMessage)
Promise.reject(new Error('user loggin failed'))
}
})
.catch(error => {
console.warn('Issue with Dispatch postCredentials', error)
Promise.reject(error)
})
})
},
postCredentials (credentials) {
console.log('userStore postCredentials', credentials)
return REST.post('/user/login?_format=json',
credentials,
{
validateStatus: function (status) {
return status >= 200 && status < 500
}
})
},
getUser () {
console.log('user store getUser');
return new Promise((resolve, reject) => {
REST.get('/session/token').then(({ data }) => {
console.log('csrf_token', data)
this.csrf_token = data
console.log('state csrf_token', this.csrf_token)
const params = {
token: this.csrf_token
}
REST.get(`/user/${this.uid}?_format=json`, params)
.then(({ data }) => {
console.log('user REST getUser data', data)
console.log('roles', data.roles)
// with session_limit, only here we are certain that the user is logged
// this.user = data
// this.mail = data.mail[0].value
this.uuid = data.uuid[0].value
this.name = data.name[0].value
// with session_limit, only here we are certain that the user is logged
this.isloggedin = true
// console.log('customer_profiles', data.customer_profiles.length)
// if (data.customer_profiles.length) {
// dispatch('getUserProfiles', data.customer_profiles[data.customer_profiles.length - 1].target_id)
// }
this.userGetRoles()
.then(({ data : { data : { user } } }) => {
console.log('graphql user loaded', user)
this.roles = user.roles
this.checkIsAdmin()
resolve()
})
.catch(error => {
console.warn('Issue with graphql user loading', error)
Promise.reject(error)
})
})
.catch(error => {
console.warn('Issue with getUser', error)
Promise.reject(error)
})
})
})
},
userGetRoles () {
// GRAPHQL USER QUERY (needed to get roles)
// https://stackoverflow.com/a/55401805
const body = {
query: `
query User($id: Int!){
user(id: $id) {
id
roles
username
}
}`,
variables: { id: parseInt(this.uid) }
}
return GQL.post('', body)
},
checkIsAdmin () {
const adminroles = ['root', 'admin', 'group_admin']
for (let r = 0; r < this.roles.length; r++) {
if (adminroles.indexOf(this.roles[r]) !== -1) {
this.isAdmin = true;
break;
}
}
},
userLogout () {
const credentials = qs.stringify({
token: this.csrf_token
})
return new Promise((resolve, reject) => {
REST.post('/user/logout', credentials)
.then(resp => {
console.log('userStore userLogout resp', resp)
this.isloggedin = false
this.roles = []
// window.location.reload(true) ???
// todo reload concernements
// concrnmtStore().reloadConcernements(); // INFO would be good but to much complicated for now, just reload the page
window.location.reload();
resolve()
})
.catch(error => {
console.warn('Issue with logout', error)
Promise.reject(error)
})
})
}
}
})