93 lines
2.9 KiB
TypeScript
93 lines
2.9 KiB
TypeScript
import { calculateReviewSplit } from './platformCommissions'
|
|
import type { ReviewRewardRequest, ReviewRewardResult } from './reviewRewardTypes'
|
|
import { createReviewInvoice } from './reviewRewardInvoice'
|
|
import { transferReviewerPortionIfAvailable } from './reviewRewardTransfer'
|
|
import { trackReviewReward } from './reviewRewardTracking'
|
|
import { updateReviewWithReward } from './reviewRewardUpdate'
|
|
|
|
/**
|
|
* Review reward service
|
|
* Handles Lightning payments for rewarding reviews with automatic commission split
|
|
*
|
|
* Review reward: 70 sats total
|
|
* - Reviewer: 49 sats
|
|
* - Platform: 21 sats
|
|
*/
|
|
export type { ReviewRewardRequest, ReviewRewardResult } from './reviewRewardTypes'
|
|
|
|
export class ReviewRewardService {
|
|
async createReviewRewardPayment(request: ReviewRewardRequest): Promise<ReviewRewardResult> {
|
|
try {
|
|
const split = calculateReviewSplit()
|
|
const invoice = await createReviewInvoice(split, request)
|
|
|
|
console.log('Review reward invoice created', {
|
|
reviewId: request.reviewId,
|
|
articleId: request.articleId,
|
|
reviewerPubkey: request.reviewerPubkey,
|
|
amount: split.total,
|
|
reviewerPortion: split.reviewer,
|
|
platformCommission: split.platform,
|
|
timestamp: new Date().toISOString(),
|
|
})
|
|
|
|
return {
|
|
success: true,
|
|
invoice,
|
|
paymentHash: invoice.paymentHash,
|
|
split,
|
|
}
|
|
} catch (error) {
|
|
const errorMessage = error instanceof Error ? error.message : 'Unknown error'
|
|
console.error('Error creating review reward payment', {
|
|
reviewId: request.reviewId,
|
|
articleId: request.articleId,
|
|
error: errorMessage,
|
|
timestamp: new Date().toISOString(),
|
|
})
|
|
return {
|
|
success: false,
|
|
error: errorMessage,
|
|
split: calculateReviewSplit(),
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Process review reward payment after confirmation
|
|
* Transfers reviewer portion and tracks commission
|
|
*/
|
|
async processReviewRewardPayment(
|
|
request: ReviewRewardRequest,
|
|
paymentHash: string
|
|
): Promise<boolean> {
|
|
try {
|
|
const split = calculateReviewSplit()
|
|
await transferReviewerPortionIfAvailable(request, split)
|
|
await trackReviewReward(request, split, paymentHash)
|
|
await updateReviewWithReward(request.reviewId, request.authorPrivateKey)
|
|
|
|
console.log('Review reward processed', {
|
|
reviewId: request.reviewId,
|
|
articleId: request.articleId,
|
|
reviewerPubkey: request.reviewerPubkey,
|
|
reviewerAmount: split.reviewer,
|
|
platformCommission: split.platform,
|
|
timestamp: new Date().toISOString(),
|
|
})
|
|
|
|
return true
|
|
} catch (error) {
|
|
console.error('Error processing review reward payment', {
|
|
reviewId: request.reviewId,
|
|
error: error instanceof Error ? error.message : 'Unknown error',
|
|
timestamp: new Date().toISOString(),
|
|
})
|
|
return false
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
export const reviewRewardService = new ReviewRewardService()
|