90 lines
2.0 KiB
JavaScript
90 lines
2.0 KiB
JavaScript
const Connection = require('flitter-orm/src/services/Connection')
|
|
const { ObjectId } = require('mongodb')
|
|
|
|
let DB
|
|
|
|
/**
|
|
* An OpenID Connect provider adapter with some CoreID specific tweaks.
|
|
*/
|
|
class CoreIDAdapter {
|
|
constructor(name) {
|
|
this.name = 'openid_' + name
|
|
}
|
|
|
|
async upsert(_id, payload, expiresIn) {
|
|
let expiresAt
|
|
|
|
if (expiresIn) {
|
|
expiresAt = new Date(Date.now() + (expiresIn * 1000))
|
|
}
|
|
|
|
await this.coll().updateOne(
|
|
{ _id },
|
|
{ $set: { payload, ...(expiresAt ? { expiresAt } : undefined) } },
|
|
{ upsert: true },
|
|
)
|
|
}
|
|
|
|
async find(_id) {
|
|
if ( this.name === 'openid_Client' ) _id = ObjectId(_id)
|
|
|
|
const result = await this.coll().find(
|
|
{ _id },
|
|
{ payload: 1 },
|
|
).limit(1).next()
|
|
|
|
if (!result) return undefined
|
|
return result.payload
|
|
}
|
|
|
|
async findByUserCode(userCode) {
|
|
const result = await this.coll().find(
|
|
{ 'payload.userCode': userCode },
|
|
{ payload: 1 },
|
|
).limit(1).next()
|
|
|
|
if (!result) return undefined
|
|
return result.payload
|
|
}
|
|
|
|
async findByUid(uid) {
|
|
const result = await this.coll().find(
|
|
{ 'payload.uid': uid },
|
|
{ payload: 1 },
|
|
).limit(1).next()
|
|
|
|
if (!result) return undefined
|
|
return result.payload
|
|
}
|
|
|
|
async destroy(_id) {
|
|
await this.coll().deleteOne({ _id })
|
|
}
|
|
|
|
async revokeByGrantId(grantId) {
|
|
await this.coll().deleteMany({ 'payload.grantId': grantId })
|
|
}
|
|
|
|
async consume(_id) {
|
|
await this.coll().findOneAndUpdate(
|
|
{ _id },
|
|
{ $set: { 'payload.consumed': Math.floor(Date.now() / 1000) } },
|
|
)
|
|
}
|
|
|
|
coll(name) {
|
|
return this.constructor.coll(name || this.name)
|
|
}
|
|
|
|
static coll(name) {
|
|
return DB.collection(name)
|
|
}
|
|
|
|
static connect(app) {
|
|
DB = app.di().get(Connection.name)
|
|
}
|
|
}
|
|
|
|
module.exports = CoreIDAdapter
|
|
|