
অবশ্যই। পুরো আপডেটটা এক জায়গায় 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 |
|
|
Graceful fallback |
✅ Done |
Token/phone না থাকলে safely fallback |
|
Dead token handling |
✅ Done |
Invalid/dead push token retire হয় |
|
Queue re-projection |
✅ Done |
সব relevant |
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 পাওয়া গেছে:
-
Transition helper
-
Confirm payment
-
No-show
সবগুলো notification-এর সাথে wired।
অন্যদিকে:
-
expireQueueEntry→ position change করে না -
pauseBarberQueue→ position change করে না
তাই সেখানে notification লাগেনি।
এই item-এ আর কিছু বাকি নেই।
🟡 5. Appointment Reminder — Code শেষ, Deployment বাকি
Code তৈরি আছে, কিন্তু production-এ automaticভাবে চলছে না।
বাকি:
-
NOTIFICATION_JOB_SECRETproduction-এ set করা -
pg_cronentry তৈরি করা -
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
.p8key 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
.p8Firebase-এ 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 নিতে হবে:
-
appointment_reminder_minutesShop.policy-তে যোগ হবে কি না -
Official message body/draft কোনটা হবে
-
Dev environment-এ Twilio real SMS থাকবে, নাকি fake করা হবে
আর performance-এর ক্ষেত্রে code rewrite দরকার নেই। Development-এ local Postgres এবং production-এ DB-এর কাছাকাছি app deployment—এই architecture-টাই মূল সমাধান।
