From c99c4478f22968e35092dae8e8b70eaa45a6b69d Mon Sep 17 00:00:00 2001
From: tzugen <tzugen@riseup.net>
Date: Sat, 22 May 2021 11:18:29 +0200
Subject: [PATCH] Remove file storage code from RESTAPI class

---
 core/cache/build.gradle                       | 12 ---
 .../org/moire/ultrasonic/cache/Directories.kt | 14 ----
 .../ultrasonic/cache/PermanentFileStorage.kt  | 75 -----------------
 .../cache/serializers/ArtistSerializer.kt     | 65 ---------------
 .../cache/serializers/IndexesSerializer.kt    | 51 ------------
 .../serializers/MusicFolderSerializer.kt      | 51 ------------
 .../moire/ultrasonic/cache/BaseStorageTest.kt | 42 ----------
 .../cache/PermanentFileStorageTest.kt         | 80 -------------------
 .../cache/serializers/ArtistSerializerTest.kt | 57 -------------
 .../serializers/IndexesSerializerTest.kt      | 38 ---------
 .../serializers/MusicFolderSerializerTest.kt  | 57 -------------
 dependencies.gradle                           |  2 -
 settings.gradle                               |  1 -
 ultrasonic/build.gradle                       |  1 -
 .../kotlin/org/moire/ultrasonic/app/UApp.kt   |  2 -
 .../ultrasonic/cache/AndroidDirectories.kt    | 17 ----
 .../moire/ultrasonic/di/DirectoriesModule.kt  | 13 ---
 .../moire/ultrasonic/di/MusicServiceModule.kt |  6 --
 18 files changed, 584 deletions(-)
 delete mode 100644 core/cache/build.gradle
 delete mode 100644 core/cache/src/main/kotlin/org/moire/ultrasonic/cache/Directories.kt
 delete mode 100644 core/cache/src/main/kotlin/org/moire/ultrasonic/cache/PermanentFileStorage.kt
 delete mode 100644 core/cache/src/main/kotlin/org/moire/ultrasonic/cache/serializers/ArtistSerializer.kt
 delete mode 100644 core/cache/src/main/kotlin/org/moire/ultrasonic/cache/serializers/IndexesSerializer.kt
 delete mode 100644 core/cache/src/main/kotlin/org/moire/ultrasonic/cache/serializers/MusicFolderSerializer.kt
 delete mode 100644 core/cache/src/test/kotlin/org/moire/ultrasonic/cache/BaseStorageTest.kt
 delete mode 100644 core/cache/src/test/kotlin/org/moire/ultrasonic/cache/PermanentFileStorageTest.kt
 delete mode 100644 core/cache/src/test/kotlin/org/moire/ultrasonic/cache/serializers/ArtistSerializerTest.kt
 delete mode 100644 core/cache/src/test/kotlin/org/moire/ultrasonic/cache/serializers/IndexesSerializerTest.kt
 delete mode 100644 core/cache/src/test/kotlin/org/moire/ultrasonic/cache/serializers/MusicFolderSerializerTest.kt
 delete mode 100644 ultrasonic/src/main/kotlin/org/moire/ultrasonic/cache/AndroidDirectories.kt
 delete mode 100644 ultrasonic/src/main/kotlin/org/moire/ultrasonic/di/DirectoriesModule.kt

