{"id":18812450,"url":"https://github.com/zweigraf/mimi-test","last_synced_at":"2026-01-11T21:30:19.079Z","repository":{"id":98364404,"uuid":"220055821","full_name":"zweigraf/mimi-test","owner":"zweigraf","description":"Repository for the Mimi Coding Challenge","archived":false,"fork":false,"pushed_at":"2019-11-14T08:25:24.000Z","size":139,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2024-12-30T00:15:25.526Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Swift","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/zweigraf.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","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":"2019-11-06T17:45:40.000Z","updated_at":"2019-11-14T08:26:06.000Z","dependencies_parsed_at":null,"dependency_job_id":"ff99df95-4048-4ed0-9412-dcd3028e54d5","html_url":"https://github.com/zweigraf/mimi-test","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/zweigraf%2Fmimi-test","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zweigraf%2Fmimi-test/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zweigraf%2Fmimi-test/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zweigraf%2Fmimi-test/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/zweigraf","download_url":"https://codeload.github.com/zweigraf/mimi-test/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":239748302,"owners_count":19690236,"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-07T23:33:06.983Z","updated_at":"2026-01-11T21:30:19.000Z","avatar_url":"https://github.com/zweigraf.png","language":"Swift","funding_links":[],"categories":[],"sub_categories":[],"readme":"# mimi-test\nRepository for the Mimi Coding Challenge\n\n## Scope\n\n- Localization is not taken under consideration. All strings are hardcoded in English.\n- Error Handling is limited to alerts shown to the user.\n- Tested on Xcode 11.2.1, macOS 10.14.6, iPhone X, iOS 13.2.\n- No loading state is implemented.\n\n## Architecture\n\nThe architecture is VIPER-ish. Some ideas have been taken but some decisions have been made to reduce the amount of code for this small app. There is no presenter. The PRESENTER's tasks are distributed between the VIEW and the INTERACTOR. Also, there is only one ROUTER for the whole application, whereas in proper VIPER each module would get its own.\n\nEntry point of the application is in SceneDelegate. It creates all dependencies and asks the router to create the main screen. Router injects the dependencies into the screen, creating them (Interactor) when necessary.\n\n## Notes\n\n- I built my own `UITableViewCell` subclass `TableViewCell` due to not getting the image view layouted correctly without glitches when using my async loading class `ImageLoader`.\n- I prefer to do all my UI in code. \n- All dependencies are created in `SceneDelegate` and injected into places where it's needed via constructor injection.\n- Due to the Top Songs info not containing all information about the artist, esp. the track count, there is a ShortArtist and a FullArtist model. The view model that is responsible for the artist information on the top artists page then fetches the detailed information about the artist lazily.\n- The player is *very* minimalistic. It only displays the song title \u0026 artist name. Obviously it could be extended to show the current AVPlayer state, but I was out of time. And speaking from experience, handling \u0026 showing all AVPlayer states gets a bit cumbersome at times.\n- No third party code was used.\n- No optional task was implemented.\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzweigraf%2Fmimi-test","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fzweigraf%2Fmimi-test","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzweigraf%2Fmimi-test/lists"}