diff --git a/libs/common/src/constants/controller-route.ts b/libs/common/src/constants/controller-route.ts index 4012c1a..f257e2a 100644 --- a/libs/common/src/constants/controller-route.ts +++ b/libs/common/src/constants/controller-route.ts @@ -404,6 +404,15 @@ export class ControllerRoute { 'This endpoint adds a new user role to the system based on the provided role data.'; }; }; + static TERMS_AND_CONDITIONS = class { + public static readonly ROUTE = 'terms'; + + static ACTIONS = class { + public static readonly FETCH_TERMS_SUMMARY = 'Fetch Terms and Conditions'; + public static readonly FETCH_TERMS_DESCRIPTION = + 'This endpoint retrieves the terms and conditions for the application.'; + }; + }; static GROUP = class { public static readonly ROUTE = 'group'; diff --git a/libs/common/src/constants/terms-and-conditions.html b/libs/common/src/constants/terms-and-conditions.html new file mode 100644 index 0000000..80bac71 --- /dev/null +++ b/libs/common/src/constants/terms-and-conditions.html @@ -0,0 +1,44 @@ +
+

User Agreement

+

Terms and Conditions

+

Last updated: {{lastUpdated}}

+

+ Please read these Terms and Conditions ("Terms", "Terms and Conditions") + carefully before using the + {{websiteUrl}} website and the {{mobileApp}} + mobile application (the "Service") operated by {{companyName}}. +

+

+ Your access to and use of the Service is conditioned on your acceptance of + and compliance with these Terms. These Terms apply to all visitors, users, + and others who access or use the Service. +

+

Content

+

+ Our Service allows you to post, link, store, share and otherwise make + available certain information, text, graphics, videos, or other material + ("Content"). You are responsible for the Content you post. +

+

Links To Other Websites

+

+ Our Service may contain links to third-party websites or services that are + not owned or controlled by {{companyName}}. +

+

+ {{companyName}} has no control over, and assumes no responsibility for, the + content, privacy policies, or practices of any third-party websites or + services. +

+

Changes

+

+ We reserve the right, at our sole discretion, to modify or replace these + Terms at any time. If a revision is material, we will try to provide at + least 30 days' notice prior to any new terms taking effect. What constitutes + a material change will be determined at our sole discretion. +

+

Contact Us

+

+ If you have any questions about these Terms, please + contact us. +

+
diff --git a/libs/common/src/constants/terms-condtions.ts b/libs/common/src/constants/terms-condtions.ts new file mode 100644 index 0000000..b0ba0af --- /dev/null +++ b/libs/common/src/constants/terms-condtions.ts @@ -0,0 +1,7 @@ +export const termsAndConditionsData = { + lastUpdated: '25/01/2025', + websiteUrl: 'https://www.Syncrow.ae', + mobileApp: 'Syncrow Mobile App', + companyName: 'Syncrow', + contactEmail: 'contact@Syncrow.ae', +}; diff --git a/src/app.module.ts b/src/app.module.ts index fe656ff..d61ac4c 100644 --- a/src/app.module.ts +++ b/src/app.module.ts @@ -26,6 +26,7 @@ import { SpaceModelModule } from './space-model'; import { InviteUserModule } from './invite-user/invite-user.module'; import { PermissionModule } from './permission/permission.module'; import { RoleModule } from './role/role.module'; +import { TermsConditionsModule } from './terms-conditions/terms-conditions.module'; @Module({ imports: [ ConfigModule.forRoot({ @@ -55,6 +56,7 @@ import { RoleModule } from './role/role.module'; ProjectModule, PermissionModule, RoleModule, + TermsConditionsModule, ], providers: [ { diff --git a/src/terms-conditions/controllers/index.ts b/src/terms-conditions/controllers/index.ts new file mode 100644 index 0000000..6d48cce --- /dev/null +++ b/src/terms-conditions/controllers/index.ts @@ -0,0 +1 @@ +export * from './terms-conditions.controller'; diff --git a/src/terms-conditions/controllers/terms-conditions.controller.ts b/src/terms-conditions/controllers/terms-conditions.controller.ts new file mode 100644 index 0000000..52849ae --- /dev/null +++ b/src/terms-conditions/controllers/terms-conditions.controller.ts @@ -0,0 +1,32 @@ +import { Controller, Get, HttpStatus } from '@nestjs/common'; +import { ApiOperation, ApiTags } from '@nestjs/swagger'; +import { EnableDisableStatusEnum } from '@app/common/constants/days.enum'; +import { ControllerRoute } from '@app/common/constants/controller-route'; // Assuming this is where the routes are defined +import { TermsAndConditionsService } from '../services'; + +@ApiTags('Terms & Conditions Module') +@Controller({ + version: EnableDisableStatusEnum.ENABLED, + path: ControllerRoute.TERMS_AND_CONDITIONS.ROUTE, // use the static route constant +}) +export class TermsConditionsController { + constructor( + private readonly termsAndConditionsService: TermsAndConditionsService, + ) {} + + @Get() + @ApiOperation({ + summary: ControllerRoute.TERMS_AND_CONDITIONS.ACTIONS.FETCH_TERMS_SUMMARY, + description: + ControllerRoute.TERMS_AND_CONDITIONS.ACTIONS.FETCH_TERMS_DESCRIPTION, + }) + async fetchTermsAndConditions() { + const htmlContent = + await this.termsAndConditionsService.fetchTermsAndConditions(); + return { + statusCode: HttpStatus.OK, + message: 'Terms and conditions fetched successfully', + data: htmlContent, + }; + } +} diff --git a/src/terms-conditions/services/index.ts b/src/terms-conditions/services/index.ts new file mode 100644 index 0000000..09d3783 --- /dev/null +++ b/src/terms-conditions/services/index.ts @@ -0,0 +1 @@ +export * from './terms-conditions.service'; diff --git a/src/terms-conditions/services/terms-conditions.service.ts b/src/terms-conditions/services/terms-conditions.service.ts new file mode 100644 index 0000000..c8adf0f --- /dev/null +++ b/src/terms-conditions/services/terms-conditions.service.ts @@ -0,0 +1,38 @@ +import { termsAndConditionsData } from '@app/common/constants/terms-condtions'; +import { Injectable } from '@nestjs/common'; +import * as fs from 'fs'; +import * as path from 'path'; + +@Injectable() +export class TermsAndConditionsService { + async fetchTermsAndConditions(): Promise { + const projectRoot = process.cwd(); + + const filePath = path.join( + projectRoot, + 'libs', + 'common', + 'src', + 'constants', + 'terms-and-conditions.html', + ); + + // Ensure the file exists + if (!fs.existsSync(filePath)) { + throw new Error(`File not found: ${filePath}`); + } + + let htmlContent = fs.readFileSync(filePath, 'utf-8'); + + htmlContent = htmlContent.replace(/(\r\n|\n|\r)/gm, ''); // Removes newlines + + htmlContent = htmlContent + .replace(/{{lastUpdated}}/g, termsAndConditionsData.lastUpdated) + .replace(/{{websiteUrl}}/g, termsAndConditionsData.websiteUrl) + .replace(/{{mobileApp}}/g, termsAndConditionsData.mobileApp) + .replace(/{{companyName}}/g, termsAndConditionsData.companyName) + .replace(/{{contactEmail}}/g, termsAndConditionsData.contactEmail); + + return htmlContent; + } +} diff --git a/src/terms-conditions/terms-conditions.module.ts b/src/terms-conditions/terms-conditions.module.ts new file mode 100644 index 0000000..6dbf974 --- /dev/null +++ b/src/terms-conditions/terms-conditions.module.ts @@ -0,0 +1,12 @@ +import { DeviceRepositoryModule } from '@app/common/modules/device'; +import { Module } from '@nestjs/common'; +import { ConfigModule } from '@nestjs/config'; +import { TermsConditionsController } from './controllers'; +import { TermsAndConditionsService } from './services'; + +@Module({ + imports: [ConfigModule, DeviceRepositoryModule], + controllers: [TermsConditionsController], + providers: [TermsAndConditionsService], +}) +export class TermsConditionsModule {}