diff --git a/core/cache/build.gradle b/core/cache/build.gradle
deleted file mode 100644
index 4f9d6446..00000000
--- a/core/cache/build.gradle
+++ /dev/null
@@ -1,12 +0,0 @@
-apply from: bootstrap.kotlinModule
-
-dependencies {
-    api project(':core:domain')
-    api other.twitterSerial
-
-    testImplementation testing.kotlinJunit
-    testImplementation testing.mockito
-    testImplementation testing.mockitoInline
-    testImplementation testing.mockitoKotlin
-    testImplementation testing.kluent
-}
diff --git a/core/cache/src/main/kotlin/org/moire/ultrasonic/cache/Directories.kt b/core/cache/src/main/kotlin/org/moire/ultrasonic/cache/Directories.kt
deleted file mode 100644
index ad0aa6de..00000000
--- a/core/cache/src/main/kotlin/org/moire/ultrasonic/cache/Directories.kt
+++ /dev/null
@@ -1,14 +0,0 @@
-package org.moire.ultrasonic.cache
-
-import java.io.File
-
-/**
- * Provides access to generic directories:
- * - for temporary caches
- * - for permanent data storage
- */
-interface Directories {
-    fun getInternalCacheDir(): File
-    fun getInternalDataDir(): File
-    fun getExternalCacheDir(): File?
-}
diff --git a/core/cache/src/main/kotlin/org/moire/ultrasonic/cache/PermanentFileStorage.kt b/core/cache/src/main/kotlin/org/moire/ultrasonic/cache/PermanentFileStorage.kt
deleted file mode 100644
index 767e23eb..00000000
--- a/core/cache/src/main/kotlin/org/moire/ultrasonic/cache/PermanentFileStorage.kt
+++ /dev/null
@@ -1,75 +0,0 @@
-package org.moire.ultrasonic.cache
-
-import com.twitter.serial.serializer.SerializationContext
-import com.twitter.serial.serializer.Serializer
-import com.twitter.serial.stream.Serial
-import com.twitter.serial.stream.bytebuffer.ByteBufferSerial
-import java.io.File
-
-typealias DomainEntitySerializer<T> = Serializer<T>
-
-internal const val STORAGE_DIR_NAME = "persistent_storage"
-
-/**
- * Provides access to permanent file based storage.
- *
- * [serverId] is currently active server. Should be unique per server so stored data will not
- * interfere with other server data.
- *
- * Look at [org.moire.ultrasonic.cache.serializers] package for available [DomainEntitySerializer]s.
- */
-class PermanentFileStorage(
-    private val directories: Directories,
-    private val serverId: String,
-    private val debug: Boolean = false
-) {
-    private val serializationContext = object : SerializationContext {
-        override fun isDebug(): Boolean = debug
-        override fun isRelease(): Boolean = !debug
-    }
-
-    private val serializer: Serial = ByteBufferSerial(serializationContext)
-
-    /**
-     * Stores given [objectToStore] using [name] as a key and [objectSerializer] as serializer.
-     */
-    fun <T> store(
-        name: String,
-        objectToStore: T,
-        objectSerializer: DomainEntitySerializer<T>
-    ) {
-        val storeFile = getFile(name)
-        if (!storeFile.exists()) storeFile.createNewFile()
-        storeFile.writeBytes(serializer.toByteArray(objectToStore, objectSerializer))
-    }
-
-    /**
-     * Loads object with [name] key using [objectDeserializer] deserializer.
-     */
-    fun <T> load(
-        name: String,
-        objectDeserializer: DomainEntitySerializer<T>
-    ): T? {
-        val storeFile = getFile(name)
-        if (!storeFile.exists()) return null
-
-        return serializer.fromByteArray(storeFile.readBytes(), objectDeserializer)
-    }
-
-    /**
-     * Clear all files in storage.
-     */
-    fun clearAll() {
-        val storageDir = getStorageDir()
-        storageDir.listFiles().forEach { it.deleteRecursively() }
-    }
-
-    private fun getFile(name: String) = File(getStorageDir(), "$name.ser")
-
-    private fun getStorageDir(): File {
-        val mainDir = File(directories.getInternalDataDir(), STORAGE_DIR_NAME)
-        val serverDir = File(mainDir, serverId)
-        if (!serverDir.exists()) serverDir.mkdirs()
-        return serverDir
-    }
-}
diff --git a/core/cache/src/main/kotlin/org/moire/ultrasonic/cache/serializers/ArtistSerializer.kt b/core/cache/src/main/kotlin/org/moire/ultrasonic/cache/serializers/ArtistSerializer.kt
deleted file mode 100644
index 1fa03bd0..00000000
--- a/core/cache/src/main/kotlin/org/moire/ultrasonic/cache/serializers/ArtistSerializer.kt
+++ /dev/null
@@ -1,65 +0,0 @@
-@file:JvmMultifileClass
-@file:JvmName("DomainSerializers")
-package org.moire.ultrasonic.cache.serializers
-
-import com.twitter.serial.serializer.CollectionSerializers
-import com.twitter.serial.serializer.ObjectSerializer
-import com.twitter.serial.serializer.SerializationContext
-import com.twitter.serial.stream.SerializerDefs
-import com.twitter.serial.stream.SerializerInput
-import com.twitter.serial.stream.SerializerOutput
-import org.moire.ultrasonic.cache.DomainEntitySerializer
-import org.moire.ultrasonic.domain.Artist
-
-private const val SERIALIZER_VERSION = 1
-
-private val artistSerializer get() = object : ObjectSerializer<Artist>(SERIALIZER_VERSION) {
-    override fun serializeObject(
-        context: SerializationContext,
-        output: SerializerOutput<out SerializerOutput<*>>,
-        item: Artist
-    ) {
-        output.writeString(item.id)
-            .writeString(item.name)
-            .writeString(item.index)
-            .writeString(item.coverArt)
-            .apply {
-                val albumCount = item.albumCount
-                if (albumCount != null) writeLong(albumCount) else writeNull()
-            }
-            .writeInt(item.closeness)
-    }
-
-    override fun deserializeObject(
-        context: SerializationContext,
-        input: SerializerInput,
-        versionNumber: Int
-    ): Artist? {
-        if (versionNumber != SERIALIZER_VERSION) return null
-
-        val id = input.readString()
-        val name = input.readString()
-        val index = input.readString()
-        val coverArt = input.readString()
-        val albumCount = if (input.peekType() == SerializerDefs.TYPE_NULL) {
-            input.readNull()
-            null
-        } else {
-            input.readLong()
-        }
-        val closeness = input.readInt()
-        return Artist(id, name, index, coverArt, albumCount, closeness)
-    }
-}
-
-/**
- * Serializer/deserializer for [Artist] domain entity.
- */
-fun getArtistsSerializer(): DomainEntitySerializer<Artist> = artistSerializer
-
-private val artistListSerializer = CollectionSerializers.getListSerializer(artistSerializer)
-
-/**
- * Serializer/deserializer for list of [Artist] domain entities.
- */
-fun getArtistListSerializer(): DomainEntitySerializer<List<Artist>> = artistListSerializer
diff --git a/core/cache/src/main/kotlin/org/moire/ultrasonic/cache/serializers/IndexesSerializer.kt b/core/cache/src/main/kotlin/org/moire/ultrasonic/cache/serializers/IndexesSerializer.kt
deleted file mode 100644
index 9683bd25..00000000
--- a/core/cache/src/main/kotlin/org/moire/ultrasonic/cache/serializers/IndexesSerializer.kt
+++ /dev/null
@@ -1,51 +0,0 @@
-@file:JvmMultifileClass
-@file:JvmName("DomainSerializers")
-package org.moire.ultrasonic.cache.serializers
-
-import com.twitter.serial.serializer.ObjectSerializer
-import com.twitter.serial.serializer.SerializationContext
-import com.twitter.serial.stream.SerializerInput
-import com.twitter.serial.stream.SerializerOutput
-import org.moire.ultrasonic.cache.DomainEntitySerializer
-import org.moire.ultrasonic.domain.Artist
-import org.moire.ultrasonic.domain.Indexes
-
-private const val SERIALIZATION_VERSION = 1
-
-private val indexesSerializer get() = object : ObjectSerializer<Indexes>(SERIALIZATION_VERSION) {
-    override fun serializeObject(
-        context: SerializationContext,
-        output: SerializerOutput<out SerializerOutput<*>>,
-        item: Indexes
-    ) {
-        val artistListSerializer = getArtistListSerializer()
-        output.writeLong(item.lastModified)
-            .writeString(item.ignoredArticles)
-            .writeObject<MutableList<Artist>>(context, item.shortcuts, artistListSerializer)
-            .writeObject<MutableList<Artist>>(context, item.artists, artistListSerializer)
-    }
-
-    @Suppress("ReturnCount")
-    override fun deserializeObject(
-        context: SerializationContext,
-        input: SerializerInput,
-        versionNumber: Int
-    ): Indexes? {
-        if (versionNumber != SERIALIZATION_VERSION) return null
-
-        val artistListDeserializer = getArtistListSerializer()
-        val lastModified = input.readLong()
-        val ignoredArticles = input.readString() ?: return null
-        val shortcutsList = input.readObject(context, artistListDeserializer) ?: return null
-        val artistsList = input.readObject(context, artistListDeserializer) ?: return null
-        return Indexes(
-            lastModified, ignoredArticles, shortcutsList.toMutableList(),
-            artistsList.toMutableList()
-        )
-    }
-}
-
-/**
- * Get serializer/deserializer for [Indexes] entity.
- */
-fun getIndexesSerializer(): DomainEntitySerializer<Indexes> = indexesSerializer
diff --git a/core/cache/src/main/kotlin/org/moire/ultrasonic/cache/serializers/MusicFolderSerializer.kt b/core/cache/src/main/kotlin/org/moire/ultrasonic/cache/serializers/MusicFolderSerializer.kt
deleted file mode 100644
index 0af30335..00000000
--- a/core/cache/src/main/kotlin/org/moire/ultrasonic/cache/serializers/MusicFolderSerializer.kt
+++ /dev/null
@@ -1,51 +0,0 @@
-@file:JvmMultifileClass
-@file:JvmName("DomainSerializers")
-package org.moire.ultrasonic.cache.serializers
-
-import com.twitter.serial.serializer.CollectionSerializers
-import com.twitter.serial.serializer.ObjectSerializer
-import com.twitter.serial.serializer.SerializationContext
-import com.twitter.serial.stream.SerializerInput
-import com.twitter.serial.stream.SerializerOutput
-import org.moire.ultrasonic.cache.DomainEntitySerializer
-import org.moire.ultrasonic.domain.MusicFolder
-
-private const val SERIALIZATION_VERSION = 1
-
-private val musicFolderSerializer = object : ObjectSerializer<MusicFolder>(SERIALIZATION_VERSION) {
-
-    override fun serializeObject(
-        context: SerializationContext,
-        output: SerializerOutput<out SerializerOutput<*>>,
-        item: MusicFolder
-    ) {
-        output.writeString(item.id).writeString(item.name)
-    }
-
-    @Suppress("ReturnCount")
-    override fun deserializeObject(
-        context: SerializationContext,
-        input: SerializerInput,
-        versionNumber: Int
-    ): MusicFolder? {
-        if (versionNumber != SERIALIZATION_VERSION) return null
-
-        val id = input.readString() ?: return null
-        val name = input.readString() ?: return null
-        return MusicFolder(id, name)
-    }
-}
-
-/**
- * Serializer/deserializer for [MusicFolder] domain entity.
- */
-fun getMusicFolderSerializer(): DomainEntitySerializer<MusicFolder> = musicFolderSerializer
-
-private val musicFolderListSerializer =
-    CollectionSerializers.getListSerializer(musicFolderSerializer)
-
-/**
- * Serializer/deserializer for [List] of [MusicFolder] items.
- */
-fun getMusicFolderListSerializer(): DomainEntitySerializer<List<MusicFolder>> =
-    musicFolderListSerializer
diff --git a/core/cache/src/test/kotlin/org/moire/ultrasonic/cache/BaseStorageTest.kt b/core/cache/src/test/kotlin/org/moire/ultrasonic/cache/BaseStorageTest.kt
deleted file mode 100644
index 36e2f74c..00000000
--- a/core/cache/src/test/kotlin/org/moire/ultrasonic/cache/BaseStorageTest.kt
+++ /dev/null
@@ -1,42 +0,0 @@
-package org.moire.ultrasonic.cache
-
-import com.twitter.serial.util.SerializationUtils
-import java.io.File
-import org.amshove.kluent.`it returns`
-import org.junit.Before
-import org.junit.Rule
-import org.junit.rules.TemporaryFolder
-import org.mockito.kotlin.mock
-
-internal const val INTERNAL_DATA_FOLDER = "data"
-internal const val INTERNAL_CACHE_FOLDER = "cache"
-internal const val EXTERNAL_CACHE_FOLDER = "external_cache"
-
-/**
- * Base test class that inits the storage
- */
-abstract class BaseStorageTest {
-    @get:Rule val tempFileRule = TemporaryFolder()
-
-    protected lateinit var mockDirectories: Directories
-    protected lateinit var storage: PermanentFileStorage
-
-    open val serverId: String = ""
-
-    @Before
-    fun setUp() {
-        mockDirectories = mock<Directories> {
-            on { getInternalDataDir() } `it returns` tempFileRule.newFolder(INTERNAL_DATA_FOLDER)
-            on { getInternalCacheDir() } `it returns` tempFileRule.newFolder(INTERNAL_CACHE_FOLDER)
-            on { getExternalCacheDir() } `it returns` tempFileRule.newFolder(EXTERNAL_CACHE_FOLDER)
-        }
-        storage = PermanentFileStorage(mockDirectories, serverId, true)
-    }
-
-    protected val storageDir get() = File(mockDirectories.getInternalDataDir(), STORAGE_DIR_NAME)
-
-    protected fun validateSerializedData(index: Int = 0) {
-        val serializedFileBytes = storageDir.listFiles()[index].readBytes()
-        SerializationUtils.validateSerializedData(serializedFileBytes)
-    }
-}
diff --git a/core/cache/src/test/kotlin/org/moire/ultrasonic/cache/PermanentFileStorageTest.kt b/core/cache/src/test/kotlin/org/moire/ultrasonic/cache/PermanentFileStorageTest.kt
deleted file mode 100644
index 1deb5fa0..00000000
--- a/core/cache/src/test/kotlin/org/moire/ultrasonic/cache/PermanentFileStorageTest.kt
+++ /dev/null
@@ -1,80 +0,0 @@
-package org.moire.ultrasonic.cache
-
-import java.io.File
-import org.amshove.kluent.`should be equal to`
-import org.amshove.kluent.`should contain`
-import org.junit.Test
-import org.moire.ultrasonic.cache.serializers.getMusicFolderSerializer
-import org.moire.ultrasonic.domain.MusicFolder
-
-/**
- * Integration test for [PermanentFileStorage].
- */
-class PermanentFileStorageTest : BaseStorageTest() {
-    override val serverId: String
-        get() = "some-server-id"
-
-    @Test
-    fun `Should create storage dir if it is not exist`() {
-        val item = MusicFolder("1", "2")
-        storage.store("test", item, getMusicFolderSerializer())
-
-        storageDir.exists() `should be equal to` true
-        getServerStorageDir().exists() `should be equal to` true
-    }
-
-    @Test
-    fun `Should serialize to file`() {
-        val item = MusicFolder("1", "23")
-        val name = "some-name"
-
-        storage.store(name, item, getMusicFolderSerializer())
-
-        val storageFiles = getServerStorageDir().listFiles()
-        storageFiles.size `should be equal to` 1
-        storageFiles[0].name `should contain` name
-    }
-
-    @Test
-    fun `Should deserialize stored object`() {
-        val item = MusicFolder("some", "nice")
-        val name = "some-name"
-        storage.store(name, item, getMusicFolderSerializer())
-
-        val loadedItem = storage.load(name, getMusicFolderSerializer())
-
-        loadedItem `should be equal to` item
-    }
-
-    @Test
-    fun `Should overwrite existing stored object`() {
-        val name = "some-nice-name"
-        val item1 = MusicFolder("1", "1")
-        val item2 = MusicFolder("2", "2")
-        storage.store(name, item1, getMusicFolderSerializer())
-        storage.store(name, item2, getMusicFolderSerializer())
-
-        val loadedItem = storage.load(name, getMusicFolderSerializer())
-
-        loadedItem `should be equal to` item2
-    }
-
-    @Test
-    fun `Should clear all files when clearAll is called`() {
-        storage.store("name1", MusicFolder("1", "1"), getMusicFolderSerializer())
-        storage.store("name2", MusicFolder("2", "2"), getMusicFolderSerializer())
-
-        storage.clearAll()
-
-        getServerStorageDir().listFiles().size `should be equal to` 0
-    }
-
-    @Test
-    fun `Should return null if serialized file not available`() {
-        val loadedItem = storage.load("some-name", getMusicFolderSerializer())
-
-        loadedItem `should be equal to` null
-    }
-
-    private fun getServerStorageDir() = File(storageDir, serverId)
-}
diff --git a/core/cache/src/test/kotlin/org/moire/ultrasonic/cache/serializers/ArtistSerializerTest.kt b/core/cache/src/test/kotlin/org/moire/ultrasonic/cache/serializers/ArtistSerializerTest.kt
deleted file mode 100644
index 967bbdb5..00000000
--- a/core/cache/src/test/kotlin/org/moire/ultrasonic/cache/serializers/ArtistSerializerTest.kt
+++ /dev/null
@@ -1,57 +0,0 @@
-package org.moire.ultrasonic.cache.serializers
-
-import org.amshove.kluent.`should be equal to`
-import org.junit.Test
-import org.moire.ultrasonic.cache.BaseStorageTest
-import org.moire.ultrasonic.domain.Artist
-
-/**
- * [Artist] serializers test.
- */
-class ArtistSerializerTest : BaseStorageTest() {
-    @Test
-    fun `Should correctly serialize Artist object`() {
-        val item = Artist("id", "name", "index", "coverArt", 1, 0)
-
-        storage.store("some-name", item, getArtistsSerializer())
-
-        validateSerializedData()
-    }
-
-    @Test
-    fun `Should correctly deserialize Artist object`() {
-        val itemName = "some-name"
-        val item = Artist("id", "name", "index", "coverArt", null, 0)
-        storage.store(itemName, item, getArtistsSerializer())
-
-        val loadedItem = storage.load(itemName, getArtistsSerializer())
-
-        loadedItem `should be equal to` item
-    }
-
-    @Test
-    fun `Should correctly serialize list of Artists`() {
-        val itemsList = listOf(
-            Artist(id = "1"),
-            Artist(id = "2", name = "some")
-        )
-
-        storage.store("some-name", itemsList, getArtistListSerializer())
-
-        validateSerializedData()
-    }
-
-    @Test
-    fun `Should correctly deserialize list of Artists`() {
-        val name = "some-name"
-        val itemsList = listOf(
-            Artist(id = "1"),
-            Artist(id = "2", name = "some")
-        )
-        storage.store(name, itemsList, getArtistListSerializer())
-
-        val loadedItems = storage.load(name, getArtistListSerializer())
-
-        loadedItems `should be equal to` itemsList
-    }
-}
diff --git a/core/cache/src/test/kotlin/org/moire/ultrasonic/cache/serializers/IndexesSerializerTest.kt b/core/cache/src/test/kotlin/org/moire/ultrasonic/cache/serializers/IndexesSerializerTest.kt
deleted file mode 100644
index 5a4cc1a1..00000000
--- a/core/cache/src/test/kotlin/org/moire/ultrasonic/cache/serializers/IndexesSerializerTest.kt
+++ /dev/null
@@ -1,38 +0,0 @@
-package org.moire.ultrasonic.cache.serializers
-
-import org.amshove.kluent.`should be equal to`
-import org.junit.Test
-import org.moire.ultrasonic.cache.BaseStorageTest
-import org.moire.ultrasonic.domain.Artist
-import org.moire.ultrasonic.domain.Indexes
-
-/**
- * Test [Indexes] domain entity serializer.
- */
-class IndexesSerializerTest : BaseStorageTest() {
-    @Test
-    fun `Should correctly serialize Indexes object`() {
-        val item = Indexes(
-            220L, "", mutableListOf(Artist("12")),
-            mutableListOf(Artist("233", "some"))
-        )
-
-        storage.store("some-name", item, getIndexesSerializer())
-
-        validateSerializedData()
-    }
-
-    @Test
-    fun `Should correctly deserialize Indexes object`() {
-        val name = "some-name"
-        val item = Indexes(
-            220L, "", mutableListOf(Artist("12")),
-            mutableListOf(Artist("233", "some"))
-        )
-        storage.store(name, item, getIndexesSerializer())
-
-        val loadedItem = storage.load(name, getIndexesSerializer())
-
-        loadedItem `should be equal to` item
-    }
-}
diff --git a/core/cache/src/test/kotlin/org/moire/ultrasonic/cache/serializers/MusicFolderSerializerTest.kt b/core/cache/src/test/kotlin/org/moire/ultrasonic/cache/serializers/MusicFolderSerializerTest.kt
deleted file mode 100644
index 1935dac8..00000000
--- a/core/cache/src/test/kotlin/org/moire/ultrasonic/cache/serializers/MusicFolderSerializerTest.kt
+++ /dev/null
@@ -1,57 +0,0 @@
-package org.moire.ultrasonic.cache.serializers
-
-import org.amshove.kluent.`should be equal to`
-import org.junit.Test
-import org.moire.ultrasonic.cache.BaseStorageTest
-import org.moire.ultrasonic.domain.MusicFolder
-
-/**
- * [MusicFolder] serializers test.
- */
-class MusicFolderSerializerTest : BaseStorageTest() {
-    @Test
-    fun `Should correctly serialize MusicFolder object`() {
-        val item = MusicFolder("Music", "Folder")
-
-        storage.store("some-name", item, getMusicFolderSerializer())
-
-        validateSerializedData()
-    }
-
-    @Test
-    fun `Should correctly deserialize MusicFolder object`() {
-        val name = "name"
-        val item = MusicFolder("some", "none")
-        storage.store(name, item, getMusicFolderSerializer())
-
-        val loadedItem = storage.load(name, getMusicFolderSerializer())
-
-        loadedItem `should be equal to` item
-    }
-
-    @Test
-    fun `Should correctly serialize list of MusicFolders objects`() {
-        val itemsList = listOf(
-            MusicFolder("1", "1"),
-            MusicFolder("2", "2")
-        )
-
-        storage.store("some-name", itemsList, getMusicFolderListSerializer())
-
-        validateSerializedData()
-    }
-
-    @Test
-    fun `Should correctly deserialize list of MusicFolder objects`() {
-        val name = "some-name"
-        val itemsList = listOf(
-            MusicFolder("1", "1"),
-            MusicFolder("2", "2")
-        )
-        storage.store(name, itemsList, getMusicFolderListSerializer())
-
-        val loadedItem = storage.load(name, getMusicFolderListSerializer())
-
-        loadedItem `should be equal to` itemsList
-    }
-}
diff --git a/dependencies.gradle b/dependencies.gradle
index bca58e6e..d8a629bb 100644
--- a/dependencies.gradle
+++ b/dependencies.gradle
@@ -28,7 +28,6 @@ ext.versions = [
         retrofit             : "2.6.4",
         jackson              : "2.9.5",
         okhttp               : "3.12.13",
-        twitterSerial        : "0.1.6",
         koin                 : "3.0.2",
         picasso              : "2.71828",
         sortListView         : "1.0.1",
@@ -82,7 +81,6 @@ ext.other = [
         jacksonConverter   : "com.squareup.retrofit2:converter-jackson:$versions.retrofit",
         jacksonKotlin      : "com.fasterxml.jackson.module:jackson-module-kotlin:$versions.jackson",
         okhttpLogging      : "com.squareup.okhttp3:logging-interceptor:$versions.okhttp",
-        twitterSerial      : "com.twitter.serial:serial:$versions.twitterSerial",
         koinCore           : "io.insert-koin:koin-core:$versions.koin",
         koinAndroid        : "io.insert-koin:koin-android:$versions.koin",
         koinViewModel      : "io.insert-koin:koin-android-viewmodel:$versions.koin",
diff --git a/settings.gradle b/settings.gradle
index a4a9a1e1..8fdc7dca 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -1,4 +1,3 @@
 include ':core:domain'
 include ':core:subsonic-api'
-include ':core:cache'
 include ':ultrasonic'
diff --git a/ultrasonic/build.gradle b/ultrasonic/build.gradle
index da0c4ec2..fdd0aaa9 100644
--- a/ultrasonic/build.gradle
+++ b/ultrasonic/build.gradle
@@ -70,7 +70,6 @@ tasks.withType(Test) {
 dependencies {
     implementation project(':core:domain')
     implementation project(':core:subsonic-api')
-    implementation project(':core:cache')
 
     api(other.picasso) {
         exclude group: "com.android.support"
diff --git a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/app/UApp.kt b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/app/UApp.kt
index 78ddfe89..191cc5b2 100644
--- a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/app/UApp.kt
+++ b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/app/UApp.kt
@@ -9,7 +9,6 @@ import org.moire.ultrasonic.BuildConfig
 import org.moire.ultrasonic.di.appPermanentStorage
 import org.moire.ultrasonic.di.applicationModule
 import org.moire.ultrasonic.di.baseNetworkModule
-import org.moire.ultrasonic.di.directoriesModule
 import org.moire.ultrasonic.di.featureFlagsModule
 import org.moire.ultrasonic.di.mediaPlayerModule
 import org.moire.ultrasonic.di.musicServiceModule
@@ -46,7 +45,6 @@ class UApp : MultiDexApplication() {
             // declare modules to use
             modules(
                 applicationModule,
-                directoriesModule,
                 appPermanentStorage,
                 baseNetworkModule,
                 featureFlagsModule,
diff --git a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/cache/AndroidDirectories.kt b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/cache/AndroidDirectories.kt
deleted file mode 100644
index d8a815a7..00000000
--- a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/cache/AndroidDirectories.kt
+++ /dev/null
@@ -1,17 +0,0 @@
-package org.moire.ultrasonic.cache
-
-import android.content.Context
-import java.io.File
-
-/**
- * Provides specific to Android implementation of [Directories].
- */
-class AndroidDirectories(
-    private val context: Context
-) : Directories {
-    override fun getInternalCacheDir(): File = context.cacheDir
-
-    override fun getInternalDataDir(): File = context.filesDir
-
-    override fun getExternalCacheDir(): File? = context.externalCacheDir
-}
diff --git a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/di/DirectoriesModule.kt b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/di/DirectoriesModule.kt
deleted file mode 100644
index 5e9b415e..00000000
--- a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/di/DirectoriesModule.kt
+++ /dev/null
@@ -1,13 +0,0 @@
-package org.moire.ultrasonic.di
-
-import org.koin.dsl.bind
-import org.koin.dsl.module
-import org.moire.ultrasonic.cache.AndroidDirectories
-import org.moire.ultrasonic.cache.Directories
-
-/**
- * This Koin module contains the registration for Directories
- */
-val directoriesModule = module {
-    single { AndroidDirectories(get()) } bind Directories::class
-}
diff --git a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/di/MusicServiceModule.kt b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/di/MusicServiceModule.kt
index c6d18ee5..bb4c3575 100644
--- a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/di/MusicServiceModule.kt
+++ b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/di/MusicServiceModule.kt
@@ -10,7 +10,6 @@ import org.moire.ultrasonic.BuildConfig
 import org.moire.ultrasonic.api.subsonic.SubsonicAPIClient
 import org.moire.ultrasonic.api.subsonic.SubsonicAPIVersions
 import org.moire.ultrasonic.api.subsonic.SubsonicClientConfiguration
-import org.moire.ultrasonic.cache.PermanentFileStorage
 import org.moire.ultrasonic.data.ActiveServerProvider
 import org.moire.ultrasonic.imageloader.ImageLoader
 import org.moire.ultrasonic.log.TimberOkHttpLogger
@@ -43,11 +42,6 @@ val musicServiceModule = module {
         return@single abs("$serverUrl$serverInstance".hashCode()).toString()
     }
 
-    single {
-        val serverId = get<String>(named("ServerID"))
-        return@single PermanentFileStorage(get(), serverId, BuildConfig.DEBUG)
-    }
-
     single {
         val server = get<ActiveServerProvider>().getActiveServer()