Hi.
Im trying to make a custom session storage so that I can actually deploy my app and have “thousands” of stores using it…
For that I cant use memorry session storage right? or whenever it restarts it would break…
So Im following this tutorial on how to save and retrieve the session from a db:
My current problem is that my loadCallback function isnt able to retrieve the session back from the DB because the provided id changes…
lets say I have store.com… it saves that with all the other fields. but when its time to retrieve it the id will be store.com and then suddenly store.com_123456789
It adds for example _77896089824 and it makes no sense!
Top be fair in that video the same happens and its saved correctly to the DB… but for some reason doesnt happen for me…
This is my current code:
As you see now Im trying the db.raw approach to make it look more like the video… (had to change “ON DUPLICATE” to “ON CONFLICT” tho)
but my other approach should work… (tries to find a given store by its shop name and then if it finds it it updates it otherwise inserts)
const db = require("./db_config.js");
const { Session } = require("@shopify/shopify-api/dist/auth/session");
let domain_id = "";
async function storeCallback(session) {
console.log("storeCall", session);
try {
let data = session;
if (data.id.indexOf(`${data.shop}`) > -1) {
domain_id = data.id;
}
// await db("shopify_sessions")
// .where({ shop: data.shop })
// .then(async (shop) => {
// if (shop.length > 0) {
// console.log("YES");
// await db("shopify_sessions")
// .where({ shop: data.shop })
// .update({
// access_token: data.accessToken,
// state: data.state,
// session_id: data.id,
// domain_id: domain_id,
// scope: data.scope,
// });
// return true;
// } else {
// console.log("NO");
// await db("shopify_sessions").insert({
// shop: data.shop,
// session_id: data.id,
// domain_id: domain_id,
// access_token: data.accessToken,
// state: data.state,
// isOnline: data.isOnline,
// scope: data.scope,
// });
// return true;
// }
// })
// .catch((err) => {
// console.log(err);
// });
const abc = await db.raw(
`INSERT INTO shopify_sessions (shop, session_id, domain_id, access_token, state, isOnline, scope) VALUES ('${data.shop}','${data.id}','${domain_id}','${data.accessToken}','${data.state}',${data.isOnline},'${data.scope}') ON CONFLICT (shop) DO UPDATE SET access_token='${data.accessToken}', state='${data.state}', session_id='${data.id}',domain_id='${domain_id}',scope='${data.scope}'`
);
console.log("ABC");
console.log(abc);
return true;
} catch (e) {
console.error(e);
}
}
async function loadCallback(id) {
console.log("loadCallback", id);
if (id === undefined) {
return false;
}
try {
let data = await db("shopify_sessions")
.where({ session_id: id })
.orWhere({ domain_id: id });
if (data.length > 0) {
let session = new Session(id);
session.shop = data[0].shop;
session.state = data[0].state;
session.scope = data[0].scope;
session.isOnline = !!data[0].isOnline;
session.accessToken = data[0].access_token;
// session.id =
const date = new Date();
date.setDate(date.getDate() + 1);
session.expires = date;
if (session.expires && typeof session.exipres === "string") {
session.expires = new Date(session.expires);
}
return session;
} else {
console.log("not found");
return false;
}
// let data2 = await db("shopify_sessions")
// .where({ session_id: id })
// .orWhere({ domain_id: id })
// .toSQL()
// .toNative();
// console.log("SQL ");
// console.log(data2);
console.log(data);
return data;
} catch (e) {
console.error(e);
}
}
async function deleteCallback(id) {
try {
return false;
} catch (e) {
console.error(e);
}
}
module.exports = {
storeCallback,
loadCallback,
deleteCallback,
};
My acessMod is offline…
createShopifyAuth({
accessMode: "offline",
so I dont have this object property onlineAccessInfo
My final question is: how am I supposed to identify and retrieve the correct session of it adds “_NUMBER” to the id…?
I thought about doing a .split("_")[0] but thats hacky and domains can actually contain underscores and that could cause issues…