Skip to content

Latest commit

 

History

History
 
 

shopify-app-session-storage-drizzle

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Session Storage Adapters for Drizzle

This package implements the SessionStorage interface that works with an instance of Drizzle.

There are 3 adapters for Drizzle: DrizzleSessionStoragePostgres, DrizzleSessionStorageSQLite and DrizzleSessionStorageMySQL.

Session storage for Drizzle requires a schema.ts with a session table with at-least the columns as in the example. Make sure to create session table and apply changes to the database before using this pakacge.

Example with PostgreSQL

import {bigint, boolean, pgTable, text, timestamp} from 'drizzle-orm/pg-core';

export const sessionTable = pgTable('session', {
  id: text('id').primaryKey(),
  shop: text('shop').notNull(),
  state: text('state').notNull(),
  isOnline: boolean('isOnline').default(false).notNull(),
  scope: text('scope'),
  expires: timestamp('expires', {mode: 'date'}),
  accessToken: text('accessToken'),
  userId: bigint('userId', {mode: 'number'}),
});

You can then instantiate and use DrizzleSessionStoragePostgres like so:

import {shopifyApp} from '@shopify/shopify-app-express';
import {DrizzleSessionStoragePostgres} from '@shopify/shopify-app-session-storage-drizzle';

import {db} from './db.server';
import {sessionTable} from './schema';

const storage = new DrizzleSessionStoragePostgres(db, sessionTable);

const shopify = shopifyApp({
  sessionStorage: storage,
  // ...
});

Example with MySQL

import {
  bigint,
  boolean,
  mysqlTable,
  text,
  timestamp,
  varchar,
} from 'drizzle-orm/mysql-core';

export const sessionTable = mysqlTable('session', {
  id: varchar('id', {length: 255}).primaryKey(),
  shop: text('shop').notNull(),
  state: text('state').notNull(),
  isOnline: boolean('isOnline').default(false).notNull(),
  scope: text('scope'),
  expires: timestamp('expires', {mode: 'date'}),
  accessToken: text('accessToken'),
  userId: bigint('userId', {mode: 'number'}),
});

You can then instantiate and use DrizzleSessionStorageMySQL like so:

import {shopifyApp} from '@shopify/shopify-app-express';
import {DrizzleSessionStorageMySQL} from '@shopify/shopify-app-session-storage-drizzle';

import {db} from './db.server';
import {sessionTable} from './schema';

const storage = new DrizzleSessionStorageMySQL(db, sessionTable);

const shopify = shopifyApp({
  sessionStorage: storage,
  // ...
});

Example with SQLite

import {sqliteTable, text, integer, blob} from 'drizzle-orm/sqlite-core';

export const sessionTable = sqliteTable('session', {
  id: text('id').primaryKey(),
  shop: text('shop').notNull(),
  state: text('state').notNull(),
  isOnline: integer('isOnline', {mode: 'boolean'}).notNull().default(false),
  scope: text('scope'),
  expires: text('expires'),
  accessToken: text('accessToken'),
  userId: blob('userId', {mode: 'bigint'}),
});

You can then instantiate and use DrizzleSessionStorageSQLite like so:

import {shopifyApp} from '@shopify/shopify-app-express';
import {DrizzleSessionStorageSQLite} from '@shopify/shopify-app-session-storage-drizzle';

import {db} from './db.server';
import {sessionTable} from './schema';

const storage = new DrizzleSessionStorageSQLite(db, sessionTable);

const shopify = shopifyApp({
  sessionStorage: storage,
  // ...
});

Drizzle Setup

In the example above the file db.server.ts should import your database client, drizzle schema and export db that you can pass to the storage adapter:

import {drizzle} from 'drizzle-orm/libsql';
import {createClient} from '@libsql/client';

import * as schema from './schema';

export const client = createClient({
  url: 'file:./dev.db',
});

export const db = drizzle(client, {schema});

Follow the Drizzle documentation for PostgreSQL setup, MySQL setup and SQLite setup.