109 lines
2.4 KiB
TypeScript
109 lines
2.4 KiB
TypeScript
|
import * as AWS from 'aws-sdk'
|
||
|
import { generate as randomString } from 'randomstring'
|
||
|
import { User } from './model'
|
||
|
|
||
|
const db = new AWS.DynamoDB.DocumentClient()
|
||
|
const { USERS_TABLE_NAME } = process.env
|
||
|
|
||
|
export const findUser = async (id: string): Promise<User | undefined> => {
|
||
|
if (!id) {
|
||
|
return Promise.resolve(undefined)
|
||
|
}
|
||
|
const meta = await db
|
||
|
.get({
|
||
|
TableName: USERS_TABLE_NAME,
|
||
|
Key: {
|
||
|
id: String(id),
|
||
|
},
|
||
|
})
|
||
|
.promise()
|
||
|
return (meta || { Item: undefined }).Item as User
|
||
|
}
|
||
|
|
||
|
export const findUserByToken = async (
|
||
|
token: string
|
||
|
): Promise<User | undefined> => {
|
||
|
if (!token) {
|
||
|
return Promise.resolve(undefined)
|
||
|
}
|
||
|
const meta = await db
|
||
|
.query({
|
||
|
TableName: USERS_TABLE_NAME,
|
||
|
IndexName: 'tokenIndex',
|
||
|
KeyConditionExpression: '#token = :token',
|
||
|
ExpressionAttributeNames: {
|
||
|
'#token': 'token',
|
||
|
},
|
||
|
ExpressionAttributeValues: { ':token': token },
|
||
|
Limit: 1,
|
||
|
})
|
||
|
.promise()
|
||
|
return (meta || { Items: [] }).Items[0] as User
|
||
|
}
|
||
|
|
||
|
export const findUserByStreamlabsId = async (
|
||
|
streamlabsId: string
|
||
|
): Promise<User | undefined> => {
|
||
|
if (!streamlabsId) {
|
||
|
return Promise.resolve(undefined)
|
||
|
}
|
||
|
const meta = await db
|
||
|
.query({
|
||
|
TableName: USERS_TABLE_NAME,
|
||
|
IndexName: 'streamlabsIdIndex',
|
||
|
KeyConditionExpression: '#streamlabsId = :streamlabsId',
|
||
|
ExpressionAttributeNames: {
|
||
|
'#streamlabsId': 'streamlabsId',
|
||
|
},
|
||
|
ExpressionAttributeValues: { ':streamlabsId': streamlabsId },
|
||
|
Limit: 1,
|
||
|
})
|
||
|
.promise()
|
||
|
return (meta || { Items: [] }).Items[0] as User
|
||
|
}
|
||
|
|
||
|
export const updateUser = async (data: User, body?: Partial<User>) => {
|
||
|
data.lastSeenAt = Date.now()
|
||
|
if (body) {
|
||
|
data = Object.assign(data, body)
|
||
|
Object.keys(body).forEach(k => {
|
||
|
if (typeof body[k] === 'string' && !body[k]) {
|
||
|
delete data[k]
|
||
|
}
|
||
|
})
|
||
|
}
|
||
|
await db
|
||
|
.put({
|
||
|
TableName: USERS_TABLE_NAME,
|
||
|
Item: data,
|
||
|
})
|
||
|
.promise()
|
||
|
return data
|
||
|
}
|
||
|
|
||
|
export const createUser = async (
|
||
|
data: Pick<
|
||
|
User,
|
||
|
'username' | 'streamlabsId' | 'streamlabsToken' | 'streamlabsRefreshToken'
|
||
|
>
|
||
|
) => {
|
||
|
const user: User = {
|
||
|
id: randomString(),
|
||
|
...data,
|
||
|
|
||
|
// generate a random API key
|
||
|
token: randomString(),
|
||
|
|
||
|
createdAt: Date.now(),
|
||
|
lastSeenAt: Date.now(),
|
||
|
}
|
||
|
|
||
|
await db
|
||
|
.put({
|
||
|
TableName: USERS_TABLE_NAME,
|
||
|
Item: user,
|
||
|
})
|
||
|
.promise()
|
||
|
return user
|
||
|
}
|