// Copyright (c) 2023 Sourcefuse Technologies // // This software is released under the MIT License. // https://opensource.org/licenses/MIT import {inject, service} from '@loopback/core'; import { Count, CountSchema, Filter, FilterExcludingWhere, repository, Where, } from '@loopback/repository'; import {del, get, param, patch, post, put, requestBody} from '@loopback/rest'; import { CONTENT_TYPE, getModelSchemaRefSF, IAuthUserWithPermissions, OPERATION_SECURITY_SPEC, STATUS_CODE, } from '@sourceloop/core'; import { authenticate, AuthenticationBindings, STRATEGY, } from 'loopback4-authentication'; import {authorize} from 'loopback4-authorization'; import {SchedulerBindings} from '../keys'; import {Subscription} from '../models'; import {IdentifierType} from '../models/enums/identifier-type.enum'; import {PermissionKey} from '../models/enums/permission-key.enum'; import {SubscriptionRepository} from '../repositories'; import {ValidatorService} from '../services/validator.service'; import {ISchedulerConfig} from '../types'; const basePath = '/subscriptions'; export class SubscriptionController { constructor( @repository(SubscriptionRepository) public subscriptionRepository: SubscriptionRepository, @service(ValidatorService) public validatorService: ValidatorService, @inject(AuthenticationBindings.CURRENT_USER) private readonly currentUser: IAuthUserWithPermissions, @inject(SchedulerBindings.Config, { optional: true, }) private readonly schdulerConfig?: ISchedulerConfig, ) {} @authenticate(STRATEGY.BEARER, { passReqToCallback: true, }) @authorize({ permissions: [ PermissionKey.CreateSubscription, PermissionKey.CreateSubscriptionNum, ], }) @post(basePath, { security: OPERATION_SECURITY_SPEC, responses: { [STATUS_CODE.OK]: { description: 'Subscription model instance', content: { [CONTENT_TYPE.JSON]: {schema: getModelSchemaRefSF(Subscription)}, }, }, }, }) async create( @requestBody({ content: { [CONTENT_TYPE.JSON]: { schema: getModelSchemaRefSF(Subscription, { title: 'NewSubscription', exclude: ['id'], }), }, }, }) subscription: Omit, ): Promise { return this.subscriptionRepository.create(subscription); } @authenticate(STRATEGY.BEARER, { passReqToCallback: true, }) @authorize({ permissions: [ PermissionKey.ViewSubscription, PermissionKey.ViewSubscriptionNum, ], }) @get(`${basePath}/count`, { security: OPERATION_SECURITY_SPEC, responses: { [STATUS_CODE.OK]: { description: 'Subscription model count', content: {[CONTENT_TYPE.JSON]: {schema: CountSchema}}, }, }, }) async count( @param.where(Subscription) where?: Where, ): Promise { return this.subscriptionRepository.count(where); } @authenticate(STRATEGY.BEARER, { passReqToCallback: true, }) @authorize({ permissions: [ PermissionKey.ViewSubscription, PermissionKey.ViewSubscriptionNum, ], }) @get('/calendars/subscriptions/me', { security: OPERATION_SECURITY_SPEC, responses: { [STATUS_CODE.OK]: { description: 'Array of Subscription model instances', content: { [CONTENT_TYPE.JSON]: { schema: { type: 'array', items: getModelSchemaRefSF(Subscription, { includeRelations: true, }), }, }, }, }, }, }) async findMe( @param.filter(Subscription) filter?: Filter, ): Promise { let identifierType = this.schdulerConfig?.identifierMappedTo; if (!identifierType) { identifierType = IdentifierType.Id; } if (filter) { if (filter.where) { filter.where = { and: [{identifier: this.currentUser[identifierType]}, filter.where], }; } else { filter.where = {identifier: this.currentUser[identifierType]}; } } else { filter = {where: {identifier: this.currentUser[identifierType]}}; } return this.subscriptionRepository.find(filter); } @authenticate(STRATEGY.BEARER, { passReqToCallback: true, }) @authorize({ permissions: [ PermissionKey.ViewSubscription, PermissionKey.ViewSubscriptionNum, ], }) @get(basePath, { security: OPERATION_SECURITY_SPEC, responses: { [STATUS_CODE.OK]: { description: 'Array of Subscription model instances', content: { [CONTENT_TYPE.JSON]: { schema: { type: 'array', items: getModelSchemaRefSF(Subscription, { includeRelations: true, }), }, }, }, }, }, }) async find( @param.filter(Subscription) filter?: Filter, ): Promise { return this.subscriptionRepository.find(filter); } @authenticate(STRATEGY.BEARER, { passReqToCallback: true, }) @authorize({ permissions: [ PermissionKey.UpdateSubscription, PermissionKey.UpdateSubscriptionNum, ], }) @patch(basePath, { security: OPERATION_SECURITY_SPEC, responses: { [STATUS_CODE.OK]: { description: 'Subscription PATCH success count', content: {[CONTENT_TYPE.JSON]: {schema: CountSchema}}, }, }, }) async updateAll( @requestBody({ content: { [CONTENT_TYPE.JSON]: { schema: getModelSchemaRefSF(Subscription, {partial: true}), }, }, }) subscription: Subscription, @param.where(Subscription) where?: Where, ): Promise { return this.subscriptionRepository.updateAll(subscription, where); } @authenticate(STRATEGY.BEARER, { passReqToCallback: true, }) @authorize({ permissions: [ PermissionKey.ViewSubscription, PermissionKey.ViewSubscriptionNum, ], }) @get(`${basePath}/{id}`, { security: OPERATION_SECURITY_SPEC, responses: { [STATUS_CODE.OK]: { description: 'Subscription model instance', content: { [CONTENT_TYPE.JSON]: { schema: getModelSchemaRefSF(Subscription, {includeRelations: true}), }, }, }, }, }) async findById( @param.path.string('id') id: string, @param.filter(Subscription, {exclude: 'where'}) filter?: FilterExcludingWhere, ): Promise { return this.subscriptionRepository.findById(id, filter); } @authenticate(STRATEGY.BEARER, { passReqToCallback: true, }) @authorize({ permissions: [ PermissionKey.UpdateSubscription, PermissionKey.UpdateSubscriptionNum, ], }) @patch(`${basePath}/{id}`, { security: OPERATION_SECURITY_SPEC, responses: { [STATUS_CODE.NO_CONTENT]: { description: 'Subscription PATCH success', }, }, }) async updateById( @param.path.string('id') id: string, @requestBody({ content: { [CONTENT_TYPE.JSON]: { schema: getModelSchemaRefSF(Subscription, {partial: true}), }, }, }) subscription: Subscription, ): Promise { await this.subscriptionRepository.updateById(id, subscription); } @authenticate(STRATEGY.BEARER, { passReqToCallback: true, }) @authorize({ permissions: [ PermissionKey.UpdateSubscription, PermissionKey.UpdateSubscriptionNum, ], }) @put(`${basePath}/{id}`, { security: OPERATION_SECURITY_SPEC, responses: { [STATUS_CODE.NO_CONTENT]: { description: 'Subscription PUT success', }, }, }) async replaceById( @param.path.string('id') id: string, @requestBody() subscription: Subscription, ): Promise { await this.subscriptionRepository.replaceById(id, subscription); } @authenticate(STRATEGY.BEARER, { passReqToCallback: true, }) @authorize({ permissions: [ PermissionKey.DeleteSubscription, PermissionKey.DeleteSubscriptionNum, ], }) @del(`${basePath}/{id}`, { security: OPERATION_SECURITY_SPEC, responses: { [STATUS_CODE.NO_CONTENT]: { description: 'Subscription DELETE success', }, }, }) async deleteById(@param.path.string('id') id: string): Promise { await this.subscriptionRepository.deleteById(id); } }