# Requirements ## Authentication - As a client, I want to log in to the service. - [X] In the front-end, the client provides a username, and a password to request login to the back-end. - [X] In the back-end, the server processes the login request from the front-end. - As a client, I want to log out from the service. - [X] In the front-end, the client requests logout to the backend. - [X] In the back-end, the server processes the logout request from the front-end. ## Ringtone - As a client, I want to download a ringtone. - [ ] In the front-end, the client provides a ringtone ID to request a ringtone from the back-end. - [ ] In the back-end, the server sends the ringtone data to the front-end. - As a client, I want to browse ringtones. - [X] In the front-end, the client provides optional skip and take arguments to request multiple ringtones from the back-end. - [X] In the back-end, the server sends the ringtones to the front-end. - As a client, I want to view the ringtones made by a composer. - [ ] In the front-end, the client provides a composer's user ID and optional skip and take arguments to request multiple ringtones from the back-end. - [X] In the back-end, the server sends the ringtones to the front-end. ## Search - As a client, I want to search for ringtones. - [ ] In the front-end, the client requests provides a search keyword to request for ringtones from the back-end. - [ ] In the back-end, the server retrieves the ringtones whose name matches the search keyword provided by the front-end. - [X] The server must retrieve ringtones containing the search keywords in the name - Query `foo bar` must match names containing `foo` _or_ `bar`. - [ ] The server must retrieve ringtones with note data similar to the search keyword as melody - The server should match data `8c4 8d#5` and `4c5 4d#5` for the query `c d#`. - The search should ignore rests. - As a client, I want to search for composers. - [ ] In the front-end, the client requests provides a search keyword to request for composers from the back-end. - [X] In the back-end, the server retrieves the composers whose name matches the search keyword provided by the front-end. ## Composer - As a composer, I want to create a ringtone. - [X] In the front-end, the client inputs ringtone data to the view. - [X] In the front-end, the client sends the ringtone data to the back-end. - [X] In the back-end, the server stores the ringtone data. - As a composer, I want to update a ringtone. - [X] In the front-end, the client modifies the ringtone data retrieved from the back-end and loaded on the view. - [X] In the front-end, the client sends the ringtone data to the back-end. - [X] In the back-end, the server stores the updated ringtone data. - As a composer, I want to soft-delete a ringtone. - [ ] In the front-end, the client provides a ringtone ID to request a ringtone's soft deletion to the back-end. - [X] In the back-end, the server tags a ringtone as deleted if its ID matches the one provided by the front-end. - As a composer, I want to undo deletion of a soft-deleted ringtone. - [ ] In the front-end, the client provides a ringtone ID to request a ringtone's deletion rollback to the back-end. - [X] In the back-end, the server untags a ringtone as deleted if its ID matches the one provided by the front-end. - As a composer, I want to hard-delete of a ringtone. - [ ] In the front-end, the client provides a ringtone ID to request a ringtone's deletion rollback to the back-end. - [X] In the back-end, the server removes a ringtone in the database if its ID matches the one provided by the front-end.