Uncategorized

swde

Mehedi Hasan 5 min read

অবশ্যই। পুরো আপডেটটা এক জায়গায় Done / Remaining / Decision / Technical finding হিসেবে সাজিয়ে দিলে এমন দাঁড়ায়:

BS-005 — Complete Status

🟢 1. Code Implementation — সম্পূর্ণ শেষ

Item

Status

কী হয়েছে

NotificationGateway

✅ Done

Notification provider-এর জন্য common seam তৈরি

FCM Push

✅ Done

Android + iOS-এর জন্য FCM driver

APNs handling

✅ Code Done

iOS-এর জন্য FCM → APNs forwarding

Twilio SMS

✅ Done

SMS driver তৈরিfdgfd

Development Fake

✅ Done

Provider ছাড়াই test করার fake driver

Message rules

✅ Done

Pure/testable message classification

Queue notifications

✅ Done

Join / Start / Done / No-show / Cancel

De-duplication

✅ Done

একই booking + stage দ্বিতীয়বার send হবে না

Reminder Job

✅ Code Done

Appointment remindfgder logic

Reminder API

✅ Done

POST /api/jobs/appointment-reminders

Graceful fallback

✅ Done

Token/phone না থাকলে safely fallback

Dead token handling

✅ Done

Invalid/dead push token retire হয়

Queue re-projection

✅ Done

সব relevant reprojectBarberSchedule path wired

Queue-stage notification-এর ৫টি transition

  • ✅ Join

  • ✅ Start

  • ✅ Done

  • ✅ No-showfdgfd

  • ✅ Cancel

এগুলোর ১৮টি integration test আছে এবং pass করেছে।


🟢 2. Testing — সম্পূর্ণ পরিষ্কার

486 / 486 tests pass

এছাড়া:

  • ✅ Typecheck pass

  • ✅ Lint passfdgfd

  • ✅ Build pass

  • ✅ Error cases test

  • ✅ classify() functions pure

  • ✅ Fake notification provider test

  • ✅ Claim race test

  • ✅ RLS test

  • ✅ Reminder-window test

  • ✅ Job route security test

  • ✅ Test data সব baseline-এ ফিরিয়ে দেওয়া হয়েছে

  • ✅ Database-এ কোনো test row পড়ে নেই


🟢 3. Live Database Verification — Done

0019_notifications migration live DB-তে apply করে verify করা হয়েছে।

Claim race

একই (booking, stage) দুইবার insert করলে:

1 / 0

অর্থাৎ একজনই claim পায়।

RLS

authenticated role:

SELECT → empty
INSERT → 42501

অর্থাৎ runAsPlatform ছাড়া notification claim করা যাবে না।

এটা গুরুত্বপূর্ণ, কারণ না হলে ভুলভাবে "আগেই claim হয়েছে" ধরে notification silently skip হওয়ার ঝুঁকি থাকত।

Reminder

  • ৪৫ মিনিট দূরের appointment পাওয়া গেছে

  • Shop timezone পাওয়া গেছে

  • Claim করার পর একই query আবার চালালে 0 এসেছে

Job route

Secret ছাড়া:

503

অর্থাৎ protected।


🟢 4. Queue Lane / Reprojection — সম্পূর্ণ শেষ

reprojectBarberSchedule-এর ৩টি call site পাওয়া গেছে:

  1. Transition helper

  2. Confirm payment

  3. No-show

সবগুলো notification-এর সাথে wired।

অন্যদিকে:

  • expireQueueEntry → position change করে না

  • pauseBarberQueue → position change করে না

তাই সেখানে notification লাগেনি।

এই item-এ আর কিছু বাকি নেই।


🟡 5. Appointment Reminder — Code শেষ, Deployment বাকি

Code তৈরি আছে, কিন্তু production-এ automaticভাবে চলছে না।

বাকি:

  • NOTIFICATION_JOB_SECRET production-এ set করা

  • pg_cron entry তৈরি করা

  • Deployment URL বসানো

  • Cron secret configure করা

আরেকটি Contract decision

বর্তমানে reminder:

