parent
6c5eacd88d
commit
a842fa3ad7
@ -0,0 +1,36 @@
|
|||||||
|
import axios from "axios";
|
||||||
|
import url from "@/router/url";
|
||||||
|
import { setData } from "../resources/authResource";
|
||||||
|
|
||||||
|
export default class AuthRepository {
|
||||||
|
async login(data) {
|
||||||
|
let json = setData(data);
|
||||||
|
let response = await axios.post(url("login"), json);
|
||||||
|
if (response.status === 200) {
|
||||||
|
return response.data.data;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async logout() {
|
||||||
|
let response = await axios.post(url("logout"));
|
||||||
|
if (response.status === 200) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async register(data) {
|
||||||
|
let json = setData(data);
|
||||||
|
let response = await axios.post(url("register"), json);
|
||||||
|
if (response.status === 200) {
|
||||||
|
return response.data.data;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async resetPassword(data) {
|
||||||
|
let json = setData(data);
|
||||||
|
let response = await axios.post(url("resetPassword"), json);
|
||||||
|
if (response.status === 200) {
|
||||||
|
return response.data.data;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,9 @@
|
|||||||
|
export const setData = (data) => ({
|
||||||
|
first_name: data.first_name,
|
||||||
|
last_name: data.last_name,
|
||||||
|
email: data.email,
|
||||||
|
username: data.username,
|
||||||
|
password: data.password,
|
||||||
|
password_confirmation: data.password_confirmation,
|
||||||
|
});
|
||||||
|
|
@ -0,0 +1,40 @@
|
|||||||
|
<template>
|
||||||
|
<div class="h-100">
|
||||||
|
<main-back height="100%">
|
||||||
|
<div class="mt-16">
|
||||||
|
<ul class="pl-0 ml-0">
|
||||||
|
<template>
|
||||||
|
<MenuItem :active="true" text="Home" link="dashboard" />
|
||||||
|
<MenuItem text="my profile" link="profile" />
|
||||||
|
<MenuItem text="my bookmarks" link="dashboard" />
|
||||||
|
<MenuItem text="programs" link="programs" />
|
||||||
|
<MenuItem text="users" link="users" />
|
||||||
|
<MenuItem text="products" link="products" />
|
||||||
|
<MenuItem text="workouts" link="workouts" />
|
||||||
|
</template>
|
||||||
|
<template>
|
||||||
|
<MenuItem :active="true" text="Home" link="dashboardTrainee" />
|
||||||
|
<MenuItem text="my profile" link="profile" />
|
||||||
|
<MenuItem text="my programs" link="trainPrograms" />
|
||||||
|
<MenuItem text="my bookmarks" link="bookmarks" />
|
||||||
|
</template>
|
||||||
|
<template>
|
||||||
|
<MenuItem :active="true" text="Home" link="dashboardTrainer" />
|
||||||
|
<MenuItem text="my profile" link="profile" />
|
||||||
|
<MenuItem text="my programs" link="trainPrograms" />
|
||||||
|
<MenuItem text="my trainees" link="users" />
|
||||||
|
<MenuItem text="my bookmarks" link="bookmarks" />
|
||||||
|
</template>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</main-back>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
<script>
|
||||||
|
import MenuItem from "../Global/Section/MenuItem.vue";
|
||||||
|
export default {
|
||||||
|
components: {
|
||||||
|
MenuItem,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
</script>
|
@ -0,0 +1,7 @@
|
|||||||
|
import { urlGenerator } from "@/utils/urlGenerator";
|
||||||
|
|
||||||
|
const urls = {
|
||||||
|
login: "auth/login"
|
||||||
|
};
|
||||||
|
|
||||||
|
export default urlGenerator(urls);
|
@ -0,0 +1,33 @@
|
|||||||
|
import AuthRepository from "../../../abstraction/repository/authRepository";
|
||||||
|
import {TokenStorage, UserStorage} from "@/utils/storage";
|
||||||
|
import ApiService from "@/utils/axios/api";
|
||||||
|
|
||||||
|
function setTokenHeader(commit, response) {
|
||||||
|
TokenStorage.saveToken(response.token);
|
||||||
|
UserStorage.save(response.user);
|
||||||
|
commit("SET_AUTH_USER", response.user);
|
||||||
|
ApiService.setAuthHeader();
|
||||||
|
}
|
||||||
|
|
||||||
|
export default {
|
||||||
|
async login({commit}, data) {
|
||||||
|
let repository = new AuthRepository();
|
||||||
|
const response = await repository.login(data);
|
||||||
|
if (response) {
|
||||||
|
setTokenHeader(commit, response);
|
||||||
|
return response;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
async logout() {
|
||||||
|
let repository = new AuthRepository();
|
||||||
|
await repository.logout();
|
||||||
|
ApiService.removeAuthHeader();
|
||||||
|
TokenStorage.removeToken();
|
||||||
|
return true;
|
||||||
|
},
|
||||||
|
async register({commit}, data) {
|
||||||
|
let repository = new AuthRepository();
|
||||||
|
const response = await repository.register(data);
|
||||||
|
setTokenHeader(commit, response);
|
||||||
|
},
|
||||||
|
};
|
@ -0,0 +1,3 @@
|
|||||||
|
export default {
|
||||||
|
getAuthUser: (state) => state.user,
|
||||||
|
};
|
@ -0,0 +1,6 @@
|
|||||||
|
import Vue from "vue";
|
||||||
|
export default {
|
||||||
|
SET_AUTH_USER(state, data) {
|
||||||
|
Vue.set(state, "user", data);
|
||||||
|
},
|
||||||
|
};
|
@ -0,0 +1,3 @@
|
|||||||
|
export default {
|
||||||
|
user: {},
|
||||||
|
};
|
@ -0,0 +1,28 @@
|
|||||||
|
import axios from 'axios'
|
||||||
|
import {TokenStorage} from '../storage'
|
||||||
|
|
||||||
|
const ApiService = {
|
||||||
|
|
||||||
|
init(baseURL = null) {
|
||||||
|
if (baseURL) {
|
||||||
|
axios.defaults.baseURL = baseURL;
|
||||||
|
} else if (process.env.MIX_PUSHER_APP_API) {
|
||||||
|
axios.defaults.baseURL = process.env.MIX_PUSHER_APP_API;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (TokenStorage.getToken()) {
|
||||||
|
this.setAuthHeader();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
setAuthHeader() {
|
||||||
|
axios.defaults.headers.common["Authorization"] = `Bearer ${TokenStorage.getToken()}`;
|
||||||
|
},
|
||||||
|
|
||||||
|
removeAuthHeader() {
|
||||||
|
axios.defaults.headers.common["Authorization"] = null;
|
||||||
|
},
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
export default ApiService;
|
@ -0,0 +1,49 @@
|
|||||||
|
import axios from "axios";
|
||||||
|
import store from "@/store";
|
||||||
|
// import toast from "../toast";
|
||||||
|
import Vue from "vue";
|
||||||
|
import { TokenStorage } from "../storage";
|
||||||
|
import ApiService from "./api";
|
||||||
|
|
||||||
|
function errorResponseHandler(error) {
|
||||||
|
// check for errorHandle config
|
||||||
|
if (
|
||||||
|
Object.prototype.hasOwnProperty.call(error.config, "errorHandle") &&
|
||||||
|
error.config.errorHandle === false
|
||||||
|
) {
|
||||||
|
return Promise.reject(error);
|
||||||
|
}
|
||||||
|
// if has response show the error
|
||||||
|
if (error.response) {
|
||||||
|
if (error.response.status === 401) {
|
||||||
|
TokenStorage.removeToken();
|
||||||
|
ApiService.removeAuthHeader();
|
||||||
|
store.commit('auth/logout', {}, { root: true });
|
||||||
|
window.location.href = '/';
|
||||||
|
// toast.error('Wrong username or password.', 'Error');
|
||||||
|
} else if (error.response.status === 422) {
|
||||||
|
if (typeof error.response.data.errors !== 'undefined') {
|
||||||
|
for (const key in error.response.data.errors) {
|
||||||
|
if (Object.prototype.hasOwnProperty.call(error.response.data.errors, key)) {
|
||||||
|
// toast.error(error.response.data.errors[key], 'Error');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if (error.response.status === 500) {
|
||||||
|
// toast.error('Server Error', 'Error');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return Promise.reject(error);
|
||||||
|
}
|
||||||
|
function successHandler(response) {
|
||||||
|
if (response.status === 200 || response.status === 201) {
|
||||||
|
if (typeof response.data.message !== 'undefined' && typeof response.data.message.content !== 'undefined') {
|
||||||
|
// toast.success(response.data.message.content, response.data.message.title || 'Success');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return response;
|
||||||
|
}
|
||||||
|
|
||||||
|
// apply interceptor on response
|
||||||
|
axios.interceptors.response.use(successHandler, errorResponseHandler);
|
||||||
|
Vue.prototype.$axios = axios;
|
@ -0,0 +1,70 @@
|
|||||||
|
const createFilterObject = filters => {
|
||||||
|
let filterObject = {};
|
||||||
|
for (const key in filters) {
|
||||||
|
if (Object.hasOwnProperty.call(filters, key)) {
|
||||||
|
if (filters[key] && typeof filters[key]["type"] !== "undefined") {
|
||||||
|
let filterValue = window[filters[key]["type"]](filters[key]);
|
||||||
|
if (filterValue) {
|
||||||
|
filterObject[key] = filterValue;
|
||||||
|
}
|
||||||
|
} else if (typeof filters[key] !== 'object' ) {
|
||||||
|
filterObject[key] = filters[key];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
filters = {};
|
||||||
|
for (var filter in filterObject) {
|
||||||
|
if (Object.hasOwnProperty.call(filterObject, filter)) {
|
||||||
|
filters[`filters[${filter}]`] = filterObject[filter];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return filters;
|
||||||
|
};
|
||||||
|
window["between"] = function(filter) {
|
||||||
|
var value = null;
|
||||||
|
if (filter.val1 && filter.val2) {
|
||||||
|
value = `<${filter.val1},${filter.val2}>`;
|
||||||
|
} else if (filter.val1) {
|
||||||
|
filter.val = filter.val1;
|
||||||
|
value = window["greater"](filter);
|
||||||
|
} else if (filter.val2) {
|
||||||
|
filter.val = filter.val2;
|
||||||
|
value = window["less"](filter);
|
||||||
|
}
|
||||||
|
return value;
|
||||||
|
};
|
||||||
|
window["greater"] = function(filter) {
|
||||||
|
var value = null;
|
||||||
|
if (filter.val) {
|
||||||
|
value = `(ge)${filter.val}`;
|
||||||
|
}
|
||||||
|
return value;
|
||||||
|
};
|
||||||
|
window["less"] = function(filter) {
|
||||||
|
var value = null;
|
||||||
|
if (filter.val) {
|
||||||
|
value = `(le)${filter.val}`;
|
||||||
|
}
|
||||||
|
return value;
|
||||||
|
};
|
||||||
|
|
||||||
|
window["like"] = function(filter) {
|
||||||
|
var value = null;
|
||||||
|
if (filter.val !== null) {
|
||||||
|
value = `%${filter.val}%`;
|
||||||
|
}
|
||||||
|
return value;
|
||||||
|
};
|
||||||
|
window["in"] = function(filter) {
|
||||||
|
var value = null;
|
||||||
|
if (filter.val) {
|
||||||
|
if (Array.isArray(filter.val)) {
|
||||||
|
value = filter.val.join(",");
|
||||||
|
} else {
|
||||||
|
value = `${filter.val}`;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return value;
|
||||||
|
};
|
||||||
|
|
||||||
|
export default createFilterObject;
|
@ -0,0 +1,89 @@
|
|||||||
|
const isUndefined = (value) => value === undefined;
|
||||||
|
|
||||||
|
const isNull = (value) => value === null;
|
||||||
|
|
||||||
|
const isBoolean = (value) => typeof value === "boolean";
|
||||||
|
|
||||||
|
const isObject = (value) => value === Object(value);
|
||||||
|
|
||||||
|
const isArray = (value) => Array.isArray(value);
|
||||||
|
|
||||||
|
const isDate = (value) => value instanceof Date;
|
||||||
|
|
||||||
|
const isBlob = (value) =>
|
||||||
|
value &&
|
||||||
|
typeof value.size === "number" &&
|
||||||
|
typeof value.type === "string" &&
|
||||||
|
typeof value.slice === "function";
|
||||||
|
|
||||||
|
const isFile = (value) =>
|
||||||
|
isBlob(value) &&
|
||||||
|
typeof value.name === "string" &&
|
||||||
|
(typeof value.lastModifiedDate === "object" ||
|
||||||
|
typeof value.lastModified === "number");
|
||||||
|
|
||||||
|
const objectToFormData = (obj, cfg, fd, pre) => {
|
||||||
|
cfg = cfg || {};
|
||||||
|
|
||||||
|
cfg.indices = isUndefined(cfg.indices) ? true : cfg.indices;
|
||||||
|
|
||||||
|
cfg.nullsAsUndefineds = isUndefined(cfg.nullsAsUndefineds)
|
||||||
|
? false
|
||||||
|
: cfg.nullsAsUndefineds;
|
||||||
|
|
||||||
|
cfg.booleansAsIntegers = isUndefined(cfg.booleansAsIntegers)
|
||||||
|
? false
|
||||||
|
: cfg.booleansAsIntegers;
|
||||||
|
|
||||||
|
cfg.allowEmptyArrays = isUndefined(cfg.allowEmptyArrays)
|
||||||
|
? true
|
||||||
|
: cfg.allowEmptyArrays;
|
||||||
|
|
||||||
|
fd = fd || new FormData();
|
||||||
|
|
||||||
|
if (isUndefined(obj)) {
|
||||||
|
return fd;
|
||||||
|
} else if (isNull(obj)) {
|
||||||
|
if (!cfg.nullsAsUndefineds) {
|
||||||
|
fd.append(pre, "");
|
||||||
|
}
|
||||||
|
} else if (isBoolean(obj)) {
|
||||||
|
if (cfg.booleansAsIntegers) {
|
||||||
|
fd.append(pre, obj ? 1 : 0);
|
||||||
|
} else {
|
||||||
|
fd.append(pre, obj);
|
||||||
|
}
|
||||||
|
} else if (isArray(obj)) {
|
||||||
|
if (obj.length) {
|
||||||
|
obj.forEach((value, index) => {
|
||||||
|
const key = pre + "[" + (cfg.indices ? index : "") + "]";
|
||||||
|
|
||||||
|
objectToFormData(value, cfg, fd, key);
|
||||||
|
});
|
||||||
|
} else if (cfg.allowEmptyArrays) {
|
||||||
|
fd.append(pre, []);
|
||||||
|
}
|
||||||
|
} else if (isDate(obj)) {
|
||||||
|
fd.append(pre, obj.toISOString());
|
||||||
|
} else if (isObject(obj) && !isFile(obj) && !isBlob(obj)) {
|
||||||
|
Object.keys(obj).forEach((prop) => {
|
||||||
|
const value = obj[prop];
|
||||||
|
|
||||||
|
if (isArray(value)) {
|
||||||
|
while (prop.length > 2 && prop.lastIndexOf("[]") === prop.length - 2) {
|
||||||
|
prop = prop.substring(0, prop.length - 2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const key = pre ? pre + "[" + prop + "]" : prop;
|
||||||
|
|
||||||
|
objectToFormData(value, cfg, fd, key);
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
fd.append(pre, obj);
|
||||||
|
}
|
||||||
|
|
||||||
|
return fd;
|
||||||
|
};
|
||||||
|
|
||||||
|
export { objectToFormData };
|
@ -0,0 +1,35 @@
|
|||||||
|
import createFilterObject from "./createFilterObject";
|
||||||
|
export const SetQueriesObject = ({ filters, sorts, pagination }) => {
|
||||||
|
|
||||||
|
let Query = {};
|
||||||
|
|
||||||
|
if (typeof filters === 'object') {
|
||||||
|
filters = createFilterObject(filters);
|
||||||
|
Query = {...Query, ...filters };
|
||||||
|
}
|
||||||
|
|
||||||
|
if (typeof sorts === 'string') {
|
||||||
|
sorts = sorts ? { 'sorts[]': sorts } : {};
|
||||||
|
Query = {...Query, ...sorts };
|
||||||
|
}
|
||||||
|
|
||||||
|
if (typeof pagination === 'object') {
|
||||||
|
pagination = {
|
||||||
|
per_page: pagination.itemsPerPage,
|
||||||
|
page: pagination.page
|
||||||
|
};
|
||||||
|
Query = {...Query, ...pagination };
|
||||||
|
}
|
||||||
|
return Query;
|
||||||
|
};
|
||||||
|
|
||||||
|
export const SetPagination = (paginate) => {
|
||||||
|
return {
|
||||||
|
page: paginate.current_page,
|
||||||
|
pageStop: paginate.to,
|
||||||
|
pageStart: paginate.from,
|
||||||
|
pageCount: paginate.last_page,
|
||||||
|
itemsLength: paginate.total,
|
||||||
|
itemsPerPage: paginate.per_page,
|
||||||
|
}
|
||||||
|
};
|
@ -0,0 +1,47 @@
|
|||||||
|
import qs from "qs";
|
||||||
|
|
||||||
|
const TOKEN_KEY = "access_token";
|
||||||
|
const USER = "user";
|
||||||
|
/**
|
||||||
|
* Manage the how Access Tokens are being stored and retreived from storage.
|
||||||
|
*
|
||||||
|
* Current implementation stores to localStorage. Local Storage should always be
|
||||||
|
* accessed through this instace.
|
||||||
|
**/
|
||||||
|
const TokenStorage = {
|
||||||
|
getToken() {
|
||||||
|
return localStorage.getItem(TOKEN_KEY);
|
||||||
|
},
|
||||||
|
|
||||||
|
saveToken(accessToken = null) {
|
||||||
|
localStorage.setItem(TOKEN_KEY, accessToken);
|
||||||
|
},
|
||||||
|
|
||||||
|
removeToken() {
|
||||||
|
localStorage.removeItem(TOKEN_KEY);
|
||||||
|
},
|
||||||
|
|
||||||
|
hasToken() {
|
||||||
|
return localStorage.getItem(TOKEN_KEY) ? true : false;
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
const UserStorage = {
|
||||||
|
get() {
|
||||||
|
if (localStorage.getItem(USER)) {
|
||||||
|
return qs.parse(localStorage.getItem(USER));
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
},
|
||||||
|
|
||||||
|
save(user = null) {
|
||||||
|
user = qs.stringify(user);
|
||||||
|
localStorage.setItem(USER, user);
|
||||||
|
},
|
||||||
|
|
||||||
|
remove() {
|
||||||
|
localStorage.removeItem(USER);
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
export { TokenStorage, UserStorage };
|
@ -0,0 +1,24 @@
|
|||||||
|
const urlGenerator = (urls) => {
|
||||||
|
return function(routeAddress, parameters) {
|
||||||
|
let urlPath = urls[routeAddress].split("/");
|
||||||
|
let newPath = [];
|
||||||
|
for (const iterator of urlPath) {
|
||||||
|
if (iterator.startsWith(":")) {
|
||||||
|
if (iterator.endsWith("?")) {
|
||||||
|
if (Object.prototype.hasOwnProperty.call(parameters, iterator.slice(1, -1))) {
|
||||||
|
newPath.push(parameters[iterator.slice(1, -1)]);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
newPath.push(parameters[iterator.slice(1)]);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
newPath.push(iterator);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return '/api/' + newPath.join("/");
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
export {
|
||||||
|
urlGenerator
|
||||||
|
}
|
@ -1,5 +1,14 @@
|
|||||||
module.exports = {
|
module.exports = {
|
||||||
transpileDependencies: [
|
transpileDependencies: [
|
||||||
'vuetify'
|
'vuetify'
|
||||||
]
|
],
|
||||||
|
configureWebpack: {
|
||||||
|
resolve: {
|
||||||
|
alias: {
|
||||||
|
'@Assets': path.resolve(__dirname, 'src/assets'),
|
||||||
|
'@Styles': path.resolve(__dirname, 'src/styles'),
|
||||||
|
'@': path.resolve(__dirname, 'src/')
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in new issue