{"id":20678964,"url":"https://github.com/delak101/librarysystemsolution","last_synced_at":"2026-04-22T19:34:02.665Z","repository":{"id":260825416,"uuid":"882332274","full_name":"delak101/LibrarySystemSolution","owner":"delak101","description":null,"archived":false,"fork":false,"pushed_at":"2025-02-18T17:45:57.000Z","size":29703,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-02-18T18:27:05.830Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"C#","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/delak101.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}},"created_at":"2024-11-02T14:44:54.000Z","updated_at":"2025-02-18T17:46:01.000Z","dependencies_parsed_at":"2024-12-20T04:23:07.656Z","dependency_job_id":"a11753b5-e49a-4d01-93c1-e3c49ff841f3","html_url":"https://github.com/delak101/LibrarySystemSolution","commit_stats":null,"previous_names":["delak101/librarysystemsolution"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/delak101%2FLibrarySystemSolution","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/delak101%2FLibrarySystemSolution/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/delak101%2FLibrarySystemSolution/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/delak101%2FLibrarySystemSolution/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/delak101","download_url":"https://codeload.github.com/delak101/LibrarySystemSolution/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":242911473,"owners_count":20205499,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","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":[],"created_at":"2024-11-16T21:23:19.013Z","updated_at":"2026-04-22T19:34:02.650Z","avatar_url":"https://github.com/delak101.png","language":"C#","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Library System API Documentation\n\n## Base URLs\n\n- **Production:** `https://fci-library.live`\n- **Development:** `https://dev.fci-library.live`\n\n## Authentication\nThe application uses JWT-based authentication. Each request to a protected endpoint must include a valid JWT token in the Authorization header.\n\n```\nAuthorization: Bearer \u003cyour_token\u003e\n```\n\n---\n\n## Users\n\n### Register User\n**POST** `/api/user/register`\n#### Payload:\n```json\n{\n    \"pfp\": \"base64-profile-image\",\n    \"name\": \"John Doe\",\n    \"email\": \"johndoe@example.com\",\n    \"studentEmail\": \"johndoe@fci.zu.edu\",\n    \"password\": \"strongpassword\",\n    \"nationalId\": \"12345678912345\",\n    \"department\": \"IT\",\n    \"phone\": \"0123456789\",\n    \"year\": 2,\n    \"termsAccepted\": true\n}\n```\n#### Response:\n- **200 OK**: `{ \"message\": \"User registered successfully.\" }`\n- **400 Bad Request**: `{ \"message\": \"User already exists.\" }`\n- **404 Not Found**: You're using wrong endpoint\n- **500 Internal Server Error**: Server down\n\n**Note:** New user accounts require admin approval before they can log in.\n\n---\n\n## User Approval System\n\n### Get Pending Users (Admin Only)\n**GET** `/api/user/pending`\n#### Headers:\n```\nAuthorization: Bearer \u003cadmin_token\u003e\n```\n#### Response:\n- **200 OK**: Returns array of pending users\n```json\n[\n    {\n        \"id\": 1,\n        \"name\": \"John Doe\",\n        \"email\": \"johndoe@example.com\",\n        \"studentEmail\": \"johndoe@fci.zu.edu\",\n        \"department\": \"IT\",\n        \"phone\": \"0123456789\",\n        \"year\": 2,\n        \"isApproved\": false,\n        \"approvedAt\": null\n    }\n]\n```\n- **401 Unauthorized**: Invalid or missing admin token\n- **403 Forbidden**: Not an admin user\n\n---\n\n### Approve User (Admin Only)\n**POST** `/api/user/approve/{userId}`\n#### Headers:\n```\nAuthorization: Bearer \u003cadmin_token\u003e\n```\n#### Response:\n- **200 OK**: `{ \"message\": \"User approved successfully\" }`\n- **401 Unauthorized**: Invalid or missing admin token\n- **403 Forbidden**: Not an admin user\n- **404 Not Found**: User not found\n\n---\n\n### Reject User (Admin Only)\n**POST** `/api/user/reject/{userId}`\n#### Headers:\n```\nAuthorization: Bearer \u003cadmin_token\u003e\n```\n#### Response:\n- **200 OK**: `{ \"message\": \"User rejected and removed successfully\" }`\n- **401 Unauthorized**: Invalid or missing admin token\n- **403 Forbidden**: Not an admin user\n- **404 Not Found**: User not found\n\n**Note:** Rejecting a user will delete their account from the system.\n\n---\n\n### Get User Approval Status (Admin Only)\n**GET** `/api/user/approval-status/{userId}`\n#### Headers:\n```\nAuthorization: Bearer \u003cadmin_token\u003e\n```\n#### Response:\n- **200 OK**: `{ \"userId\": 1, \"isApproved\": true }`\n- **401 Unauthorized**: Invalid or missing admin token\n- **403 Forbidden**: Not an admin user\n\n---\n\n### Login User\n**POST** `/api/user/login`\n#### Payload:\n```json\n{\n    \"email\": \"johndoe@example.com\",\n    \"password\": \"strongpassword\"\n}\n```\n#### Response:\n- **200 OK**: Login Successful (Returns user data with **TOKEN**) - use token for authorized access\n- **400 Bad Request**:\n  - `{ \"message\": \"User does not exist.\" }`\n  - `{ \"message\": \"Invalid password.\" }`\n  - `{ \"message\": \"Account is pending approval. Please wait for admin approval.\" }`\n\n**Note:** Regular users (non-admin) must be approved by an admin before they can log in.\n\n---\n\n### Forgot Password\n**POST** `/api/user/forgot-password`\n#### Payload:\n```json\n{\n    \"email\": \"johndoe@example.com\"\n}\n```\n#### Response:\n- **200 OK**: `{ \"message\": \"Password reset initiated. Please check your email.\" }`\n- **400 Bad Request**: `{ \"message\": \"Email not found.\" }`\n\n---\n\n### Reset Password\n**POST** `/api/user/reset-password`\n#### Payload:\n```json\n{\n    \"token\": \"token-received-in-email\",\n    \"newPassword\": \"newstrongpassword\"\n}\n```\n#### Response:\n- **200 OK**: `{ \"message\": \"Password reset successful.\" }`\n- **400 Bad Request**: `{ \"message\": \"Invalid or expired token.\" }`\n\n---\n\n### Get User Profile by ID\n**GET** `/api/user/profile/searchid/{userid}`\n#### Response:\n- **200 OK**:\n```json\n{\n    \"id\": 1,\n    \"pfp\": \"base64-profile-image\",\n    \"name\": \"John Doe\",\n    \"email\": \"johndoe@example.com\",\n    \"studentEmail\": \"johndoe@college.edu\",\n    \"nationalId\": \"12345678912345\",\n    \"department\": \"IT\",\n    \"phone\": \"0123456789\",\n    \"year\": 2\n}\n```\n- **404 Not Found**: `{ \"message\": \"User not found.\" }`\n\n### Get User Profile by Email\n**GET** `/api/user/profile/search/{email}`\n(Same response as search by ID)\n\n### Get User Profile by Name\n**GET** `/api/user/profile/search/name/{name}`\n(Same response as search by ID)\n\n### Get All Users\n**GET** `/api/user/all`\nReturns all users in JSON format.\n\n---\n\n### Update User Profile by ID\n**PUT** `/api/user/profile/updateid/{userid}`\n#### Payload:\n```json\n{\n    \"pfp\": \"base64-profile-image\",\n    \"name\": \"John Doe\",\n    \"email\": \"john.doe@gmail.com\",\n    \"studentEmail\": \"john.doe@fci.zu.edu.eg\",\n    \"nationalId\": \"1234568912345\",\n    \"department\": \"CS\",\n    \"phone\": \"0987654321\",\n    \"year\": 3\n}\n```\n#### Response:\n- **200 OK**: `{ \"message\": \"User updated successfully.\" }`\n- **404 Not Found**: `{ \"message\": \"User not found or update failed.\" }`\n\n### Update User Profile by Email\n**PUT** `/api/user/profile/update/{email}`\n(Same response as update by ID)\n\n---\n\n### Delete User by ID\n**DELETE** `/api/user/profile/deleteid/{id}`\n#### Response:\n- **200 OK**: User deleted\n- **400 Bad Request**: User doesn't exist\n\n### Delete User by Email\n**DELETE** `/api/user/profile/delete/{email}`\n(Same response as delete by ID)\n\n### Bulk Delete Users\n**DELETE** `/api/user/profile/deleteyear/{year}`\n#### Response: \n- **200 OK**: Users deleted successfully \n- **400 Bad Request**: Some or all users not found\n\n---\n\n## Books\n\n### Add a Book\n**POST** `/api/book/add`\n#### Payload:\n```json\n{\n    \"name\": \"string\",\n    \"author\": \"string\",\n    \"description\": \"string\",\n    \"shelf\": \"string\",\n    \"isAvailable\": true,\n    \"department\": \"string\",\n    \"assignedYear\": 1,\n    \"state\": true,\n    \"image\": \"base64-cover-image\",\n    \"categoryNames\": [\n        \"string\"\n    ],\n    \"authorNames\": [\n        \"string\"\n    ]\n}\n```\n#### Response:\n- **200 OK**: `{ \"message\": \"Book added successfully.\" }`\n- **400 Bad Request**: `{ \"message\": \"Failed to add the book.\" }`\n\n---\n\n### Get Book by ID\n**GET** `/api/book/{id}`\n#### Response:\n- **200 OK**: Returns book details\n- **404 Not Found**: `{ \"message\": \"Book not found.\" }`\n\n### Search Books by Name\n**GET** `/api/book/search?name={name}`\n#### Response:\n- **200 OK**: Returns books matching the search criteria\n- **404 Not Found**: `{ \"message\": \"No books found with this name.\" }`\n\n### Get Books by Genre\n**GET** `/api/book/genre?genre={genre}`\n#### Response:\n- **200 OK**: Returns books matching the genre\n- **404 Not Found**: `{ \"message\": \"No books found for this genre.\" }`\n\n### Get Books by Author\n**GET** `/api/book/author?author={author}`\n#### Response:\n- **200 OK**: Returns books by the specified author\n- **404 Not Found**: `{ \"message\": \"No books found for this author.\" }`\n\n---\n\n### Get Books by Availability\n**GET** `/api/book/available/{isAvailable}`\n#### Response:\n- **200 OK**: Returns available/unavailable books\n- **404 Not Found**: `{ \"message\": \"No books available for borrowing.\" }`\n\n### Get Books by Year\n**GET** `/api/book/year/{year}`\n#### Response:\n- **200 OK**: Returns books for the specified year\n- **404 Not Found**: `{ \"message\": \"No books found for this year.\" }`\n\n### Get Books by Department\n**GET** `/api/book/department/{department}`\n#### Response:\n- **200 OK**: Returns books for the specified department\n- **404 Not Found**: `{ \"message\": \"No books found for this department.\" }`\n\n### Get All Books\n**GET** `/api/book`\n#### Response:\n- **200 OK**: Returns all books in JSON format\n\n### Get Books (Paginated) \n**GET** `/api/book/paged?page={page}\u0026pageSize={pageSize}`\n#### Parameters:\n- `page` (optional): Page number, defaults to 1\n- `pageSize` (optional): Items per page, defaults to 10, max 50\n\n#### Response:\n- **200 OK**: Returns paginated books\n```json\n{\n    \"items\": [...],\n    \"totalCount\": 150,\n    \"page\": 1,\n    \"pageSize\": 10,\n    \"totalPages\": 15,\n    \"hasNextPage\": true,\n    \"hasPreviousPage\": false\n}\n```\n\n### Get Books by Category (Paginated)\n**GET** `/api/book/category/paged?category={category}\u0026page={page}\u0026pageSize={pageSize}`\n#### Parameters:\n- `category` (required): Category name to filter by\n- `page` (optional): Page number, defaults to 1\n- `pageSize` (optional): Items per page, defaults to 10, max 50\n\n#### Response:\n- **200 OK**: Returns paginated books for the specified category\n```json\n{\n    \"items\": [\n        {\n            \"id\": 1,\n            \"name\": \"Book Title\",\n            \"description\": \"Book Description\",\n            \"shelf\": \"A1\",\n            \"isAvailable\": true,\n            \"department\": \"CS\",\n            \"assignedYear\": 1,\n            \"image\": \"image_url\",\n            \"categoryNames\": [\"Fiction\", \"Adventure\"],\n            \"authorNames\": [\"Author Name\"]\n        }\n    ],\n    \"totalCount\": 25,\n    \"page\": 1,\n    \"pageSize\": 10\n}\n```\n- **400 Bad Request**: Category parameter is missing or empty\n- **404 Not Found**: No books found for the specified category\n\n### Get All Authors\n**GET** `/api/book/authors`\n#### Response:\n- **200 OK**: Returns all authors in JSON format\n\n### Get All Categories \n**GET** `/api/book/categories`\n#### Response:\n- **200 OK**: Returns all categories in JSON format\n\n---\n\n### Update a Book\n**PUT** `/api/book/update/{id}`\n#### Payload:\n```json\n{\n    \"name\": \"string\",\n    \"author\": \"string\",\n    \"description\": \"string\",\n    \"shelf\": \"string\",\n    \"isAvailable\": true,\n    \"department\": \"string\",\n    \"assignedYear\": 1,\n    \"state\": true,\n    \"image\": \"base64-cover-image\",\n    \"categoryNames\": [\"string\"],\n    \"authorNames\": [\"string\"]\n}\n```\n#### Response:\n- **200 OK**: `{ \"message\": \"Book updated successfully.\" }`\n- **404 Not Found**: `{ \"message\": \"Book not found or update failed.\" }`\n\n---\n\n### Delete a Book\n**DELETE** `/api/book/delete/{id}`\n#### Response:\n- **200 OK**: `{ \"message\": \"Book deleted successfully.\" }`\n- **404 Not Found**: `{ \"message\": \"Book not found.\" }`\n\n---\n\n## Borrow Requests\n\n### Request to Borrow a Book\n**POST** `/api/borrow/request?userId={userId}\u0026bookId={bookId}`\n#### Parameters:\n- `userId`: ID of the user requesting to borrow\n- `bookId`: ID of the book to borrow\n\n#### Response:\n- **200 OK**: `{ \"message\": \"Borrow request submitted successfully\", \"borrow\": {...} }`\n- **400 Bad Request**: `{ \"error\": \"Book not available or other error\" }`\n- **500 Internal Server Error**: `{ \"error\": \"An unexpected error occurred while processing your request\" }`\n\n---\n\n### Get Pending Borrow Requests\n**GET** `/api/borrow/pending`\n#### Response:\n- **200 OK**: Returns a list of pending borrow requests\n\n### Get Borrowed Books\n**GET** `/api/borrow/borrowed`\n#### Response:\n- **200 OK**: Returns a list of currently borrowed books\n\n### Get Overdue Books\n**GET** `/api/borrow/overdue`\n#### Response:\n- **200 OK**: Returns a list of overdue books\n\n### Approve Borrow Request\n**POST** `/api/borrow/approve/{borrowId}`\n#### Response:\n- **200 OK**: `{ \"message\": \"Borrow request approved\" }`\n- **400 Bad Request**: `{ \"error\": \"Failed to approve request\" }`\n\n### Deny Borrow Request\n**POST** `/api/borrow/deny/{borrowId}`\n#### Response:\n- **200 OK**: `{ \"message\": \"Borrow request denied\" }`\n- **400 Bad Request**: `{ \"error\": \"Failed to deny request\" }`\n\n---\n\n### Return a Book\n**POST** `/api/borrow/return/{borrowId}`\n#### Response:\n- **200 OK**: `{ \"message\": \"Book returned successfully\" }`\n- **400 Bad Request**: `{ \"error\": \"Failed to return book\" }`\n\n---\n\n### View Borrow History\n**GET** `/api/borrow/history/{userId}`\n#### Response:\n- **200 OK**: Returns the user's borrow history\n\n---\n\n## Favorites\n\n### Add to Favorites\n**POST** `/api/favorite/{userId}/{bookId}`\n#### Response: \n- **200 OK**: `{ \"message\": \"Book added to favorites.\" }`\n- **400 Bad Request**: `{ \"message\": \"Book is already favorited.\" }`\n\n---\n\n### Remove from Favorites\n**DELETE** `/api/favorite/{userId}/{bookId}`\n#### Response: \n- **200 OK**: `{ \"message\": \"Book removed from favorites.\" }`\n- **404 Not Found**: `{ \"message\": \"Favorite not found.\" }`\n\n---\n\n### Check if Book is Favorited\n**GET** `/api/favorite/{userId}/{bookId}`\n#### Response: \n- **200 OK**: `{ \"isFavorite\": true/false }`\n\n---\n\n### Get User's Favorite Books\n**GET** `/api/favorite/{userId}`\n#### Response: \n- **200 OK**: Returns a list of favorited books\n\n---\n\n## Analytics 🆕\n\n### Get Analytics Data\n**GET** `/api/analytics`\n#### Response: \n- **200 OK**: Returns analytics data\n```json\n{\n    \"totalBooks\": 150,\n    \"pendingRequests\": 12,\n    \"totalStudents\": 300,\n    \"borrowedBooks\": 45\n}\n```\n- **500 Internal Server Error**: `{ \"error\": \"An error occurred while fetching analytics data\" }`\n\n---\n\n## Notifications 🆕\n\n### Register Device Token\n**POST** `/api/notification/register-token`\n*Requires Authentication*\n#### Payload:\n```json\n{\n    \"deviceToken\": \"firebase-device-token\",\n    \"deviceType\": \"iOS/Android\"\n}\n```\n#### Response: \n- **200 OK**: `{ \"message\": \"Device token registered successfully\" }`\n- **400 Bad Request**: `{ \"message\": \"Failed to register device token\" }`\n- **401 Unauthorized**: Invalid user\n\n### **Register Device Token**\n**POST** `/api/notification/register-token`\n*Requires Authentication*\n#### Payload:\n```json\n{\n  \"deviceToken\": \"firebase-device-token\",\n  \"deviceType\": \"iOS/Android\"\n}\n```\n#### **Response**: \n- **200 OK**: `{ \"message\": \"Device token registered successfully\" }`\n- **400 Bad Request**: `{ \"message\": \"Failed to register device token\" }`\n- **401 Unauthorized**: Invalid user\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdelak101%2Flibrarysystemsolution","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdelak101%2Flibrarysystemsolution","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdelak101%2Flibrarysystemsolution/lists"}