{"id":16398116,"url":"https://github.com/hebilicious/subly-test-v2","last_synced_at":"2025-06-30T07:37:44.964Z","repository":{"id":92704969,"uuid":"281928085","full_name":"Hebilicious/subly-test-v2","owner":"Hebilicious","description":null,"archived":false,"fork":false,"pushed_at":"2023-12-05T05:25:35.000Z","size":178,"stargazers_count":1,"open_issues_count":1,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-02-23T09:29:23.012Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"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/Hebilicious.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},"funding":{"github":["Hebilicious"]}},"created_at":"2020-07-23T11:03:15.000Z","updated_at":"2023-03-07T05:49:57.000Z","dependencies_parsed_at":"2024-11-09T14:42:03.802Z","dependency_job_id":"864ad1cf-909a-4af2-8a1f-a6178c4bd7e3","html_url":"https://github.com/Hebilicious/subly-test-v2","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/Hebilicious/subly-test-v2","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Hebilicious%2Fsubly-test-v2","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Hebilicious%2Fsubly-test-v2/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Hebilicious%2Fsubly-test-v2/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Hebilicious%2Fsubly-test-v2/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Hebilicious","download_url":"https://codeload.github.com/Hebilicious/subly-test-v2/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Hebilicious%2Fsubly-test-v2/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":262731995,"owners_count":23355469,"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-10-11T05:11:53.607Z","updated_at":"2025-06-30T07:37:44.883Z","avatar_url":"https://github.com/Hebilicious.png","language":"TypeScript","funding_links":["https://github.com/sponsors/Hebilicious"],"categories":[],"sub_categories":[],"readme":"# Subly - Fullstack test v2.0\n\nThis exercise is intended to allow you to demonstrate your skills in building a small typescript-based\ncrud application. your submission will be assessed on the following criteria:\n\n1. Grasp and understanding of the JS/Typescript\n2. Writing clean, concise and maintainable code\n3. Ability to verify the correctness of the solution\n4. Grasp and understanding of SQL/Postgres\n\nYou are encouraged to treat this as a microcosm of a real project, so approach it as you would any\nother project. Typescript, React and Postgres are required.\n\nPlease include a README with your submission which describes how to run the project and\nexplains the approach you took to producing the solution\n\nSubmit your solution by either sending a link to github or send us your zip version of the code via\nEmail.\n\nWe would deploy your code as per your description and test if. We care about code quality best\npractices and your attention to details.\n\nExercise description\nSubly, is designing a reporting api and a dashboard in React which allow the team to understand\nuser behaviors like, number of files uploaded, type of the files, duration in seconds, country of origin\nof user and more...\nDomain\nA FILE is considered a video file \".mp4, .wav\", users upload to get it the platform and get it\ntranscribed. at a minimum have the attributes: Name, uuid, type, duration, size\nA USER is a person registered with the platform. At minimum we have attributes like: NAme, id,\ncountry of origin\n\n## Requirements\n\nDeliver a crud api that can with minimum three resource (Users, Files, Reports)\n\n- [x] Total number of files uploaded per user.\n- [x] Total number of files divided per type of the file.\n- [x] Average file size of all and per user\n- [x] Average duration of all uploads and per user\n- [x] Filter by Date for any resources \u0026 pagination (note: createdAt is only implememented on the User and File tables, more advanced logic can be implemented with an updatedAt field.)\n\nDeliver a client application in React (if Possible)\n\n- [x] List users\n- [x] List files\n- [x] A basic Dashboard with Reports (Number of users, number of videos, type of videos, size of\n      videos) (Both an overall and averages)\n\nYour Solution\n\n- [x] MUST have been written in Typescript\n- [x] MUST have Postgres/SQL as the DB\n- [x] MUST have unit tests \u0026 code quality practices.\n- [x] MUST Be fully functional\n- [x] SHOULD Explain how you architecture the app\n\n## Explanations\n\n### Architecture\n\nThe project will live in a monorepository.\nTo solve the requirements we'll decouple the API and the frontend.\n\nThe backend will be a standalone node application.\nThe frontend will be a standalone react application.\n\nIt would be possible to use a monolithic framework such as Redwood JS.\nThere are many pros and cons of both approach, a microservice architecture is harder to reason with.\nA microservice based architecture can be scaled and deployed independently.\nIt also allow you to use the right tool for the job easily, since services are decoupled.\nHowever here we'll showcase how to manually build a graphQL API and a React based SPA.\n\n- The backend will be a node service with one entrypoint, making it very easy to deploy.\n  Refer to the backend README for more details.\n\n- The frontend will be a SPA, that can easily be deployed as a well.\n  Refer to the frontend README for more details.\n\nRun both projects in separated terminals.\nMake sure that the urls are correct for everything. Refer to each directory README for more informations.\n\n### TL:DR Intructions\n\n#### API\n\n```bash\n#From the root directory ...\ncd backend\nyarn #Install node dependencies\n\n#DB Steps\nyarn db:start #Start the docker compose database\nyarn db:migrate #Create empty tables according to the migration directory\nyarn db:seed #Seed the database with random dummy data\n\n#Application steps\nyarn generate #Generate the db client and graphql schema\nyarn dev #Start a dev server, default to http://localhost:4000/\n```\n\n#### Client\n\n```bash\n#From the root directory ...\ncd frontend\n\nyarn #Install node dependencies\nyarn dev #Start a dev server, default to http://localhost:8080/\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhebilicious%2Fsubly-test-v2","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fhebilicious%2Fsubly-test-v2","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhebilicious%2Fsubly-test-v2/lists"}