60 minutes

route-এর বাইরের constant হিসেবে আছে।

কিন্তু contract অনুযায়ী timing rule ideally:

Shop.policy

থেকে আসা উচিত।

তাই barbershop_docs-এ:

appointment_reminder_minutes

যোগ করার decision বাকি।

এটা code bug নয় — contract/documentation decision।


🟡 6. FCM Push — Code Done, Real Provider Test বাকি

Code সম্পূর্ণ।

Production setup-এর জন্য লাগবে:

  • FCM_PROJECT_ID

  • FCM_CLIENT_EMAIL

  • FCM_PRIVATE_KEY

  • Firebase Console-এ APNs .p8 key upload

  • একটি real Android push test

  • একটি real iOS push test

গুরুত্বপূর্ণ

iOS-এর জন্য repo-তে আলাদা APNs key রাখার দরকার নেই।

Flow:

App
 ↓
FCM
 ↓
APNs
 ↓
iPhone

কিন্তু Firebase-কে APNs-এ forward করার জন্য Firebase Console-এ APNs .p8 configuration অবশ্যই লাগবে।


🟡 7. Twilio SMS — Code Done, Real SMS Test বাকি

Twilio integration:

  • ✅ Code

  • ✅ Credentials available

  • ✅ Fake test

  • ✅ Error handling

  • ✅ Fallback logic

বাকি শুধু:

  • একটি real SMS পাঠিয়ে verify করা

এখানে SMS-এর জন্য টাকা খরচ হতে পারে, তাই অনুমতি ছাড়া real SMS পাঠানো হয়নি।


🟠 8. .env.local — Development SMS Risk

বর্তমানে health configuration:

push = fake
sms  = twilio

মানে development environment-এ:

Push → Fake
SMS  → Real Twilio

তাই কোনো real customer phone number database-এ থাকলে development থেকেও আসল SMS চলে যেতে পারে।

বর্তমানে customer phone empty থাকায় immediate risk নেই।

Recommended deployment decision

Development:

push = fake
sms  = fake

Production:

push = fcm
sms  = twilio

🟡 9. Message Body — Draft মিলানো বাকি

৩টি title card অনুযায়ী নেওয়া হয়েছে।

কিন্তু message body-এর official draft এই repo-তে নেই।

তাই body আপাতত simple রাখা হয়েছে।

বাকি:

  • barbershop_docs-এর official message draft নেওয়া

  • বর্তমান body-এর সাথে মিলানো

  • প্রয়োজন হলে wording update


🟢 10. Customer Phone Edge Case — Fixed

Database-এ:

customers.phone = ''

হতে পারে, শুধু:

NULL

নয়।

তাই এখন reachable() ইচ্ছাকৃতভাবে empty string handle করে।

এটা future-এর এই ধরনের ভুল আটকায়:

phone !== null

🟢 11. Performance Investigation — Root Cause Found

এখানে code-level performance problem পাওয়া যায়নি।

মূল সমস্যা:

App
  ↓
Singapore Supabase DB

আপনার development machine:

Dhaka

Database:

Singapore

Measured RTT:

~57 ms

একটি scoped DB read-এ প্রায় ৫টি round trip:

5 × 57 ms
≈ 285 ms

বাস্তবে প্রায়:

~280 ms

Database-এর নিজের query execution:

~0.5 ms

অর্থাৎ মূল bottleneck:

Network distance, database query নয়।


🟢 12. Performance Investigation-এ যেগুলো ভুল সমস্যা ছিল, সেগুলো বাদ

N+1

❌ N+1 পাওয়া যায়নি।

/api/v1/shops request:

মাত্র 2 statements

Identity queries

৩টি identity query আছে:

admin_users
barbers
customers

কিন্তু Promise.all-এ parallel:

~170 ms

Sequential হলে:

~283 ms

অর্থাৎ এটাও সমস্যা নয়।

RLS preamble

Pipeline করার চেষ্টা করে দেখা হয়েছে।

Result:

277 ms vs 276 ms

প্রায় কোনো লাভ নেই।

তাই এটাও bottleneck নয়।


