import { ActionContext, ActionTree } from 'vuex' import authApi from '@/api/authApi' import router from '@/router' import { OAUTH2_STORE, ROOT_STORE } from '@/store/constants' import { IOAuth2Actions, IOAuth2State } from '@/store/modules/oauth2/types' import { IRootState } from '@/store/modules/root/types' import { IOauth2ClientsPayload, IOAuth2ClientPayload, IOAuth2ClientAuthorizePayload, } from '@/types/oauth' import { handleError } from '@/utils' const get_client = ( context: ActionContext, url: string ) => { context.commit(ROOT_STORE.MUTATIONS.EMPTY_ERROR_MESSAGES) authApi .get(url) .then((res) => { if (res.data.status === 'success') { context.commit(OAUTH2_STORE.MUTATIONS.SET_CLIENT, res.data.data.client) } else { handleError(context, null) } }) .catch((error) => handleError(context, error)) } export const actions: ActionTree & IOAuth2Actions = { [OAUTH2_STORE.ACTIONS.AUTHORIZE_CLIENT]( context: ActionContext, payload: IOAuth2ClientAuthorizePayload ): void { context.commit(ROOT_STORE.MUTATIONS.EMPTY_ERROR_MESSAGES) const form = new FormData() form.set('client_id', payload.client_id) form.set('response_type', payload.response_type) form.set('scope', payload.scope) form.set('confirm', 'true') if (payload.state) { form.set('state', payload.state) } authApi .post('oauth/authorize', form, { headers: { 'Content-Type': 'multipart/form-data', }, }) .then((res) => { if (res.status == 200 && res.data.redirect_url) { window.location.href = res.data.redirect_url } else { handleError(context, null) } }) .catch((error) => handleError(context, error)) }, [OAUTH2_STORE.ACTIONS.CREATE_CLIENT]( context: ActionContext, payload: IOAuth2ClientPayload ): void { context.commit(ROOT_STORE.MUTATIONS.EMPTY_ERROR_MESSAGES) authApi .post('oauth/apps', payload) .then((res) => { if (res.data.status === 'created') { context.commit( OAUTH2_STORE.MUTATIONS.SET_CLIENT, res.data.data.client ) router.push(`/profile/apps/${res.data.data.client.id}/created`) } else { handleError(context, null) } }) .catch((error) => handleError(context, error)) }, [OAUTH2_STORE.ACTIONS.DELETE_CLIENT]( context: ActionContext, id: number ): void { context.commit(ROOT_STORE.MUTATIONS.EMPTY_ERROR_MESSAGES) authApi .delete(`oauth/apps/${id}`) .then((res) => { if (res.status === 204) { context .dispatch(OAUTH2_STORE.ACTIONS.GET_CLIENTS) .then(() => router.push('/profile/apps')) } else { handleError(context, null) } }) .catch((error) => handleError(context, error)) }, [OAUTH2_STORE.ACTIONS.GET_CLIENT_BY_CLIENT_ID]( context: ActionContext, client_id: string ): void { get_client(context, `oauth/apps/${client_id}`) }, [OAUTH2_STORE.ACTIONS.GET_CLIENT_BY_ID]( context: ActionContext, id: number ): void { get_client(context, `oauth/apps/${id}/by_id`) }, [OAUTH2_STORE.ACTIONS.GET_CLIENTS]( context: ActionContext, payload: IOauth2ClientsPayload ): void { context.commit(ROOT_STORE.MUTATIONS.EMPTY_ERROR_MESSAGES) authApi .get('oauth/apps', { params: payload, }) .then((res) => { if (res.data.status === 'success') { context.commit( OAUTH2_STORE.MUTATIONS.SET_CLIENTS, res.data.data.clients ) context.commit( OAUTH2_STORE.MUTATIONS.SET_CLIENTS_PAGINATION, res.data.pagination ) } else { handleError(context, null) } }) .catch((error) => handleError(context, error)) }, [OAUTH2_STORE.ACTIONS.REVOKE_ALL_TOKENS]( context: ActionContext, id: number ): void { context.commit(ROOT_STORE.MUTATIONS.EMPTY_ERROR_MESSAGES) context.commit(OAUTH2_STORE.MUTATIONS.SET_REVOCATION_SUCCESSFUL, false) authApi .post(`oauth/apps/${id}/revoke`) .then((res) => { if (res.data.status === 'success') { context.commit(OAUTH2_STORE.MUTATIONS.SET_REVOCATION_SUCCESSFUL, true) } else { handleError(context, null) } }) .catch((error) => handleError(context, error)) }, }