Development discussions around Shopify APIs
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:
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.....
Solved! Go to the solution
This is an accepted solution.
I fixed it by setting the session loading as offline....... (because my sessions are `accessMode: "offline",` in order to save the accessToken to use later in webhooks)
on my `server.js` I added `false`
const session = await Shopify.Utils.loadCurrentSession(
ctx.req,
ctx.res,
false
);
I also found out there was a function called `loadOfflineSession` which can also be used but it requires `shop` to be passed and I couldn't find `shop` anywhere in `ctx` ....
This is an accepted solution.
I fixed it by setting the session loading as offline....... (because my sessions are `accessMode: "offline",` in order to save the accessToken to use later in webhooks)
on my `server.js` I added `false`
const session = await Shopify.Utils.loadCurrentSession(
ctx.req,
ctx.res,
false
);
I also found out there was a function called `loadOfflineSession` which can also be used but it requires `shop` to be passed and I couldn't find `shop` anywhere in `ctx` ....
User | RANK |
---|---|
54 | |
11 | |
9 | |
7 | |
4 |
Thanks to all Community members that participated in our inaugural 2 week AMA on the new E...
By Jacqui Mar 10, 2023Upskill and stand out with the new Shopify Foundations Certification program
By SarahF_Shopify Mar 6, 2023One of the key components to running a successful online business is having clear and co...
By Ollie Mar 6, 2023