90 lines
2.1 KiB
TypeScript
90 lines
2.1 KiB
TypeScript
import { useAuthStore } from '@/stores/auth'
|
|
import { storeToRefs } from 'pinia'
|
|
|
|
interface RequestOptions {
|
|
uri: string
|
|
params?: Record<string, string>
|
|
body?: any
|
|
auth?: boolean
|
|
method?: string
|
|
}
|
|
|
|
export class NetworkService {
|
|
private API_URL = import.meta.env.VITE_API_URL
|
|
private auth = useAuthStore()
|
|
|
|
async post(options: RequestOptions) {
|
|
options.method = 'POST'
|
|
return await this.request(options)
|
|
}
|
|
|
|
async get(options: RequestOptions) {
|
|
options.method = 'GET'
|
|
return await this.request(options)
|
|
}
|
|
|
|
async patch(options: RequestOptions) {
|
|
options.method = 'PATCH'
|
|
return await this.request(options)
|
|
}
|
|
|
|
async delete(options: RequestOptions) {
|
|
options.method = 'DELETE'
|
|
return await this.request(options)
|
|
}
|
|
|
|
async request(options: RequestOptions) {
|
|
const { uri, params } = options
|
|
if (!uri) {
|
|
throw new Error('URL is required')
|
|
}
|
|
const fetchOptions = this.getFetchOptions(options)
|
|
const urlParams = this.getURLParams(params)
|
|
const res = await fetch(`${this.API_URL}${uri}${urlParams}`, fetchOptions)
|
|
|
|
if (!res.ok) {
|
|
throw new Error('Network response was not ok')
|
|
}
|
|
const text = await res.text()
|
|
|
|
if (text === '') {
|
|
return
|
|
} else {
|
|
return JSON.parse(text)
|
|
}
|
|
}
|
|
|
|
getURLParams(params: any) {
|
|
if (!params) {
|
|
return ''
|
|
}
|
|
const urlParams = new URLSearchParams()
|
|
Object.keys(params).forEach((key) => urlParams.append(key, params[key]))
|
|
return `?${urlParams.toString()}`
|
|
}
|
|
|
|
getFetchOptions(opts: RequestOptions): any {
|
|
const { body, auth, method = 'GET' } = opts
|
|
const options: any = {
|
|
method,
|
|
headers: this.getHeaders({ auth })
|
|
}
|
|
if (!['GET', 'HEAD'].includes(method) && body) {
|
|
options.body = typeof body === 'string' ? body : JSON.stringify(body)
|
|
}
|
|
|
|
return options
|
|
}
|
|
|
|
getHeaders({ auth = true }): any {
|
|
const { jwt } = storeToRefs(this.auth)
|
|
const headers: any = {
|
|
'Content-Type': 'application/json'
|
|
}
|
|
if (auth) {
|
|
headers.Authorization = jwt.value
|
|
}
|
|
return headers
|
|
}
|
|
}
|