Skip to content

Commit

Permalink
Save interactions to mongodb
Browse files Browse the repository at this point in the history
  • Loading branch information
WRadoslaw committed Mar 26, 2024
1 parent aaba1f4 commit 567c202
Show file tree
Hide file tree
Showing 7 changed files with 112 additions and 38 deletions.
26 changes: 19 additions & 7 deletions src/interactions-server/handlers/channelClicked.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,13 @@
import express from 'express'
import { BadRequestError, TooManyRequestsError, UnauthorizedError } from '../errors'
import { singleClickLimiter } from '../interactionsLimiter'
import { recommendationServiceManager } from '../../utils/RecommendationServiceManager'
import {
RecommendationServiceManager,

Check warning on line 5 in src/interactions-server/handlers/channelClicked.ts

View workflow job for this annotation

GitHub Actions / Local build, linting and formatting (ubuntu-latest, 16.x)

'RecommendationServiceManager' is defined but never used. Allowed unused vars must match /^_/u
recommendationServiceManager,
} from '../../utils/RecommendationServiceManager'
import { components } from '../generated/api-types'
import { AuthContext } from '../../utils/auth'
import { DetailViewModel } from '../interactionsEm'

type ReqParams = Record<string, string>
type ResBody =
Expand All @@ -19,7 +23,7 @@ export const channelClicked = async (
) => {
try {
const { authContext: session } = res.locals
const { itemId, duration, recommId } = req.body
const { itemId, duration } = req.body

if (!session || !session.userId || session.expiry.getTime() < Date.now()) {
throw new UnauthorizedError('Session unavailable or expired')
Expand All @@ -35,12 +39,20 @@ export const channelClicked = async (
throw new TooManyRequestsError('Too many requests')
}

recommendationServiceManager.scheduleClickEvent(
`${itemId}-channel`,
session.userId,
const row = new DetailViewModel({
itemId: `${itemId}-channel`,
timestamp: new Date(),
userId: recommendationServiceManager.mapUserId(session.userId),
duration,
recommId
)
})
await row.save()

// recommendationServiceManager.scheduleClickEvent(
// `${itemId}-channel`,
// session.userId,
// duration,
// recommId
// )

res.status(200).json({ success: true })
} catch (e) {
Expand Down
21 changes: 15 additions & 6 deletions src/interactions-server/handlers/rateVideo.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import { BadRequestError, UnauthorizedError } from '../errors'
import { components } from '../generated/api-types'
import { AuthContext } from '../../utils/auth'
import { recommendationServiceManager } from '../../utils/RecommendationServiceManager'
import { RatingModel } from '../interactionsEm'

type ReqParams = Record<string, string>
type ResBody =
Expand All @@ -18,7 +19,7 @@ export const rateVideo: (
) => Promise<void> = async (req, res, next) => {
try {
const { authContext: session } = res.locals
const { itemId, rating, recommId } = req.body
const { itemId, rating } = req.body

if (!session || !session.userId || session.expiry.getTime() < Date.now()) {
throw new UnauthorizedError('Session unavailable or expired')
Expand All @@ -28,12 +29,20 @@ export const rateVideo: (
throw new BadRequestError('Request missing parameters')
}

recommendationServiceManager.scheduleItemRating(
`${itemId}-video`,
session.userId,
const row = new RatingModel({
itemId: `${itemId}-video`,
timestamp: new Date(),
userId: recommendationServiceManager.mapUserId(session.userId),
rating,
recommId
)
})
await row.save()

// recommendationServiceManager.scheduleItemRating(
// `${itemId}-video`,
// session.userId,
// rating,
// recommId
// )

res.status(200).json({ success: true })
} catch (e) {
Expand Down
19 changes: 14 additions & 5 deletions src/interactions-server/handlers/videoClicked.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import { components } from '../generated/api-types'
import { AuthContext } from '../../utils/auth'
import { recommendationServiceManager } from '../../utils/RecommendationServiceManager'
import { singleClickLimiter } from '../interactionsLimiter'
import { DetailViewModel } from '../interactionsEm'

type ReqParams = Record<string, string>
type ResBody =
Expand Down Expand Up @@ -35,12 +36,20 @@ export const videoClicked: (
throw new TooManyRequestsError('Too many requests')
}

recommendationServiceManager.scheduleClickEvent(
`${itemId}-video`,
session.userId,
const row = new DetailViewModel({
itemId: `${itemId}-video`,
timestamp: new Date(),
userId: recommendationServiceManager.mapUserId(session.userId),
duration,
recommId
)
})
await row.save()

// recommendationServiceManager.scheduleClickEvent(
// `${itemId}-video`,
// session.userId,
// duration,
// recommId
// )

res.status(200).json({ success: true })
} catch (e) {
Expand Down
12 changes: 10 additions & 2 deletions src/interactions-server/handlers/videoConsumed.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import { components } from '../generated/api-types'
import { AuthContext } from '../../utils/auth'
import { recommendationServiceManager } from '../../utils/RecommendationServiceManager'
import { singlePurchaseLimiter } from '../interactionsLimiter'
import { PurchaseModel, RatingModel } from '../interactionsEm'

Check warning on line 7 in src/interactions-server/handlers/videoConsumed.ts

View workflow job for this annotation

GitHub Actions / Local build, linting and formatting (ubuntu-latest, 16.x)

'RatingModel' is defined but never used. Allowed unused vars must match /^_/u

type ReqParams = Record<string, string>
type ResBody =
Expand All @@ -19,7 +20,7 @@ export const videoConsumed: (
) => Promise<void> = async (req, res, next) => {
try {
const { authContext: session } = res.locals
const { itemId, recommId } = req.body
const { itemId } = req.body
if (!session || !session.userId || session.expiry.getTime() < Date.now()) {
throw new UnauthorizedError('Session unavailable or expired')
}
Expand All @@ -34,7 +35,14 @@ export const videoConsumed: (
throw new TooManyRequestsError('Too many requests')
}

recommendationServiceManager.scheduleItemConsumed(`${itemId}-video`, session.userId, recommId)
const row = new PurchaseModel({
itemId: `${itemId}-video`,
timestamp: new Date(),
userId: recommendationServiceManager.mapUserId(session.userId),
})
await row.save()

// recommendationServiceManager.scheduleItemConsumed(`${itemId}-video`, session.userId, recommId)

res.status(200).json({ success: true })
} catch (e) {
Expand Down
19 changes: 14 additions & 5 deletions src/interactions-server/handlers/videoPortion.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import { BadRequestError, UnauthorizedError } from '../errors'
import { components } from '../generated/api-types'
import { AuthContext } from '../../utils/auth'
import { recommendationServiceManager } from '../../utils/RecommendationServiceManager'
import { PurchaseModel, VideoPortionModel } from '../interactionsEm'

Check warning on line 6 in src/interactions-server/handlers/videoPortion.ts

View workflow job for this annotation

GitHub Actions / Local build, linting and formatting (ubuntu-latest, 16.x)

'PurchaseModel' is defined but never used. Allowed unused vars must match /^_/u

type ReqParams = Record<string, string>
type ResBody =
Expand All @@ -28,12 +29,20 @@ export const videoPortion: (
throw new BadRequestError('Request missing parameters')
}

recommendationServiceManager.scheduleViewPortion(
`${itemId}-video`,
session.userId,
const row = new VideoPortionModel({
itemId: `${itemId}-video`,
timestamp: new Date(),
userId: recommendationServiceManager.mapUserId(session.userId),
portion,
recommId
)
})
await row.save()

// recommendationServiceManager.scheduleViewPortion(
// `${itemId}-video`,
// session.userId,
// portion,
// recommId
// )

res.status(200).json({ success: true })
} catch (e) {
Expand Down
49 changes: 38 additions & 11 deletions src/interactions-server/interactionsEm.ts
Original file line number Diff line number Diff line change
Expand Up @@ -26,16 +26,43 @@ async function initInteractionsDb() {
// eslint-disable-next-line no-void
void initInteractionsDb()

const InteractionsModel = mongoose.model(
'Interaction',
new mongoose.Schema(
{
type: String,
itemId: String,
timestamp: Date,
},
{ strict: false }
)
const PurchaseModel = mongoose.model(
'Purchase',
new mongoose.Schema({
itemId: String,
timestamp: Date,
userId: String,
})
)

export { InteractionsModel }
const RatingModel = mongoose.model(
'Rating',
new mongoose.Schema({
itemId: String,
timestamp: Date,
rating: Number,
userId: String,
})
)

const DetailViewModel = mongoose.model(
'DetailView',
new mongoose.Schema({
itemId: String,
timestamp: Date,
duration: Number,
userId: String,
})
)

const VideoPortionModel = mongoose.model(
'VideoPortion',
new mongoose.Schema({
itemId: String,
timestamp: Date,
portion: Number,
userId: String,
})
)

export { PurchaseModel, RatingModel, DetailViewModel, VideoPortionModel }
4 changes: 2 additions & 2 deletions src/scripts/setupRecombee.ts
Original file line number Diff line number Diff line change
Expand Up @@ -35,8 +35,8 @@ async function main() {
!process.env.RECOMMENDATION_SERVICE_PRIVATE_KEY ||
!process.env.RECOMMENDATION_SERVICE_DATABASE
) {
console.error('RecommendationServiceManager initalized without required variables')
throw new Error()
console.error('Missing required variables for setting up Recombee. Skipping...')
process.exit(1)
}

const client = new ApiClient(
Expand Down

0 comments on commit 567c202

Please sign in to comment.