@@ -1181,5 +1181,137 @@ private string CalculateFilterId(string parentId, Dictionary<string, BsonFileMan
11811181
11821182 #endregion
11831183
1184+ #region Playlist Operations
1185+
1186+ private const string PLAYLIST_COLLECTION = "playlists" ;
1187+
1188+ public async Task < PlaylistModel > CreatePlaylist ( PlaylistModel playlist )
1189+ {
1190+ if ( string . IsNullOrEmpty ( playlist . Id ) )
1191+ {
1192+ playlist . Id = MongoDB . Bson . ObjectId . GenerateNewId ( ) . ToString ( ) ;
1193+ }
1194+ playlist . DateCreated = DateTime . Now ;
1195+ playlist . DateModified = DateTime . Now ;
1196+
1197+ var collection = getDatabase ( CONFIG_DB_NAME ) . GetCollection < PlaylistModel > ( PLAYLIST_COLLECTION ) ;
1198+ await collection . InsertOneAsync ( playlist ) ;
1199+
1200+ _logger . LogInformation ( "Created playlist {Name} with Id {Id}" , playlist . Name , playlist . Id ) ;
1201+ return playlist ;
1202+ }
1203+
1204+ public async Task < List < PlaylistModel > > GetAllPlaylists ( )
1205+ {
1206+ var collection = getDatabase ( CONFIG_DB_NAME ) . GetCollection < PlaylistModel > ( PLAYLIST_COLLECTION ) ;
1207+ var playlists = await ( await collection . FindAsync ( Builders < PlaylistModel > . Filter . Empty ) ) . ToListAsync ( ) ;
1208+ return playlists . OrderByDescending ( p => p . DateModified ) . ToList ( ) ;
1209+ }
1210+
1211+ public async Task < PlaylistModel ? > GetPlaylistById ( string id )
1212+ {
1213+ var collection = getDatabase ( CONFIG_DB_NAME ) . GetCollection < PlaylistModel > ( PLAYLIST_COLLECTION ) ;
1214+ return await ( await collection . FindAsync ( Builders < PlaylistModel > . Filter . Eq ( x => x . Id , id ) ) ) . FirstOrDefaultAsync ( ) ;
1215+ }
1216+
1217+ public async Task UpdatePlaylist ( PlaylistModel playlist )
1218+ {
1219+ playlist . DateModified = DateTime . Now ;
1220+
1221+ var collection = getDatabase ( CONFIG_DB_NAME ) . GetCollection < PlaylistModel > ( PLAYLIST_COLLECTION ) ;
1222+ var filter = Builders < PlaylistModel > . Filter . Eq ( x => x . Id , playlist . Id ) ;
1223+ await collection . ReplaceOneAsync ( filter , playlist , new ReplaceOptions { IsUpsert = false } ) ;
1224+
1225+ _logger . LogInformation ( "Updated playlist {Name} with Id {Id}" , playlist . Name , playlist . Id ) ;
1226+ }
1227+
1228+ public async Task DeletePlaylist ( string id )
1229+ {
1230+ var collection = getDatabase ( CONFIG_DB_NAME ) . GetCollection < PlaylistModel > ( PLAYLIST_COLLECTION ) ;
1231+ await collection . DeleteOneAsync ( Builders < PlaylistModel > . Filter . Eq ( x => x . Id , id ) ) ;
1232+
1233+ _logger . LogInformation ( "Deleted playlist with Id {Id}" , id ) ;
1234+ }
1235+
1236+ public async Task AddTrackToPlaylist ( string playlistId , PlaylistTrackModel track )
1237+ {
1238+ var collection = getDatabase ( CONFIG_DB_NAME ) . GetCollection < PlaylistModel > ( PLAYLIST_COLLECTION ) ;
1239+
1240+ // Get current playlist to determine next order
1241+ var playlist = await GetPlaylistById ( playlistId ) ;
1242+ if ( playlist == null )
1243+ {
1244+ _logger . LogWarning ( "Playlist {Id} not found when adding track" , playlistId ) ;
1245+ return ;
1246+ }
1247+
1248+ // Set order to be at the end
1249+ track . Order = playlist . Tracks . Count ;
1250+ track . DateAdded = DateTime . Now ;
1251+
1252+ var filter = Builders < PlaylistModel > . Filter . Eq ( x => x . Id , playlistId ) ;
1253+ var update = Builders < PlaylistModel > . Update
1254+ . Push ( x => x . Tracks , track )
1255+ . Set ( x => x . DateModified , DateTime . Now ) ;
1256+
1257+ await collection . UpdateOneAsync ( filter , update ) ;
1258+
1259+ _logger . LogInformation ( "Added track {FileName} to playlist {Id}" , track . FileName , playlistId ) ;
1260+ }
1261+
1262+ public async Task RemoveTrackFromPlaylist ( string playlistId , string fileId )
1263+ {
1264+ var collection = getDatabase ( CONFIG_DB_NAME ) . GetCollection < PlaylistModel > ( PLAYLIST_COLLECTION ) ;
1265+
1266+ var filter = Builders < PlaylistModel > . Filter . Eq ( x => x . Id , playlistId ) ;
1267+ var update = Builders < PlaylistModel > . Update
1268+ . PullFilter ( x => x . Tracks , t => t . FileId == fileId )
1269+ . Set ( x => x . DateModified , DateTime . Now ) ;
1270+
1271+ await collection . UpdateOneAsync ( filter , update ) ;
1272+
1273+ // Reorder remaining tracks
1274+ var playlist = await GetPlaylistById ( playlistId ) ;
1275+ if ( playlist != null && playlist . Tracks . Count > 0 )
1276+ {
1277+ for ( int i = 0 ; i < playlist . Tracks . Count ; i ++ )
1278+ {
1279+ playlist . Tracks [ i ] . Order = i ;
1280+ }
1281+ await UpdatePlaylist ( playlist ) ;
1282+ }
1283+
1284+ _logger . LogInformation ( "Removed track {FileId} from playlist {Id}" , fileId , playlistId ) ;
1285+ }
1286+
1287+ public async Task ReorderPlaylistTracks ( string playlistId , List < string > orderedFileIds )
1288+ {
1289+ var playlist = await GetPlaylistById ( playlistId ) ;
1290+ if ( playlist == null )
1291+ {
1292+ _logger . LogWarning ( "Playlist {Id} not found when reordering tracks" , playlistId ) ;
1293+ return ;
1294+ }
1295+
1296+ // Reorder tracks based on the provided order
1297+ var reorderedTracks = new List < PlaylistTrackModel > ( ) ;
1298+ for ( int i = 0 ; i < orderedFileIds . Count ; i ++ )
1299+ {
1300+ var track = playlist . Tracks . FirstOrDefault ( t => t . FileId == orderedFileIds [ i ] ) ;
1301+ if ( track != null )
1302+ {
1303+ track . Order = i ;
1304+ reorderedTracks . Add ( track ) ;
1305+ }
1306+ }
1307+
1308+ playlist . Tracks = reorderedTracks ;
1309+ await UpdatePlaylist ( playlist ) ;
1310+
1311+ _logger . LogInformation ( "Reordered {Count} tracks in playlist {Id}" , reorderedTracks . Count , playlistId ) ;
1312+ }
1313+
1314+ #endregion
1315+
11841316 }
11851317}
0 commit comments