{"id":26460193,"url":"https://github.com/bereketkib/file-manager","last_synced_at":"2026-04-11T05:31:00.585Z","repository":{"id":276075934,"uuid":"928132889","full_name":"bereketkib/file-manager","owner":"bereketkib","description":"A web-based File Manager built with Express.js, Prisma ORM, Supabase PostgreSQL, and Cloudinary, allowing users to securely upload, manage, and share files and folders in the cloud.","archived":false,"fork":false,"pushed_at":"2025-02-06T06:12:54.000Z","size":472,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-06-24T18:50:32.295Z","etag":null,"topics":["authentication","cloud-storage","cloudinary","express","expressjs","file-management","node","nodejs","passport","passport-local","passportjs","postgresql","prisma","prisma-client","prisma-orm"],"latest_commit_sha":null,"homepage":"https://file-manager-3q3u.onrender.com","language":"EJS","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/bereketkib.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}},"created_at":"2025-02-06T05:41:37.000Z","updated_at":"2025-02-06T06:37:23.000Z","dependencies_parsed_at":null,"dependency_job_id":"1fbbab2a-3b5c-4fa3-9a92-b702496a74d2","html_url":"https://github.com/bereketkib/file-manager","commit_stats":null,"previous_names":["bereketkib/file-manager"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/bereketkib/file-manager","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bereketkib%2Ffile-manager","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bereketkib%2Ffile-manager/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bereketkib%2Ffile-manager/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bereketkib%2Ffile-manager/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/bereketkib","download_url":"https://codeload.github.com/bereketkib/file-manager/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bereketkib%2Ffile-manager/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31669533,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-10T17:19:37.612Z","status":"online","status_checked_at":"2026-04-11T02:00:05.776Z","response_time":54,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"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":["authentication","cloud-storage","cloudinary","express","expressjs","file-management","node","nodejs","passport","passport-local","passportjs","postgresql","prisma","prisma-client","prisma-orm"],"created_at":"2025-03-19T02:48:47.097Z","updated_at":"2026-04-11T05:31:00.581Z","avatar_url":"https://github.com/bereketkib.png","language":"EJS","funding_links":[],"categories":[],"sub_categories":[],"readme":"# 📂 Express File Manager\n\nAn elegant and powerful **File Manager** built with **Express.js, Prisma ORM, Supabase PostgreSQL, and Cloudinary**. Users can **create, delete, move, and rename** files and folders, upload files to the cloud, and share public URLs for access.\n\n## 🚀 Features\n\n- ✅ User authentication (Sign up, Login, Logout) using **Passport.js**\n- 📁 Create, delete, rename folders\n- 📄 Create, delete, move files between folders\n- ☁️ Upload files to **Cloudinary**\n- 🔗 Share public URLs for files\n- 🗃️ Organized folder structure for better usability\n\n## 🛠️ Tech Stack\n\n- **Backend:** Node.js, Express.js\n- **Database:** Supabase PostgreSQL\n- **ORM:** Prisma\n- **Authentication:** Passport.js\n- **Storage:** Cloudinary for file uploads\n- **View Engine:** EJS (for rendering views)\n- **Styling:** Tailwind CSS\n\n## 📂 Project Structure\n\n```\n.\n├── README.md\n├── package-lock.json\n├── package.json\n├── prisma\n│   └── schema.prisma\n├── public\n│   ├── css\n│   │   ├── output.css\n│   │   └── styles.css\n│   ├── images\n│   │   ├── home.jpeg\n│   │   ├── login.jpeg\n│   │   ├── logo-white.png\n│   │   ├── logo.png\n│   │   └── register.jpeg\n│   └── js\n│       ├── alert.js\n│       ├── details.js\n│       ├── header.js\n│       ├── list.js\n│       └── password.js\n├── src\n│   ├── app.js\n│   ├── config.js\n│   ├── controllers\n│   │   ├── authController.js\n│   │   ├── dashboardController.js\n│   │   ├── fileController.js\n│   │   └── folderController.js\n│   ├── middleware\n│   │   ├── auth.js\n│   │   └── multer.js\n│   ├── routes\n│   │   ├── authRoutes.js\n│   │   ├── dashboardRoutes.js\n│   │   ├── fileRoutes.js\n│   │   └── folderRoutes.js\n│   ├── utils\n│   │   └── prisma.js\n│   └── views\n│       ├── auth\n│       │   ├── login.ejs\n│       │   └── register.ejs\n│       ├── dashboard.ejs\n│       ├── index.ejs\n│       └── partials\n│           ├── details.ejs\n│           ├── files.ejs\n│           ├── folders.ejs\n│           ├── header.ejs\n│           └── list.ejs\n└── tailwind.config.js\n```\n\n## ⚡ Installation\n\n1. Clone the repository:\n   ```sh\n   git clone https://github.com/bereketkib/file-manager.git\n   cd express-file-manager\n   ```\n2. Install dependencies:\n   ```sh\n   npm install\n   ```\n3. Set up **.env** file:\n   ```sh\n   DATABASE_URL=\"your_supabase_database_url\"\n   DIRECT_URL=\"your_direct_database_url\"\n   CLOUDINARY_CLOUD_NAME=\"your_cloudinary_cloud_name\"\n   CLOUDINARY_API_KEY=\"your_cloudinary_api_key\"\n   CLOUDINARY_API_SECRET=\"your_cloudinary_api_secret\"\n   SESSION_SECRET=\"your_secret_key\"\n   ```\n4. Run Prisma migrations:\n   ```sh\n   npx prisma migrate dev --name init\n   ```\n5. Start the server:\n   ```sh\n   npm start\n   ```\n   The app runs on `http://localhost:3000`\n\n## 🔑 Authentication\n\n- **Sign up \u0026 Login** using bcrypt for password hashing.\n- Sessions handled with **express-session**.\n- Authenticated users can manage files and folders.\n\n## ☁️ Cloud Storage\n\n- Files are uploaded to **Cloudinary**.\n- Each uploaded file gets a **public URL** for sharing.\n\n## 📌 API Endpoints\n\n| Method | Endpoint                          | Description                   |\n| ------ | --------------------------------- | ----------------------------- |\n| POST   | `/auth/register`                  | Register a new user           |\n| POST   | `/auth/login`                     | Login user                    |\n| GET    | `/auth/logout`                    | Logout user                   |\n| POST   | `/folders/:folderId/create`       | Create a new folder           |\n| POST   | `/folders/:id/rename/:selectedId` | Rename a folder               |\n| POST   | `/folders/:id/delete/:selectedId` | Delete a folder               |\n| POST   | `/files/:folderId/upload`         | Upload a file to a folder     |\n| POST   | `/files/:id/delete/:selectedId`   | Delete a file                 |\n| POST   | `/files/:fileId/move/:selectedId` | Move a file to another folder |\n\n## 📜 Route Details\n\n### Authentication Routes\n\n- **POST** `/auth/register` - Registers a new user.\n- **POST** `/auth/login` - Logs in the user and redirects to the dashboard.\n- **GET** `/auth/logout` - Logs out the user and redirects to the login page.\n\n### Folder Routes\n\n- **POST** `/folders/:folderId/create` - Creates a new folder inside the specified parent folder.\n- **POST** `/folders/:id/rename/:selectedId` - Renames a folder.\n- **POST** `/folders/:id/delete/:selectedId` - Deletes a folder.\n\n### File Routes\n\n- **POST** `/files/:folderId/upload` - Uploads a file to the specified folder.\n- **POST** `/files/:id/delete/:selectedId` - Deletes a file from the specified folder.\n- **POST** `/files/:fileId/move/:selectedId` - Moves a file from one folder to another.\n\n## 🛠️ Middleware and Helpers\n\n- **Passport.js**: Handles user authentication and session management.\n- **Multer**: Middleware for handling file uploads.\n- **Flash Messages**: Provides feedback for successful or failed operations (e.g., login failure, successful file upload).\n\n## 🧑‍💻 Authentication \u0026 Authorization\n\nAll endpoints (except for registration and login) require the user to be authenticated. The `ensureAuthenticated` middleware ensures the user is logged in before accessing protected routes.\n\n## 🎨 UI \u0026 Design\n\n- Fully responsive design using **Tailwind CSS**.\n- Smooth animations for file/folder interactions.\n- **EJS templates** used for rendering views.\n\n## 📜 License\n\nMIT License © 2025 Bereket Kibreab Jenay\n\n## 📅 Changelog\n\n- **v1.0**: Initial release with basic authentication and file management functionality.\n  Visit the website [File-Manager](https://file-manager-3q3u.onrender.com)\n\n---\n\n🚀 **Happy Coding!** 😊\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbereketkib%2Ffile-manager","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbereketkib%2Ffile-manager","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbereketkib%2Ffile-manager/lists"}