diff --git a/src/common/modules/lookup/controllers/lookup.controller.ts b/src/common/modules/lookup/controllers/lookup.controller.ts index 904c20d..4aadb5c 100644 --- a/src/common/modules/lookup/controllers/lookup.controller.ts +++ b/src/common/modules/lookup/controllers/lookup.controller.ts @@ -1,9 +1,12 @@ -import { Controller, Get, UseGuards } from '@nestjs/common'; +import { BadRequestException, Controller, Get, Req, UseGuards } from '@nestjs/common'; import { ApiBearerAuth, ApiTags } from '@nestjs/swagger'; +import { Request } from 'express'; import { AccessTokenGuard } from '~/common/guards'; -import { ApiDataArrayResponse } from '~/core/decorators'; +import { ApiDataArrayResponse, ApiLangRequestHeader } from '~/core/decorators'; import { ResponseFactory } from '~/core/utils'; import { DocumentMetaResponseDto } from '~/document/dtos/response'; +import { HelpSupportFaqResponseDto } from '../dtos/response'; +import { LookupLanguage } from '../enums'; import { LookupService } from '../services'; @Controller('lookup') @@ -29,4 +32,22 @@ export class LookupController { return ResponseFactory.dataArray(avatars.map((avatar) => new DocumentMetaResponseDto(avatar))); } + + @UseGuards(AccessTokenGuard) + @Get('help-support-faqs') + @ApiDataArrayResponse(HelpSupportFaqResponseDto) + @ApiLangRequestHeader() + getHelpSupportFaqs(@Req() request: Request) { + const header = request.headers['accept-language']; + const lang = Array.isArray(header) ? header[0] : header; + const normalized = (lang || '').trim().toLowerCase(); + + if (normalized && normalized !== LookupLanguage.EN && normalized !== LookupLanguage.AR) { + throw new BadRequestException('Accept-Language must be "en" or "ar".'); + } + + const faqs = this.lookupService.getHelpSupportFaqs(normalized === LookupLanguage.AR ? 'ar' : 'en'); + + return ResponseFactory.dataArray(faqs); + } } diff --git a/src/common/modules/lookup/data/help-support-faqs.json b/src/common/modules/lookup/data/help-support-faqs.json new file mode 100644 index 0000000..6d4b28b --- /dev/null +++ b/src/common/modules/lookup/data/help-support-faqs.json @@ -0,0 +1,72 @@ +[ + { + "id": "transfer_failed_or_delayed", + "question_en": "What happens if a transfer fails or is delayed?", + "answer_en": "If a transfer fails, the amount will not be deducted from your balance. If a transfer is delayed, it will usually complete within a short time. If the issue continues, please contact customer support.", + "question_ar": "ماذا يحدث إذا فشل التحويل أو تأخر؟", + "answer_ar": "إذا فشل التحويل، لن يُخصم المبلغ من رصيدك. إذا تأخر التحويل، فعادةً يكتمل خلال وقت قصير. إذا استمرت المشكلة، يرجى التواصل مع دعم العملاء." + }, + { + "id": "same_email_or_phone_multiple_accounts", + "question_en": "Can I use the same email or phone number for multiple accounts?", + "answer_en": "No. Each email address and phone number can be used for only one account.", + "question_ar": "هل يمكنني استخدام نفس البريد الإلكتروني أو رقم الهاتف لعدة حسابات؟", + "answer_ar": "لا. يمكن استخدام كل بريد إلكتروني ورقم هاتف لحساب واحد فقط." + }, + { + "id": "update_profile_details", + "question_en": "How do I update my profile details?", + "answer_en": "Go to Profile - Edit Profile, update your details, and save the changes.", + "question_ar": "كيف يمكنني تحديث بيانات ملفي الشخصي؟", + "answer_ar": "انتقل إلى الملف الشخصي - تعديل الملف الشخصي، حدّث بياناتك ثم احفظ التغييرات." + }, + { + "id": "change_email_address", + "question_en": "How do I change my email address?", + "answer_en": "You can update your email or phone number from Profile - Edit Profile. You may be asked to re-login for security reasons.", + "question_ar": "كيف أغيّر عنوان بريدي الإلكتروني؟", + "answer_ar": "يمكنك تحديث بريدك الإلكتروني أو رقم هاتفك من الملف الشخصي - تعديل الملف الشخصي. قد يُطلب منك تسجيل الدخول مرة أخرى لأسباب أمنية." + }, + { + "id": "change_phone_number", + "question_en": "How do I change my phone number?", + "answer_en": "You cannot update your phone number", + "question_ar": "كيف أغيّر رقم هاتفي؟", + "answer_ar": "لا يمكنك تحديث رقم هاتفك." + }, + { + "id": "activate_card", + "question_en": "How do I activate my card?", + "answer_en": "Transfer 20 SAR to activate your card. Once completed, your card will become active.", + "question_ar": "كيف أقوم بتفعيل بطاقتي؟", + "answer_ar": "حوّل 20 ريالًا سعوديًا لتفعيل بطاقتك. بعد إتمام التحويل، ستصبح البطاقة نشطة." + }, + { + "id": "why_transfer_20_sar", + "question_en": "Why do I need to transfer 20 SAR to activate the card?", + "answer_en": "This amount is required to activate the card and enable usage.", + "question_ar": "لماذا يجب علي تحويل 20 ريالًا سعوديًا لتفعيل البطاقة؟", + "answer_ar": "هذا المبلغ مطلوب لتفعيل البطاقة وتمكين استخدامها." + }, + { + "id": "where_activation_amount_go", + "question_en": "Where does the activation amount go?", + "answer_en": "The activation amount is collected by the company as part of the card activation process.", + "question_ar": "أين يذهب مبلغ التفعيل؟", + "answer_ar": "يتم تحصيل مبلغ التفعيل من قبل الشركة كجزء من عملية تفعيل البطاقة." + }, + { + "id": "top_up_external_bank", + "question_en": "Can I top up from an external bank account?", + "answer_en": "Yes. You can transfer funds from your external bank to your ZOD account", + "question_ar": "هل يمكنني الشحن من حساب بنكي خارجي؟", + "answer_ar": "نعم. يمكنك تحويل الأموال من بنكك الخارجي إلى حسابك في زد." + }, + { + "id": "data_security", + "question_en": "Is my data secure in the ZOD app?", + "answer_en": "Yes. We use secure systems and encryption to protect your data.", + "question_ar": "هل بياناتي آمنة في تطبيق زد؟", + "answer_ar": "نعم. نستخدم أنظمة آمنة وتشفيرًا لحماية بياناتك." + } +] diff --git a/src/common/modules/lookup/dtos/response/help-support-faq.response.dto.ts b/src/common/modules/lookup/dtos/response/help-support-faq.response.dto.ts new file mode 100644 index 0000000..2441d9b --- /dev/null +++ b/src/common/modules/lookup/dtos/response/help-support-faq.response.dto.ts @@ -0,0 +1,18 @@ +import { ApiProperty } from '@nestjs/swagger'; + +export class HelpSupportFaqResponseDto { + @ApiProperty() + id!: string; + + @ApiProperty() + question!: string; + + @ApiProperty() + answer!: string; + + constructor(item: { id: string; question: string; answer: string }) { + this.id = item.id; + this.question = item.question; + this.answer = item.answer; + } +} diff --git a/src/common/modules/lookup/dtos/response/index.ts b/src/common/modules/lookup/dtos/response/index.ts new file mode 100644 index 0000000..2ac00b4 --- /dev/null +++ b/src/common/modules/lookup/dtos/response/index.ts @@ -0,0 +1 @@ +export * from './help-support-faq.response.dto'; diff --git a/src/common/modules/lookup/enums/index.ts b/src/common/modules/lookup/enums/index.ts new file mode 100644 index 0000000..bc4c54e --- /dev/null +++ b/src/common/modules/lookup/enums/index.ts @@ -0,0 +1 @@ +export * from './lookup-language.enum'; diff --git a/src/common/modules/lookup/enums/lookup-language.enum.ts b/src/common/modules/lookup/enums/lookup-language.enum.ts new file mode 100644 index 0000000..02eeeb4 --- /dev/null +++ b/src/common/modules/lookup/enums/lookup-language.enum.ts @@ -0,0 +1,4 @@ +export enum LookupLanguage { + EN = 'en', + AR = 'ar', +} diff --git a/src/common/modules/lookup/services/lookup.service.ts b/src/common/modules/lookup/services/lookup.service.ts index 0955bbf..aaca5fb 100644 --- a/src/common/modules/lookup/services/lookup.service.ts +++ b/src/common/modules/lookup/services/lookup.service.ts @@ -1,6 +1,9 @@ import { Injectable, Logger } from '@nestjs/common'; import { DocumentType } from '~/document/enums'; import { DocumentService, OciService } from '~/document/services'; +import { HelpSupportFaqResponseDto } from '../dtos/response'; +import { LookupLanguage } from '../enums'; +import helpSupportFaqs from '../data/help-support-faqs.json'; @Injectable() export class LookupService { @@ -33,4 +36,16 @@ export class LookupService { this.logger.log(`Default tasks logos returned successfully`); return documents; } + + getHelpSupportFaqs(lang: LookupLanguage = LookupLanguage.EN): HelpSupportFaqResponseDto[] { + const useArabic = lang === LookupLanguage.AR; + + return helpSupportFaqs.map((faq) => + new HelpSupportFaqResponseDto({ + id: faq.id, + question: useArabic ? faq.question_ar : faq.question_en, + answer: useArabic ? faq.answer_ar : faq.answer_en, + }), + ); + } }