{"id":38037259,"url":"https://github.com/fauzan264/grocery-api","last_synced_at":"2026-01-16T19:50:56.509Z","repository":{"id":316418202,"uuid":"1046003885","full_name":"fauzan264/grocery-api","owner":"fauzan264","description":"Final Project Purwadhika","archived":false,"fork":false,"pushed_at":"2025-11-05T05:27:26.000Z","size":393,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"master","last_synced_at":"2025-11-05T05:36:44.435Z","etag":null,"topics":["backend","express","typescript"],"latest_commit_sha":null,"homepage":"https://grocery-api-six.vercel.app","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/fauzan264.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-08-28T03:38:55.000Z","updated_at":"2025-11-05T05:35:14.000Z","dependencies_parsed_at":"2025-10-19T22:22:43.859Z","dependency_job_id":"739f757d-3630-4125-94f3-767a2131df4f","html_url":"https://github.com/fauzan264/grocery-api","commit_stats":null,"previous_names":["fauzan264/grocery-api"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/fauzan264/grocery-api","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fauzan264%2Fgrocery-api","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fauzan264%2Fgrocery-api/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fauzan264%2Fgrocery-api/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fauzan264%2Fgrocery-api/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/fauzan264","download_url":"https://codeload.github.com/fauzan264/grocery-api/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fauzan264%2Fgrocery-api/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28482022,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-16T11:59:17.896Z","status":"ssl_error","status_checked_at":"2026-01-16T11:55:55.838Z","response_time":107,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["backend","express","typescript"],"created_at":"2026-01-16T19:50:55.776Z","updated_at":"2026-01-16T19:50:56.500Z","avatar_url":"https://github.com/fauzan264.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Grocery Backend API\n\nBackend API for an grocery application built with Express.js, TypeScript, Prisma ORM, and PostgreSQL.\n\n## Table of Contents\n\n- [Key Features](#key-features)\n- [Technologies](#technologies)\n- [Folder Structure](#folder-structure)\n- [Prerequisites](#prerequisites)\n- [Installation](#installation)\n- [Environment Configuration](#environment-configuration)\n- [Running the Application](#running-the-application)\n- [Database Schema](#database-schema)\n- [Cron Jobs](#cron-jobs)\n- [Middleware](#middleware)\n- [Documentation](#documentation)\n\n## Key Features\n\n**Authentication \u0026 Authorization**\n\n- JWT-based authentication\n- Google OAuth integration\n- Role-based access control (Admin, Customer)\n- Email verification\n- Password reset functionality\n\n**Grocery Core**\n\n- Product management with categories\n- Shopping cart functionality\n- Order processing\n- Payment integration with Midtrans\n- Stock management\n- Shipping management\n- Discount system\n\n**Admin Features**\n\n- Order management\n- Store management\n- Report generation\n- Product \u0026 category management\n\n**File Management**\n\n- Cloudinary integration for image upload\n- Multer for handling file uploads\n\n**Email Services**\n\n- Nodemailer with Google App Password\n- Email templates with Handlebars\n- Verification \u0026 reset password emails\n\n**Automated Tasks**\n\n- Cron jobs for transaction confirmation\n- Auto-expire for pending transactions\n\n## Technologies\n\n### Core\n\n- **Node.js** - Runtime environment\n- **Express.js** - Web framework\n- **TypeScript** - Programming language\n- **Prisma ORM** - Database ORM\n- **PostgreSQL** - Database (via Supabase)\n\n### Authentication \u0026 Security\n\n- **jsonwebtoken** - JWT implementation\n- **bcrypt** - Password hashing\n- **googleapis** - Google OAuth\n- **helmet** - Security headers\n- **express-rate-limit** - Rate limiting\n\n### File \u0026 Media\n\n- **cloudinary** - Cloud storage for images\n- **multer** - File upload handling\n- **streamifier** - Stream utility\n\n### Utilities\n\n- **nodemailer** - Email sending\n- **handlebars** - Email templates\n- **node-cron** - Scheduled tasks\n- **yup** - Validation schema\n- **luxon** - Date/time manipulation\n- **uuid** - Unique ID generation\n- **slugify** - URL-friendly strings\n\n### Payment\n\n- **midtrans-client** - Payment gateway integration\n\n## Folder Structure\n\n```\nbackend/\n├── docs/                     # Documentation\n│   └── api-docs/            # API documentation\n│       ├── grocery.postman_collection.json  # Postman collection\n│       ├── README.md        # API documentation guide\n│       └── dbdiagram.md     # Database diagram\n├── src/\n│   ├── controllers/          # Route controllers\n│   ├── db/                   # Database connection\n│   │   └── connection.ts\n│   ├── jobs/                 # Cron jobs\n│   │   └── cron/\n│   │       ├── confirm.transaction.job.ts\n│   │       ├── confirm.transaction.schedule.ts\n│   │       ├── expiry.transaction.job.ts\n│   │       └── expiry.transaction.schedule.ts\n│   ├── lib/                  # Utility libraries\n│   │   ├── auth.google.ts\n│   │   ├── cloudinary.upload.ts\n│   │   ├── jwt.sign.ts\n│   │   └── transporter.ts\n│   ├── middlewares/          # Express middlewares\n│   │   ├── auth.middleware.ts\n│   │   ├── authorizeRoles.middleware.ts\n│   │   ├── authorizeStore.middleware.ts\n│   │   ├── error.handler.ts\n│   │   ├── jwt.verify.ts\n│   │   ├── multer.middleware.ts\n│   │   ├── orderId.middleware.ts\n│   │   ├── rate.limiter.ts\n│   │   ├── role.verify.ts\n│   │   ├── uploader.multer.ts\n│   │   └── validateYup.ts\n│   ├── public/               # Static files\n│   │   ├── reset-password.html\n│   │   └── verify-email.html\n│   ├── routes/               # API routes\n│   │   ├── auth.router.ts\n│   │   ├── cart.router.ts\n│   │   ├── categories.router.ts\n│   │   ├── index.router.ts\n│   │   ├── order.router.ts\n│   │   ├── orderAdmin.router.ts\n│   │   ├── payment.router.ts\n│   │   ├── product.router.ts\n│   │   ├── public.router.ts\n│   │   ├── reportRoutes.ts\n│   │   ├── shipping.router.ts\n│   │   ├── stock.router.ts\n│   │   ├── store.router.ts\n│   │   ├── upload.router.ts\n│   │   └── user.router.ts\n│   ├── scripts/              # Utility scripts\n│   │   └── generateToken.ts\n│   ├── seed/                 # Database seeding\n│   │   └── seed.ts\n│   ├── services/             # Business logic\n│   │   ├── adminOrder.service.ts\n│   │   ├── auth.service.ts\n│   │   ├── cart.service.ts\n│   │   ├── category.service.ts\n│   │   ├── discount.service.ts\n│   │   ├── orders.service.ts\n│   │   ├── payment.service.ts\n│   │   ├── product.service.ts\n│   │   ├── public.service.ts\n│   │   ├── report.service.ts\n│   │   ├── shipping.service.ts\n│   │   ├── stock.service.ts\n│   │   ├── store.service.ts\n│   │   └── user.service.ts\n│   ├── types/                # TypeScript type definitions\n│   │   ├── auth.ts\n│   │   ├── cart.ts\n│   │   ├── order.ts\n│   │   ├── shipment.ts\n│   │   ├── store.ts\n│   │   └── user.ts\n│   ├── utils/                # Utility functions\n│   │   ├── cloudinary.ts\n│   │   ├── date.ts\n│   │   ├── pagination.ts\n│   │   └── roles.util.ts\n│   ├── validations/          # Validation schemas\n│   │   ├── auth.validation.ts\n│   │   ├── cart.validation.ts\n│   │   ├── order.validation.ts\n│   │   ├── store.validation.ts\n│   │   ├── user.admin.validation.ts\n│   │   └── user.validation.ts\n│   └── index.ts              # Application entry point\n├── prisma/\n│   └── schema.prisma         # Prisma schema\n├── .env                      # Environment variables\n├── .env.example              # Environment variables example\n├── .gitignore\n├── nodemon.json\n├── package.json\n├── package-lock.json\n└── tsconfig.json\n```\n\n## Prerequisites\n\n- Node.js (v18 or higher)\n- PostgreSQL database (recommended using Supabase)\n- Cloudinary account for image storage\n- Google Cloud Console project (for OAuth)\n- Midtrans account (for payment gateway)\n- Gmail with App Password (for email service)\n\n## Installation\n\n**Clone repository**\n\n```bash\ngit clone \u003crepository-url\u003e\ncd backend\n```\n\n**Install dependencies**\n\n```bash\nnpm install\n```\n\n**Setup database**\n\n```bash\n# Generate Prisma Client\nnpm run prisma:generate\n\n# Run migrations\nnpx prisma migrate dev\n\n# Seed database (optional)\nnpx prisma db seed\n```\n\n## Environment Configuration\n\nCreate a `.env` file in the root folder with the following configuration:\n\n```env\n# Database Connection\n# Connection pooling for production\nDATABASE_URL=\"postgresql://user:password@host:5432/database?pgbouncer=true\"\n\n# Direct connection for migrations\nDIRECT_URL=\"postgresql://user:password@host:5432/database?schema=public\"\n\n# JWT Configuration\nJWT_SECRET_KEY=\"your_secure_jwt_secret_key_min_32_characters\"\n\n# Google Gmail Configuration\nGOOGLE_APP_PASSWORD=\"your_16_character_app_password\"\n\n# Cloudinary Configuration\nCLOUDINARY_CLOUD_NAME=\"your_cloudinary_cloud_name\"\nCLOUDINARY_API_KEY=\"your_cloudinary_api_key\"\nCLOUDINARY_API_SECRET=\"your_cloudinary_api_secret\"\n\n# Google OAuth Configuration\nGOOGLE_CLIENT_ID=\"your_client_id.apps.googleusercontent.com\"\nGOOGLE_CLIENT_SECRET=\"your_google_client_secret\"\nGOOGLE_AUTH_CALLBACK=\"http://localhost:4000/api/auth/google/callback\"\n\n# Frontend URLs\nLINK_RESET_PASSWORD=\"http://localhost:3000/reset-password\"\nLINK_VERIFICATION_EMAIL=\"http://localhost:3000/verify-email\"\nLINK_AUTH_SUCCESS=\"http://localhost:3000/auth-success\"\nLINK_AUTH_LOGIN=\"http://localhost:3000/login\"\n\n# Security\nBCRYPT_SALT_ROUNDS=10\n```\n\n### Setup Guide for External Services\n\n**PostgreSQL Database (Supabase)**\n\n1. Create an account at [Supabase](https://supabase.com)\n2. Create a new project\n3. Get connection string from Settings \u003e Database\n4. Copy `DATABASE_URL` and `DIRECT_URL`\n\n**Cloudinary**\n\n1. Register at [Cloudinary](https://cloudinary.com)\n2. From Dashboard, copy:\n   - Cloud Name\n   - API Key\n   - API Secret\n\n**Google OAuth \u0026 Gmail**\n\nGoogle OAuth:\n\n1. Open [Google Cloud Console](https://console.cloud.google.com)\n2. Create a new project or select existing project\n3. Enable Google+ API\n4. Create OAuth 2.0 credentials\n5. Add authorized redirect URI: `http://localhost:4000/api/auth/google/callback`\n6. Copy Client ID and Client Secret\n\nGmail App Password:\n\n1. Enable 2FA on Google Account\n2. Open Security Settings\n3. Generate App Password\n4. Copy 16-character password\n\n**Midtrans Payment Gateway**\n\n1. Register at [Midtrans](https://midtrans.com)\n2. Get Server Key and Client Key\n3. Configure in code as needed\n\n## Running the Application\n\n**Development Mode**\n\n```bash\nnpm run dev\n```\n\nServer will run at `http://localhost:4000` with hot-reload using nodemon.\n\n**Production Build**\n\n```bash\n# Build TypeScript to JavaScript\nnpm run build\n\n# Run production server\nnpm start\n```\n\n**Database Commands**\n\n```bash\n# Generate Prisma Client\nnpm run prisma:generate\n\n# Run migrations\nnpx prisma migrate dev\n\n# Reset database\nnpx prisma migrate reset\n\n# Seed database\nnpx prisma db seed\n\n# Open Prisma Studio\nnpx prisma studio\n```\n\n## Database Schema\n\nDatabase uses Prisma ORM with PostgreSQL. Main schemas include:\n\n- **User** - User accounts (customer \u0026 admin)\n- **Store** - Store information\n- **Category** - Product categories\n- **Product** - Products with inventory\n- **Cart** - Shopping cart items\n- **Order** - Customer orders\n- **OrderItem** - Order line items\n- **Payment** - Payment transactions\n- **Shipment** - Shipping information\n- **Stock** - Stock mutations\n\nSee `prisma/schema.prisma` file for complete schema details.\n\nFor a visual representation of the database schema, refer to the [Database Diagram](./docs/api-docs/dbdiagram.md).\n\n## Cron Jobs\n\nThe application runs automated tasks using node-cron:\n\n**Confirm Transaction Job**\n\n- Schedule: Every 1 hour\n- Function: Auto-confirm orders that have been paid\n- File: `src/jobs/cron/confirm.transaction.job.ts`\n\n**Expire Transaction Job**\n\n- Schedule: Every 30 minutes\n- Function: Auto-cancel orders that exceed payment deadline\n- File: `src/jobs/cron/expiry.transaction.job.ts`\n\n## Middleware\n\n**Security**\n\n- helmet - Security headers\n- cors - CORS configuration\n- rate-limiter - Rate limiting to prevent abuse\n\n**Authentication**\n\n- auth.middleware - JWT verification\n- jwt.verify - Token validation\n- authorizeRoles - Role-based access control\n- authorizeStore - Store authorization\n\n**Validation**\n\n- validateYup - Request validation with Yup schema\n- multer.middleware - File upload validation\n\n**Error Handling**\n\n- error.handler - Global error handler\n\n## Scripts\n\n```bash\n# Development\nnpm run dev              # Run with nodemon\n\n# Production\nnpm run build           # Compile TypeScript\nnpm start              # Run compiled code\n\n# Database\nnpm run prisma:generate # Generate Prisma Client\nnpx prisma migrate dev # Run migrations\nnpx prisma db seed     # Seed database\nnpx prisma studio      # Open Prisma Studio\n\n# Utilities\nnpm run postinstall    # Auto-run after npm install\n```\n\n## Security Features\n\n- JWT-based authentication with refresh token strategy\n- Password hashing using bcrypt\n- Rate limiting to prevent brute force\n- Helmet for security headers\n- Input validation with Yup\n- Role-based access control (RBAC)\n- SQL injection protection via Prisma ORM\n- CORS configuration\n\n## Email Templates\n\nEmail templates use Handlebars and are located in `src/public/`:\n\n- `verify-email.html` - Email verification template\n- `reset-password.html` - Password reset template\n\n## Documentation\n\nComplete API documentation is available in the `docs/api-docs/` directory:\n\n### API Documentation\n\nFor detailed information about API endpoints, request/response formats, and testing:\n\n- **[API Documentation Guide](./docs/api-docs/README.md)** - Comprehensive guide for setting up and using the API with Postman\n- **[Postman Collection](./docs/api-docs/grocery.postman_collection.json)** - Import this file into Postman for ready-to-use API requests\n\n### Database Documentation\n\n- **[Database Diagram](./docs/api-docs/dbdiagram.md)** - Visual representation of database schema and relationships\n\n### Quick Start with API Testing\n\n1. Import the Postman collection from `docs/api-docs/grocery.postman_collection.json`\n2. Follow the setup guide in `docs/api-docs/README.md` to configure environment variables\n3. Start testing the API endpoints immediately\n\nThe API documentation includes:\n\n- Complete endpoint listings organized by feature\n- Authentication setup and token management\n- Request/response examples\n- Environment configuration\n- Troubleshooting guide\n- Role-based testing scenarios\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffauzan264%2Fgrocery-api","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffauzan264%2Fgrocery-api","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffauzan264%2Fgrocery-api/lists"}