wishan / README.md
WISHAN
A mobile app for buying asset shares
WISHAN
Wishan Platform is a digital draw and asset participation system designed to offer users the opportunity to acquire high-value assets such as real estate, luxury vehicles, and watches through a transparent, Sharia-compliant mechanism. Recognizing the need for a secure, scalable, and engaging digital presence, the platform’s founders have decided to develop a comprehensive website and mobile application by outsourcing to a vendor with the required technical expertise.
Problem Statement
This platform will serve as a hub for platform users, providing:
- Full access to available and upcoming draws.
- Secure wallet management and payment processing.
- A robust loyalty and rewards program.
- Clear compliance oversight from both legal and Sharia advisors.
The project aims to enhance user engagement through interactive features such as countdown timers, asset reminders, referral programs, and loyalty-based free entries, while ensuring operational transparency through automated, tamper-proof draw mechanisms and clearly defined reporting processes.
Supporting documents
This section includes all documents in the repo, which can be more or less than what is in the template. For example:
- Contribution guide
- Product brief
- Features list
- System design
- Admin document
- API document
- Frontend document
- Postman collection — import into Postman to exercise the API (see Accessing postman)
Getting started
Pre-requisites
Project setup
Clone the repository
git clone https://github.com/rihal-om/wishan
cd wishan
Running the app locally (Docker Compose)
- Run docker-compose to start the application
docker-compose up
# or
make run
- Once the application is running, open your browser and navigate to:
# Frontend
http://localhost:3000
Running the app locally (Kubernetes)
Pre-requisites
- kubectl
- A local Kubernetes cluster — either:
- Docker Desktop with Kubernetes enabled (Settings > Kubernetes > Enable)
- or kind:
brew install kind && kind create cluster
Start the app
- Build local images and apply manifests
make k8s-dev-up
- In a separate terminal, start port-forwarding
make k8s-dev-ports
- Access the services:
- API: http://localhost:8081
- Admin: http://localhost:3000
- MinIO Console: http://localhost:9001
Stop the app
make k8s-dev-down
Available targets
| Target | Description |
|---|---|
make k8s-dev-build | Build local Docker images (wishan-api:dev, wishan-admin:dev) |
make k8s-dev-up | Build images + apply k8s manifests |
make k8s-dev-down | Delete all k8s dev resources |
make k8s-dev-ports | Port-forward API, Admin, and MinIO to localhost |
Seeding & Cleanup
Seed the database with test data for the admin dashboard (categories, assets, media, draws, tickets, ads, sponsors, invoices, receipts, and a test admin user):
make populate-admin
Remove all seeded data (truncates all related tables):
make cleanup-admin
Other seed commands:
| Target | Description |
|---|---|
make populate-users | Seed test users |
make populate-admin | Seed admin dashboard test data (assets, draws, tickets, ads, sponsors, payments, etc.) |
make cleanup-admin | Truncate all tables seeded by populate-admin |
make populate-notifications | Seed 20 test notifications |
make participate DRAW_ID=<id> NUM_PARTICIPANTS=<n> | Add participants to a specific draw |
Accessing postman
Import docs/api.postman_collection.json into Postman.
Then, before running the requests:
- Click on the collection
- Click on the Variables tab
- Set
firebase_api_keytoAIzaSyB6MjLCZCN0nSh5Zb4fEI9ENiveafV0ZSU(mentioned here)
The Buy ticket request automatically stores invoice_id and ticket_id as collection variables on a successful response, so the BNPL flow (/bnpl/plans, /bnpl/confirm) and invoice endpoints can reference them via {{invoice_id}} without manual copy-paste.
If you face any issues, reach out to the backend team.
Tech Stack
| Category | Tool | Description |
|---|---|---|
| Frontend | React Native and React | UI library/framework |
| Backend | Go | Server-side language/framework |
| Authentication | Firebase | IAM system |
| Database | Postgres | Relational/NoSQL DB |
| Object Storage | MinIO | S3-compatible object storage for media files |
| Containerization | Docker | Container platform |
Media Storage with MinIO
The application uses MinIO for storing media files (images, videos, etc.). MinIO is an S3-compatible object storage service that runs in Docker.
MinIO Configuration
MinIO is automatically started with docker-compose up and is configured in api/config.yaml:
minio:
endpoint: "minio:9000"
access_key: "minioadmin"
secret_key: "minioadmin"
bucket: "wishan-media"
use_ssl: false
public_url: "http://localhost:9000"
Accessing MinIO Console
Once the application is running, you can access the MinIO web console at:
- URL: http://localhost:9001
- Username:
minioadmin - Password:
minioadmin
Media Upload API
The admin panel provides endpoints for managing media:
POST /admin/media- Upload a file (multipart/form-data withfilefield)GET /admin/media- List all media with paginationPUT /admin/media/:id- Update media metadata (alt text)DELETE /admin/media/:id- Delete media from storage and database
Files are automatically stored in MinIO with public read access, and metadata is saved to PostgreSQL.
Project Team
| Name | Role | GitHub |
|---|---|---|
| Adnan Barakat | Project Manager | @Adnan3182 |
| Omar Al Shabibi | Business Analyst | @omarshabibi |
| Mohamed Al-Rasbi | Tech Lead | @mohdrasbi |
| Jishnu Kidile | UX/UI Designer | @jkidile |
| Maymoona Al Baloshi | Lead Frontend Dev | @MaymoonaAlBoloshi |
| Sharifa Taimur | Frontend Dev | @SharifaTaimur |
| Reem Al Qarni | Frontend Dev | @ireemalqarni |
| Omar Al Suleimani | Backend Dev | @omar-alsuleimani |
| Ghassan Al Kulaibi | Backend Dev | @Gha5san |