🟢 13. Development Performance-এর আসল Solution

Option 1 — Local PostgreSQL

সবচেয়ে practical development setup:

Next.js
   ↓
Local PostgreSQL

RTT প্রায়:

~0.1 ms

তাই বর্তমান ~280ms DB round-trip overhead প্রায় চলে যাবে।

Local setup-এর জন্য migration/seed প্রস্তুত আছে।


Option 2 — Production একই region-এ

Production app-কে Singapore-এ deploy করলে:

App → Singapore DB

তখন network latency অনেক কম হবে।

Production architecture-এর জন্য এটা সবচেয়ে গুরুত্বপূর্ণ deployment consideration।


Option 3 — Pooler

Production scale-out-এর আগে:

5432

থেকে appropriate pooler configuration, অর্থাৎ:

6543

consider করতে হবে।

এটা মূলত connection scalability-এর বিষয়; বর্তমান 57ms network latency কমাবে না।


🟢 14. Dev Compile Time

First request-এ Next.js route compile হওয়ার কারণে:

First hit    ~1303 ms
Second hit   ~274 ms

এটা development mode-এর স্বাভাবিক behaviour।

Production:

next build

এর পরে এই first-request compile overhead থাকবে না।


🔴 এখন আসলে যেগুলো বাকি

সব মিলিয়ে ৫টি বাস্তব কাজ/decision আছে:

A. Firebase setup

  • FCM service account

  • APNs .p8 Firebase-এ upload

  • Real Android push test

  • Real iOS push test

B. Twilio verification

  • অনুমতি নিয়ে ১টি real SMS test

C. Reminder deployment

  • NOTIFICATION_JOB_SECRET

  • pg_cron

  • Deployment URL

  • Cron configuration

D. Contract update

barbershop_docs-এ:

appointment_reminder_minutes

যোগ করার সিদ্ধান্ত।

E. Message draft

Official message body barbershop_docs থেকে নিয়ে current implementation-এর সাথে মিলানো।


🟢 যেগুলোতে আর কাজ লাগবে না

বিষয়

Status

Notification architecture

✅

FCM code

✅

Twilio code

✅

Queue notifications

✅

5 queue transitions

✅

De-duplication

✅

RLS

✅

Claim race

✅

Reminder code

✅

Reminder endpoint

✅

Graceful fallback

✅

Dead-token handling

✅

Tests

✅ 486/486

Typecheck

✅

Lint

✅

Build

✅

DB migration

✅

Live DB verification

✅

Queue reprojection

✅

Performance investigation

✅

Performance root cause

✅ Identified


🚦Final Status

BS-005-এর code implementation essentially complete.

বর্তমান অবস্থাটা:

CODE                    ✅ DONE
TESTS                   ✅ 486/486fgfd
DATABASE                ✅ VERIFIED
RLS                     ✅ VERIFIED
QUEUE NOTIFICATIONS     ✅ DONEdfgf
REMINDER LOGIC          ✅ DONE
FCM CODE                ✅ DONE
TWILIO CODE             ✅ DONE
FALLBACK                ✅ DONE

REAL FCM TEST           ⏳ BAKI
REAL SMS TEST           ⏳ BAKI
FIREBASE/APNs SETUP     ⏳ BAKI
CRON DEPLOYMENT         ⏳ BAKI
REMINDER CONTRACT       ⏳ DECISION BAKI
MESSAGE BODY REVIEW     ⏳ BAKI

PUSH TO GIT             ❌ NOT YET

সবচেয়ে গুরুত্বপূর্ণ

এখনই code push করার আগে মূল ৩টা decision নিতে হবে:

  1. appointment_reminder_minutes Shop.policy-তে যোগ হবে কি না

  2. Official message body/draft কোনটা হবে

  3. Dev environment-এ Twilio real SMS থাকবে, নাকি fake করা হবে

আর performance-এর ক্ষেত্রে code rewrite দরকার নেই। Development-এ local Postgres এবং production-এ DB-এর কাছাকাছি app deployment—এই architecture-টাই মূল সমাধান।