Skip to content

Commit 04816dc

Browse files
committed
session state to pg
1 parent 9c120b1 commit 04816dc

File tree

4 files changed

+75
-10
lines changed

4 files changed

+75
-10
lines changed

service/src/app-models/data-store/init-models.ts

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,10 @@ import type { Sequelize } from 'sequelize'
33

44
import {
55
ApiTokenModel,
6+
DefaultSessionModel,
67
GitHubRepositoryModel,
78
PasswordCredentialModel,
9+
PasswordResetTokenModel,
810
PrerequisiteModel,
911
ServiceConfigModel,
1012
ServiceDefinitionModel,
@@ -234,6 +236,31 @@ export async function initAllModels(sequelize: Sequelize): Promise<void> {
234236
{ sequelize, updatedAt: false },
235237
)
236238

239+
DefaultSessionModel.init(
240+
{
241+
sessionId: { type: DataTypes.STRING, primaryKey: true },
242+
username: {
243+
type: DataTypes.STRING,
244+
allowNull: false,
245+
references: { model: UserModel, key: 'username' },
246+
},
247+
},
248+
{ sequelize, timestamps: false },
249+
)
250+
251+
PasswordResetTokenModel.init(
252+
{
253+
token: { type: DataTypes.STRING, primaryKey: true },
254+
userName: {
255+
type: DataTypes.STRING,
256+
allowNull: false,
257+
references: { model: UserModel, key: 'username' },
258+
},
259+
createdAt: { type: DataTypes.DATE },
260+
},
261+
{ sequelize, updatedAt: false },
262+
)
263+
237264
// --- Associations ---
238265

239266
UserModel.hasOne(PasswordCredentialModel, { foreignKey: 'userName', onDelete: 'CASCADE' })
@@ -242,6 +269,12 @@ export async function initAllModels(sequelize: Sequelize): Promise<void> {
242269
UserModel.hasMany(ApiTokenModel, { foreignKey: 'username', onDelete: 'CASCADE' })
243270
ApiTokenModel.belongsTo(UserModel, { foreignKey: 'username' })
244271

272+
UserModel.hasMany(DefaultSessionModel, { foreignKey: 'username', onDelete: 'CASCADE' })
273+
DefaultSessionModel.belongsTo(UserModel, { foreignKey: 'username' })
274+
275+
UserModel.hasMany(PasswordResetTokenModel, { foreignKey: 'userName', onDelete: 'CASCADE' })
276+
PasswordResetTokenModel.belongsTo(UserModel, { foreignKey: 'userName' })
277+
245278
StackDefinitionModel.hasOne(StackConfigModel, { foreignKey: 'stackName', onDelete: 'CASCADE' })
246279
StackConfigModel.belongsTo(StackDefinitionModel, { foreignKey: 'stackName' })
247280

service/src/app-models/data-store/models.ts

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
import type { PasswordCredential } from '@furystack/security'
1+
import type { DefaultSession } from '@furystack/rest-service'
2+
import type { PasswordCredential, PasswordResetToken } from '@furystack/security'
23
import type {
34
ApiToken,
45
EnvironmentVariableValue,
@@ -135,3 +136,17 @@ export class ApiTokenModel extends Model<ApiToken, ApiToken> implements ApiToken
135136
declare lastUsedAt: string | undefined
136137
declare createdAt: string
137138
}
139+
140+
export class DefaultSessionModel extends Model<DefaultSession, DefaultSession> implements DefaultSession {
141+
declare sessionId: string
142+
declare username: string
143+
}
144+
145+
export class PasswordResetTokenModel
146+
extends Model<PasswordResetToken, PasswordResetToken>
147+
implements PasswordResetToken
148+
{
149+
declare userName: string
150+
declare token: string
151+
declare createdAt: string
152+
}

service/src/app-models/data-store/setup-data-store.ts

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,8 @@ import { addStore, InMemoryStore } from '@furystack/core'
33
import { getLogger } from '@furystack/logging'
44
import { getRepository } from '@furystack/repository'
55
import { useSequelize } from '@furystack/sequelize-store'
6-
import { PasswordCredential } from '@furystack/security'
6+
import { DefaultSession } from '@furystack/rest-service'
7+
import { PasswordCredential, PasswordResetToken } from '@furystack/security'
78
import {
89
ApiToken,
910
GitHubRepository,
@@ -25,8 +26,10 @@ import { getDbOptions } from './db-options.js'
2526
import { initAllModels } from './init-models.js'
2627
import {
2728
ApiTokenModel,
29+
DefaultSessionModel,
2830
GitHubRepositoryModel,
2931
PasswordCredentialModel,
32+
PasswordResetTokenModel,
3033
PrerequisiteModel,
3134
ServiceConfigModel,
3235
ServiceDefinitionModel,
@@ -134,6 +137,22 @@ const registerSequelizeStores = (injector: Injector, dbOptions: ReturnType<typeo
134137
options: dbOptions,
135138
initModel: initOnce,
136139
})
140+
useSequelize({
141+
injector,
142+
model: DefaultSession,
143+
sequelizeModel: DefaultSessionModel,
144+
primaryKey: 'sessionId',
145+
options: dbOptions,
146+
initModel: initOnce,
147+
})
148+
useSequelize({
149+
injector,
150+
model: PasswordResetToken,
151+
sequelizeModel: PasswordResetTokenModel,
152+
primaryKey: 'token',
153+
options: dbOptions,
154+
initModel: initOnce,
155+
})
137156
}
138157

139158
const registerDataSets = (injector: Injector) => {
@@ -149,6 +168,8 @@ const registerDataSets = (injector: Injector) => {
149168
repo.createDataSet(ServiceStatus, 'serviceId', { ...authorizedDataSet })
150169
repo.createDataSet(ServiceStateHistory, 'id', { ...authorizedDataSet })
151170
repo.createDataSet(ApiToken, 'id', { ...authorizedDataSet })
171+
repo.createDataSet(DefaultSession, 'sessionId')
172+
repo.createDataSet(PasswordResetToken, 'token')
152173
repo.createDataSet(PrerequisiteCheckResult, 'prerequisiteId', { ...authorizedDataSet })
153174

154175
addStore(injector, new InMemoryStore({ model: ServiceGitStatus, primaryKey: 'serviceId' }))

service/src/config.ts

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,7 @@ import { useLogging } from '@furystack/logging'
55
import { FilteredConsoleLogger } from './utils/filtered-console-logger.js'
66
import type { AuthorizationResult } from '@furystack/repository'
77
import { getRepository } from '@furystack/repository'
8-
import { DefaultSession } from '@furystack/rest-service'
9-
import { PasswordResetToken, usePasswordPolicy } from '@furystack/security'
8+
import { usePasswordPolicy } from '@furystack/security'
109
import { PrerequisiteCheckResult, PublicApiToken } from 'common'
1110

1211
export const authorizedOnly = async (options: { injector: Injector }): Promise<AuthorizationResult> => {
@@ -30,13 +29,10 @@ export const authorizedDataSet = {
3029
export const injector = new Injector()
3130
useLogging(injector, FilteredConsoleLogger)
3231

33-
addStore(injector, new InMemoryStore({ model: DefaultSession, primaryKey: 'sessionId' }))
34-
.addStore(new InMemoryStore({ model: PublicApiToken, primaryKey: 'id' }))
35-
.addStore(new InMemoryStore({ model: PrerequisiteCheckResult, primaryKey: 'prerequisiteId' }))
36-
.addStore(new InMemoryStore({ model: PasswordResetToken, primaryKey: 'token' }))
32+
addStore(injector, new InMemoryStore({ model: PublicApiToken, primaryKey: 'id' })).addStore(
33+
new InMemoryStore({ model: PrerequisiteCheckResult, primaryKey: 'prerequisiteId' }),
34+
)
3735

38-
getRepository(injector).createDataSet(DefaultSession, 'sessionId')
3936
getRepository(injector).createDataSet(PublicApiToken, 'id', { ...authorizedDataSet })
40-
getRepository(injector).createDataSet(PasswordResetToken, 'token')
4137

4238
usePasswordPolicy(injector)

0 commit comments

Comments
 (0)