@dbbs/strapi-stripe-payment
Version:
Strapi integration plugin for Stripe payment system
99 lines (77 loc) • 2.61 kB
text/typescript
import Stripe from 'stripe'
import { factories, Strapi } from '@strapi/strapi'
import createHttpError from 'http-errors'
import { CreateProductParams, DeleteProductParams, GetProductByIdParams, UpdateProductParams } from '../interfaces'
export default factories.createCoreService('plugin::stripe-payment.product', ({ strapi }: { strapi: Strapi }) => ({
async create(params: CreateProductParams) {
const { name } = params
const product = await strapi.plugin('stripe-payment').service('stripe').products.create({
name
})
const savedProduct = await strapi.query('plugin::stripe-payment.product').create({
data: {
name,
stripe_id: product.id
}
})
return savedProduct
},
async getProductById(params: GetProductByIdParams) {
const { id } = params
const product = await strapi.query('plugin::stripe-payment.product').findOne({
where: { id },
populate: ['plans']
})
return product
},
async getProducts() {
const stripeProducts = await strapi.plugin('stripe-payment').service('stripe').products.list()
const stripeProductIds = stripeProducts.data.map((product: Stripe.Product) => product.id)
const products = await strapi.query('plugin::stripe-payment.product').findMany({
where: {
stripe_id: {
$in: stripeProductIds
}
},
populate: ['plans']
})
return products
},
async update(params: UpdateProductParams) {
const { name, id } = params
const product = await strapi.query('plugin::stripe-payment.product').findOne({ where: { id } })
if (!product) {
return null
}
await strapi.plugin('stripe-payment').service('stripe').products.update(product.stripe_id, {
name
})
const updatedProduct = await strapi.query('plugin::stripe-payment.product').update({
where: { id },
data: {
name
}
})
return updatedProduct
},
async delete(params: DeleteProductParams) {
const { id } = params
const product = await strapi.query('plugin::stripe-payment.product').findOne({
where: { id },
populate: {
plans: true
}
})
if (!product) {
return null
}
if (product.plans && product.plans.length > 0) {
throw new createHttpError.BadRequest('You cannot delete a product with plans')
}
await strapi.plugin('stripe-payment').service('stripe').products.update(product.stripe_id, {
active: false
})
await strapi.query('plugin::stripe-payment.product').delete({ where: { id } })
return { id }
}
}))