ndtech-svelte-components
Version:
Svelte components for building ndtech applications
169 lines (127 loc) • 4.27 kB
JavaScript
import { writable } from 'svelte/store'
import * as api from './api'
import { Context } from '../Context/Context'
const cache = new Map();
function makeStore() {
const store = writable(new Promise(() => { }))
async function filter(arr, callback) {
const fail = Symbol()
return (await Promise.all(arr.map(async item => (await callback(item)) ? item : fail))).filter(i => i !== fail)
}
async function getCollection(resourceName) {
if (cache.has(resourceName)) {
store.set(Promise.resolve(cache.get(resourceName)))
}
try {
const response = await api.get("http://localhost:5000/" + resourceName, {}, Context.user.token)
const data = response.data
cache.set(resourceName, data)
store.set(Promise.resolve(data))
}
catch (err) {
if(err == "Unauthorized"){
store.set(Promise.reject("Unauthorized"));
}
else{
store.set(Promise.reject(err));
}
}
return store
}
async function deleteItem(resourceName, resourceId) {
if (Context.user) {
try {
if (cache.has(resourceName)) {
let resourceArray = cache.get(resourceName)
let filteredArray = await filter(resourceArray, async (resource) => {
var keepRecord = resource.id != resourceId;
if (!keepRecord) {
try {
await api.del("http://localhost:5000/" + resourceName + "/" + resourceId, Context.user.token);
console.log("keepRecord = " + keepRecord)
}
catch (e) {
throw e;
}
}
return keepRecord;
});
cache.set(resourceName, filteredArray)
store.set(filteredArray)
}
}
catch (err) {
throw "Error deleting " + resourceId + " from " + resourceName + ": " + err.message
}
}
else {
throw "must login before deleting items"
}
}
async function updateItem(resourceName, resourceId, resource) {
if (Context.user) {
try {
if (cache.has(resourceName)) {
let resourceArray = cache.get(resourceName)
for (var i = 0; i < resourceArray.length; i++) {
const resource = resourceArray[i];
if (resource._id == resourceId) {
resourceArray[i] = resource;
break;
}
}
try {
await api.put("http://localhost:5000/" + resourceName + "/" + resourceId, resource, Context.user.token);
}
catch (e) {
console.log("RESTStore.updateItem: error calling api.put: e = " + e);
throw e;
}
// cache.set(resourceName, filteredArray)
// store.set(filteredArray)
console.log("logging resource = " + resource + " to get the linter off my back until I implement the real functionality");
return resource;
}
}
catch (err) {
throw "Error deleting " + resourceId + " from " + resourceName + ": " + err.message
}
}
else {
throw "must login before updating items"
}
}
async function createItem(resourceName, resource) {
if (Context.user) {
try {
if (cache.has(resourceName)) {
const resourceArray = cache.get(resourceName)
const newResource = await api.post("http://localhost:5000/" + resourceName, resource, Context.user.token);
resourceArray.push(newResource);
cache.set(resourceName, resourceArray)
store.set(resourceArray)
return newResource;
}
}
catch (err) {
throw "Error deleting " + resource._id + " from " + resourceName + ": " + err.message
}
}
else {
throw "must login before updating items"
}
}
async function getItem(resourceName, resourceId) {
if (Context.user) {
if (cache.has(resourceName)) {
let resourceArray = cache.get(resourceName)
return resourceArray.find(element => element._id == resourceId)
}
}
else {
throw "must login before getting items"
}
}
return { getCollection, deleteItem, updateItem, createItem, getItem }
}
export const RESTStore = makeStore();