{"id":15541378,"url":"https://github.com/ivov/chessclub","last_synced_at":"2025-04-23T17:07:36.561Z","repository":{"id":55806550,"uuid":"219349369","full_name":"ivov/chessclub","owner":"ivov","description":"Full-stack web app for managing a neighborhood chess club, built with React, Node/Express and PostgreSQL.","archived":false,"fork":false,"pushed_at":"2022-02-01T10:29:41.000Z","size":1590,"stargazers_count":5,"open_issues_count":6,"forks_count":2,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-04-23T17:07:23.816Z","etag":null,"topics":["nodejs","postgresql","reactjs"],"latest_commit_sha":null,"homepage":null,"language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ivov.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2019-11-03T18:52:14.000Z","updated_at":"2024-06-08T16:13:53.000Z","dependencies_parsed_at":"2022-08-15T07:20:21.545Z","dependency_job_id":null,"html_url":"https://github.com/ivov/chessclub","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ivov%2Fchessclub","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ivov%2Fchessclub/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ivov%2Fchessclub/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ivov%2Fchessclub/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ivov","download_url":"https://codeload.github.com/ivov/chessclub/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":250477811,"owners_count":21437049,"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":["nodejs","postgresql","reactjs"],"created_at":"2024-10-02T12:16:52.312Z","updated_at":"2025-04-23T17:07:36.540Z","avatar_url":"https://github.com/ivov.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# chessclub\r\n\r\n![](https://img.shields.io/github/last-commit/ivov/chessclub) [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\r\n\r\nFull-stack web app for managing a neighborhood chess club.\r\n\r\nBuilt with React, Node/Express and PostgreSQL.\r\n\r\n\u003cp align=\"center\"\u003e\r\n    \u003cimg src=\"demo/images/react.png\" width=\"160\"\u003e\r\n    \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\r\n    \u003cimg src=\"demo/images/node.png\" width=\"160\"\u003e\r\n    \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\r\n    \u003cimg src=\"demo/images/pg.png\" width=\"160\"\u003e\r\n\u003c/p\u003e\r\n\r\n## Overview\r\n\r\nFull-stack web app for helping a chess club manage players, record championship matches and announce club events, with an interactive chess board to view and download matches, user registration/login, and an administrator dashboard.\r\n\r\nDemo at: https://ajedrez-torre-blanca.herokuapp.com/\r\n\r\n\u003cp align=\"center\"\u003e\r\n    \u003cimg src=\"demo/images/overview.gif\"\u003e\r\n\u003cp\u003e\r\n\r\nFeatures:\r\n\r\n- Basic CRUD ops for chess players, matches and event announcements\r\n- Interactive chess board to visualize and step through chess matches\r\n- Registration/login via JSON web tokens, with password encryption\r\n- Admin-only dashboard, logging and event announcement board\r\n- Protected routes, React Router navigation, Jest-based testing\r\n\r\n## Installation\r\n\r\n1. Install [Node](https://nodejs.org/en/download/) and clone repo\r\n2. Get server dependencies: `npm install`\r\n3. Get client dependencies: `cd client \u0026\u0026 npm install`\r\n4. Create PostgreSQL db using the `.sql` files provided in `demo/sql`\r\n5. Create an `.env` with `JWT_KEY=whatever` and `DEV_CONNSTRING=...` (\\*)\r\n6. Test: `npm run test` (optional)\r\n7. Run server and client: `npm run dev`\r\n\r\n(\\*) Example connection string:\r\n\r\n    \"postgresql://john:abc123@localhost:5432/chess_db\"\r\n\r\n## Operation\r\n\r\nThe app header offers registration/login buttons and three tabs for access to three main sections:\r\n\r\n- `Inicio` (Home), with two subsections:\r\n  - `Acerca del club` (About the club), containing a general description of the neighborhood chess club\r\n  - `Acerca de esta herramienta` (About this tool), containing a general description of the app\r\n- `Partidas` (Matches), with two subsections:\r\n  - `Ver partida` (View match), which lists recorded matches\r\n  - `Ingresar partida` (Enter match), which offers a form for entering a club match\r\n- `Anuncios` (Announcements), with a single subsection:\r\n  - `Anuncios del club` (Club announcements), with announcements by the club's staff\r\n\r\nIf the user is logged in and is a player, a fourth tab becomes available:\r\n\r\n- `Jugador` (Player), with one subsection:\r\n  - `Perfil del jugador` (Player profile), containing a simple profile of the player\r\n\r\nIf the user is logged in and is an admin, a final fifth tab becomes available:\r\n\r\n- `Administrador` (Administrator), with three subsctions:\r\n  - `Ver registros` (View logs), which shows all activity on the app\r\n  - `Ver usuarios` (View users), which lists all users, their contact info and admin status\r\n  - `Publicar anuncio` (Publish announcement), which offers a form for entering an announcement.\r\n\r\n\u003cp align=\"center\"\u003e\r\n    \u003cimg src=\"demo/images/header.png\"\u003e\r\n\u003cp\u003e\r\n\r\n### Registering, logging in, logging out\r\n\r\nTo register, press `Registrarse` (Register) on the header and enter a username, e-mail and password. Passwords are encrypted with bcrypt.\r\n\r\nTo log in, press `Ingresar` (Log in) on the header and enter a valid username and password. A successful login returns a response header with a JWT signed using an environment variable and placed in local storage. The username is displayed on the header, with a circle if a player and a shield if an admin.\r\n\r\nTo log out, press `Salir` (Log out) on the header. The signed JWT is removed from local storage.\r\n\r\n**Note**: This demo has no password recovery mechanism.\r\n\r\n\u003cp align=\"center\"\u003e\r\n    \u003cimg src=\"demo/images/register.png\"\u003e\r\n\u003c/p\u003e\r\n\r\n### Viewing matches\r\n\r\nThe subsection `Ver partida` shows a list of recorded matches. An `Editar` (Edit) button appears next to a match if the user is logged in and was one of the players in the match. All matches can be edited if the user is an admin.\r\n\r\nSelecting a match leads to the interactive chess board, which displays match metadata at the top, each move on the right-hand column, and seven buttons at the bottom:\r\n\r\n- `Rotar` (Rotate), to turn the chess board 180 degrees\r\n- `Al inicio` (Start) and `Al final` (End), to jump to the beginning or end\r\n- `Retroceder` (Back) and `Avanzar` (Forward), to move back or forward one move\r\n- `Automático` (Automatic), to start/stop an autoplay of the match\r\n- `Descargar` (Download), to download the match in a PGN-friendly `.txt` file\r\n\r\n\u003cp align=\"center\"\u003e\r\n    \u003cimg src=\"demo/images/viewing_matches.png\"\u003e\r\n\u003cp\u003e\r\n\r\n### Recording matches\r\n\r\nThe subsection `Ver partida` offers a form for entering a match between club players as match metadata—date, event, white, black, and result—and up to fifty match moves in algebraic notation.\r\n\r\n\u003cp align=\"center\"\u003e\r\n    \u003cimg src=\"demo/images/recording_matches.png\"\u003e\r\n\u003cp\u003e\r\n\r\n### Viewing announcements\r\n\r\nThe subsection `Anuncios del club` lists the most recent announcements by the club's staff.\r\n\r\n\u003cp align=\"center\"\u003e\r\n    \u003cimg src=\"demo/images/viewing_announcements.png\"\u003e\r\n\u003cp\u003e\r\n\r\n### Viewing a player's profile\r\n\r\nA logged-in player can view their own profile.\r\n\r\nThe subsection `Perfil del jugador` shows a simple player profile with total matches, wins, losses, and draws, including the player's contact info and a listing of their matches.\r\n\r\n\u003cp align=\"center\"\u003e\r\n    \u003cimg src=\"demo/images/viewing_player_profile.png\"\u003e\r\n\u003cp\u003e\r\n\r\n### Admin dashboard\r\n\r\nA logged-in admin can access the admin dashboard.\r\n\r\nThe subsection `Ver registros` shows logs for all app activity: logins, logouts, entry of match data, announcements sent, etc.\r\n\r\n\u003cp align=\"center\"\u003e\r\n    \u003cimg src=\"demo/images/admin_dashboard_logs.png\"\u003e\r\n\u003cp\u003e\r\n\r\nThe subsection `Ver usuarios` lists all users as well as their contact information and admin status.\r\n\r\n\u003cp align=\"center\"\u003e\r\n    \u003cimg src=\"demo/images/admin_dashboard_users.jpg\"\u003e\r\n\u003cp\u003e\r\n\r\nThe subsection `Publicar anuncio` offers a form for sending out an announcement to all members, to be shown on the `Anuncios` tab.\r\n\r\n\u003cp align=\"center\"\u003e\r\n    \u003cimg src=\"demo/images/admin_dashboard_announcements.png\"\u003e\r\n\u003cp\u003e\r\n\r\n## Author\r\n\r\n© 2019 Iván Ovejero\r\n\r\n## License\r\n\r\nDistributed under the MIT License. See [LICENSE.md](LICENSE.md)\r\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fivov%2Fchessclub","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fivov%2Fchessclub","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fivov%2Fchessclub/lists"}