Skip to content

Commit f49ad63

Browse files
committed
Add fixes and more examples in Lab 10 assignment
1 parent 80fa54d commit f49ad63

File tree

1 file changed

+94
-35
lines changed

1 file changed

+94
-35
lines changed

11-network-ii/lab/README.md

Lines changed: 94 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -49,10 +49,20 @@ create-playlist <playlist_name>
4949

5050
Създава нова плейлиста.
5151

52-
Ограничения:
52+
Изисквания:
5353
- името е една дума (без интервали);
5454
- не може да съществуват две плейлисти с едно и също име.
5555

56+
Пример:
57+
58+
```
59+
create-playlist MyFavorites
60+
{"status":"OK","message":"Playlist MyFavorites created successfully."}
61+
62+
create-playlist MyFavorites
63+
{"status":"ERROR","message":"Playlist MyFavorites already exists."}
64+
```
65+
5666
### add-song
5767

5868
```
@@ -61,10 +71,26 @@ add-song <playlist_name> <song_title> <artist_name> <duration>
6171

6272
Добавя песен към плейлиста.
6373

64-
Ограничения:
74+
Изисквания:
6575
- `song_title` и `artist_name` са една дума;
6676
- `duration` е цяло число (секунди);
67-
- една и съща песен (заглавие + артист) не може да бъде добавяна два пъти.
77+
- една и съща песен (заглавие + артист) не може да бъде добавяна два пъти в същата плейлиста.
78+
79+
Пример:
80+
81+
```
82+
add-song MyFavorites Imagine John-Lennon 183
83+
{"status":"OK","message":"Song Imagine by John-Lennon added successfully."}
84+
85+
add-song MyFavorites Song Artist 0
86+
{"status":"ERROR","message":"Duration must be a positive integer"}
87+
88+
add-song NonExistent Song Artist 200
89+
{"status":"ERROR","message":"Playlist NonExistent does not exist."}
90+
91+
add-song MyFavorites Imagine John-Lennon 183
92+
{"status":"ERROR","message":"Song Imagine by John-Lennon already exists in playlist MyFavorites."}
93+
```
6894

6995
### like-song
7096

@@ -74,13 +100,36 @@ like-song <playlist_name> <song_title> <artist_name>
74100

75101
Увеличава броя харесвания с 1.
76102

103+
Пример:
104+
105+
```
106+
like-song MyFavorites Imagine John-Lennon
107+
{"status":"OK","message":"Song Imagine by John-Lennon liked. Likes: 1"}
108+
109+
like-song NonExistent Song Artist
110+
{"status":"ERROR","message":"Playlist NonExistent does not exist."}
111+
112+
like-song MyFavorites NonExistent Artist
113+
{"status":"ERROR","message":"Song NonExistent by Artist does not exist in playlist MyFavorites."}
114+
```
115+
77116
### unlike-song
78117

79118
```
80119
unlike-song <playlist_name> <song_title> <artist_name>
81120
```
82121

83-
Намалява броя харесвания с 1 (минимум 0).
122+
Намалява броя харесвания на песента в плейлистата с 1. Броят на харесванията не може да падне под 0.
123+
124+
Пример:
125+
126+
```
127+
add-song MyFavorites NewSong Artist 200
128+
{"status":"OK","message":"Song NewSong by Artist added successfully."}
129+
130+
unlike-song MyFavorites NewSong Artist
131+
{"status":"OK","message":"Song NewSong by Artist unliked. Likes: 0"}
132+
```
84133

85134
### list-playlists
86135

@@ -90,13 +139,36 @@ list-playlists
90139

91140
Връща списък с всички плейлисти.
92141

142+
Пример:
143+
144+
```
145+
list-playlists
146+
{"status":"OK","playlists":[]}
147+
148+
create-playlist Favorites
149+
{"status":"OK","message":"Playlist Favorites created successfully."}
150+
151+
create-playlist Workout
152+
{"status":"OK","message":"Playlist Workout created successfully."}
153+
154+
list-playlists
155+
{"status":"OK","playlists":["Favorites","Workout"]}
156+
```
157+
93158
### get-playlist
94159

95160
```
96161
get-playlist <playlist_name>
97162
```
98163

99-
Връща детайлна информация за плейлиста.
164+
Връща детайлна информация за плейлиста, включително всички песни и техните харесвания в контекста на тази плейлиста.
165+
166+
Пример:
167+
168+
```
169+
get-playlist MyFavorites
170+
{"status":"OK","playlist":{"name":"MyFavorites","songs":[{"title":"Imagine","artist":"John-Lennon","duration":183,"likes":2},{"title":"Bohemian-Rhapsody","artist":"Queen","duration":354,"likes":0},{"title":"Yesterday","artist":"The-Beatles","duration":145,"likes":5}]}}
171+
```
100172

101173
### disconnect
102174

@@ -106,22 +178,6 @@ disconnect
106178

107179
Прекратява връзката със сървъра.
108180

109-
## Примерна сесия
110-
111-
```bash
112-
create-playlist MyFavorites
113-
{"status":"OK","message":"Playlist MyFavorites created successfully."}
114-
115-
add-song MyFavorites Imagine John-Lennon 183
116-
{"status":"OK","message":"Song Imagine by John-Lennon added successfully."}
117-
118-
like-song MyFavorites Imagine John-Lennon
119-
{"status":"OK","message":"Song Imagine by John-Lennon liked. Likes: 1"}
120-
121-
get-playlist MyFavorites
122-
{"status":"OK","playlist":{"name":"MyFavorites","songs":[{"title":"Imagine","artist":"John-Lennon","duration":183,"likes":1}]}}
123-
```
124-
125181
## Интерфейси
126182

127183
Имплементирайте следния интерфейс като създадете клас `InMemoryPlaylistRepository` с конструктор по подразбиране:
@@ -152,12 +208,13 @@ public interface PlaylistRepository {
152208
* @param songTitle the title of the song.
153209
* @param artistName the name of the artist.
154210
* @param duration the duration of the song in seconds.
211+
* @return the Song added.
155212
* @throws PlaylistNotFoundException if the playlist with the given name
156213
* does not exist.
157214
* @throws SongAlreadyExistsException if a song with the same title and artist
158215
* already exists in the playlist.
159216
*/
160-
void addSong(String playlistName, String songTitle, String artistName, int duration)
217+
Song addSong(String playlistName, String songTitle, String artistName, int duration)
161218
throws PlaylistNotFoundException, SongAlreadyExistsException;
162219

163220
/**
@@ -175,7 +232,8 @@ public interface PlaylistRepository {
175232

176233
/**
177234
* Decreases the number of likes of a given song in the playlist by 1.
178-
* The number of likes cannot be less than 0.
235+
* The number of likes cannot be less than 0. When unliking a song with 0 likes,
236+
* the operation succeeds silently with likes remaining 0.
179237
*
180238
* @param playlistName the name of the playlist.
181239
* @param songTitle the title of the song.
@@ -210,27 +268,30 @@ public interface PlaylistRepository {
210268

211269
## Модели
212270

213-
```java
214-
public record Playlist(String name, Set<Song> songs) {}
215-
public record Song(String title, String artist, int duration, int likes) {}
216-
```
271+
Плейлиста ще моделираме чрез класа `Playlist`, който има публичен конструктор `Playlist(String name, Map<Song, Integer> songs)`, описващ песните и броя харесвания на всяка от тях в дадената плейлиста.
217272

218-
- Две песни са еднакви, ако заглавието и артистът съвпадат.
273+
Песен ще описваме с record-a `Song(String title, String artist, int duration)`, който трябва да има публичен каноничен конструктор. Две песни са еднакви, ако заглавието и артистът съвпадат.
274+
275+
Броят харесвания на песен се поддържа отделно за всяка плейлиста. Ако добавите една и съща песен (по име и артист) в две плейлисти, тя може да има различен брой харесвания в контекста на всяка плейлиста. С други думи, харесването на песен в дадена плейлиста не влияе на броя харесвания на същата песен в друга плейлиста.
219276

220277
## Валидации
221278

279+
- Продължителността трябва да е положително цяло число (> 0). Ако продължителността е невалидна, върнете:
280+
281+
```json
282+
{"status":"ERROR","message":"Duration must be a positive integer"}
283+
```
284+
222285
Уверете се, че всички команди са валидирани и връщат съобщение за грешка, ако форматът на командата не е валиден.
223286

224287
Пример:
225288

226289
```
227290
add-song MyFavorites
228-
```
229-
230-
Отговор:
231-
232-
```json
233291
{"status":"ERROR","message":"Usage: add-song <playlist_name> <song_title> <artist_name> <duration>"}
292+
293+
some random command
294+
{"status":"ERROR","message":"Unknown command"}
234295
```
235296

236297
## Тестване
@@ -247,8 +308,6 @@ add-song MyFavorites
247308

248309
Добра практика при създаването на приложения тип клиент-сървър е да отделяте клиента и сървъра в отделни проекти. Това предотвратява грешки от типа, класове/интерфейси от клиента да се ползват от сървъра, или обратно. Също така, в реална ситуация, бихме искали да пакетираме и разпространяваме поотделно клиентската и сървърната част на нашето приложение. Като минимум, отделете имплементацията на клиента и сървъра в отделни пакети.
249310

250-
В грейдъра качете папки `src` и `test`, ако имате тестове (или техен общ `zip` архив).
251-
252311
```
253312
src
254313
└─ bg.sofia.uni.fmi.mjt.music

0 commit comments

Comments
 (0)