i have router in my worker. CRUD methods are using DO. In Delete method, the state of DO is always empty. In all other methods(GET,POST and PUT), state has the latest data. can anyone help me with solution please ?
Below is the code.
import faunadb from ‘faunadb’;
const {Create, Documents, Collection, Match, Index, Get, Ref, Paginate, Sum, Delete, Add, Select, Let, Var, Update, Map, Lambda} = faunadb.query;
import { Router } from ‘itty-router’
// Create a new router
const router = Router()
router.get(“/API/DO_Example”, (request, env) => {
let objResponse = handleRequest(request, env);
return objResponse;
})
router.post(“/API/DO_Example”, (request, env) => {
let objResponse = handleRequest(request, env);
return objResponse;
})
router.put(“/API/DO_Example”, (request, env) => {
let objResponse = handleRequest(request, env);
return objResponse;
})
router.delete(“/API/DO_Example/:vPrimaryKey”, (request, env) => {
let objResponse = handleRequest(request, env);
return objResponse;
})
router.all(‘*’, () => new Response(‘Not Found.’, { status: 404 }))
export default {
async fetch(request, env) {
return new Response(await router.handle(request, env));
},
};
async function handleRequest(request, env) {
let id = env.DO_Example.idFromName(new URL(request.url).pathname);
let obj = env.DO_Example.get(id);
let resp = await obj.fetch(request);
let strData = await resp.text();
return strData;
}
// Durable Object
export class DO_Example {
constructor(state, env) {
this.state = state;
this.env = env
this.strCollectionName = "DO_Example"
this.objFaunaClient = new faunadb.Client({
secret: env.FAUNA_SECRET
});
}
// Handle HTTP requests from clients.
async fetch(request) {
try {
let strMethod = await request.method;
let objResponse;
switch(strMethod){
case "GET":
objResponse = await this.GetData(request);
break;
case "POST":
objResponse = await this.AddData(request);
break;
case "PUT":
objResponse = await this.EditData(request);
break
case "DELETE":
objResponse = await this.DeleteData(request);
break;
}
return new Response(JSON.stringify(objResponse));
}
catch (error) {
console.log(error);
return new Response(error);
}
}
async GetData(){
let arrData = await this.state.storage.get("Data") || null;
console.log('arrData',arrData)
if(!arrData){
const objResult = await this.objFaunaClient.query(
Map(
Paginate(Documents(Collection(this.strCollectionName))),
Lambda(x => Select('data', Get(x)) )
)
);
arrData = objResult.data;
await this.state.storage.put("Data", arrData);
}
let objResponse = {
"Data":arrData,
"Count":arrData.length
};
return objResponse;
}
async AddData(request){
let objData = await request.json();
const {AddData} = objData;
const vPrimaryKey = Date.now();
const objQueryResponse = await this.objFaunaClient.query(
Create(
Ref(Collection(this.strCollectionName), vPrimaryKey),
{
data: {
vPrimaryKey,
...AddData,
"cIsDeleted":"N"
}
}
)
);
let objAddedData = objQueryResponse["data"];
let arrData = await this.state.storage.get("Data") || [];
arrData = [...arrData, objAddedData];
await this.state.storage.put("Data", arrData);
let objResponse = {
"Data":[objAddedData]
};
return objResponse;
}
async EditData(request){
let objData = await request.json();
const {EditData} = objData;
const {vPrimaryKey} = EditData;
const objQueryResponse = await this.objFaunaClient.query(
Update(Ref(Collection(this.strCollectionName), vPrimaryKey),
{
data : EditData
}
)
);
let objEditedData = objQueryResponse["data"];
let arrData = await this.state.storage.get("Data") || [];
console.log('arrData', arrData);
let arrNewData = arrData.map(objData => objData["vPrimaryKey"] == objEditedData["vPrimaryKey"] ? objEditedData : objData)
await this.state.storage.put("Data", arrNewData);
let objResponse = {
"Data":[objEditedData]
};
return objResponse;
}
async DeleteData(request){
const strUrl = await request.url;
const vPrimaryKey = strUrl.split("/")[strUrl.split("/").length-1];
const objGetQueryResponse = await this.objFaunaClient.query(
Get(Ref(Collection(this.strCollectionName), vPrimaryKey))
);
let DeleteData = objGetQueryResponse.data;
DeleteData["cIsDeleted"] = "Y";
const objQueryResponse = await this.objFaunaClient.query(
Update(Ref(Collection(this.strCollectionName), vPrimaryKey),
{
data : DeleteData
}
)
);
let objDeletedData = objQueryResponse["data"];
let arrData = await this.state.storage.get("Data");
console.log('arrData', arrData);
let arrNewData = arrData.map(objData => objData["vPrimaryKey"] == objDeletedData["vPrimaryKey"] ? objDeletedData : objData)
await this.state.storage.put("Data", arrNewData);
let objResponse = {
"Data":[objDeletedData]
};
return objResponse;
}
}