A decentralized music tracking and discovery platform built on AT Protocol 🎵

feat: add delete functionality to cache and integrate with submit_listens

+30
+6
crates/scrobbler/src/cache.rs
··· 39 39 Ok(()) 40 40 } 41 41 42 + pub fn del(&self, key: &str) -> Result<(), Error> { 43 + let mut con = self.client.get_connection()?; 44 + redis::cmd("DEL").arg(key).query::<()>(&mut con)?; 45 + Ok(()) 46 + } 47 + 42 48 pub fn exists(&self, key: &str) -> Result<bool, Error> { 43 49 let mut con = self.client.get_connection()?; 44 50 let result: bool = redis::cmd("EXISTS").arg(key).query(&mut con)?;
+24
crates/scrobbler/src/listenbrainz/core/submit.rs
··· 4 4 use serde_json::json; 5 5 use std::sync::Arc; 6 6 7 + use crate::auth::decode_token; 8 + use crate::repo; 7 9 use crate::{cache::Cache, scrobbler::scrobble_listenbrainz}; 8 10 9 11 use crate::listenbrainz::types::SubmitListensRequest; ··· 38 40 }))); 39 41 } 40 42 Err(e) => { 43 + let artist = payload.payload[0].track_metadata.artist_name.clone(); 44 + let track = payload.payload[0].track_metadata.track_name.clone(); 45 + 46 + let did = match decode_token(token) { 47 + Ok(claims) => claims.did, 48 + Err(e) => { 49 + let user = repo::user::get_user_by_apikey(pool, token) 50 + .await? 51 + .map(|user| user.did); 52 + if let Some(did) = user { 53 + did 54 + } else { 55 + return Err(Error::msg(format!( 56 + "Failed to decode token: {} {}", 57 + e, token 58 + ))); 59 + } 60 + } 61 + }; 62 + 63 + cache.del(&format!("listenbrainz:cache:{}:{}:{}", artist, track, did))?; 64 + 41 65 println!( 42 66 "Retryable error on attempt {}/{}: {}", 43 67 attempt,