# Backend as an implementation detail

AppKickstarter is designed with a high level of abstraction for core functionalities such as Authentication, Remote Data Storage, and Remote Document Storage. This architectural choice ensures flexibility, allowing for easy substitution of Firebase or any other backend services. This section guides you through customizing the endpoints for Authentication, Storage, and Database services by leveraging the power of dependency injection with Koin.

### Create a Koin module

To begin customizing your backend services, create a Koin module that will hold your implementations:

```
val customRemoteModule = module {
    // your implementations, see below
}
```

### Storage

To customize storage solutions, implement the `IRemoteFileSystem` interface:

<pre><code><strong>interface IRemoteFileSystem {
</strong><strong>    suspend fun putFileAt(localFile: LocalFile, location: String): FileUrl
</strong><strong>}
</strong></code></pre>

Then, register your custom storage implementation in the Koin module:

```
singleOf(::CustomRemoteFileSystemImpl) bind IRemoteFileSystem::class
```

### Database

For custom database interactions, implement the `IUserRemoteDB` interface:

```
interface IUserRemoteDB { 
    suspend fun getUserInfos(userId: String): User? 
    suspend fun postUserInfos(user: User) 
}
```

And add your implementation to the Koin module for dependency injection:

```
singleOf(::CustomUserRemoteImpl) bind IUserRemoteDB::class
```

#### Posts Management

AppKickstarter includes default data manipulation examples, such as creating user posts with text, date, and images, and displaying them in a feed. To integrate a custom solution for posts storage:

Implement the `IPostsRemoteDB` interface:

```
interface IPostsRemoteDB { 
    suspend fun uploadPost(post: Post): String 
    suspend fun getAllPosts(): List 
    suspend fun deletePost(id: String)
}
```

Register your implementation in the Koin module:

```
singleOf(::CustomPostsRemoteImpl) bind IPostsRemoteDB::class
```

### Authentication

To customize authentication mechanisms, implement the `KickstarterAuth` interface:

```
interface KickstarterAuth {
    suspend fun signout()
    fun getCurrentUser(): CurrentUser?
    fun observeAuthStateChanged(): Flow<CurrentUser?>
    suspend fun observeSessionStatus(): Flow<SessionStatus>
    suspend fun signInAnonymously(): CurrentUser?
    suspend fun resetPassword(email: String)
    suspend fun createUserWithEmailAndPassword(email: String, password: String): CurrentUser?
    suspend fun signInWithEmailAndPassword(email: String, password: String): CurrentUser?
}
```

Finally, integrate your custom authentication service into the Koin module:

```
singleOf(::CustomRemoteAuth) bind KickstarterAuth::class
```

### Wrap it up

To finalize the customization of your backend services in AppKickstarter, ensure your `customRemoteModule` is defined as follows:

```
val customRemoteModule = module {
    singleOf(::CustomemoteFileSystemImpl) bind IRemoteFileSystem::class
    singleOf(::CustomUserRemoteImpl) bind IUserRemoteDB::class
    singleOf(::CustomPostsRemoteImpl) bind IPostsRemoteDB::class
    singleOf(::CustomRemoteAuth) bind KickstarterAuth::class
}
```

Navigate to `shared/commonMain/sharedModule/initKoin`, and make the following adjustments:

1. Remove the `firebaseModule`: This step is crucial as it disconnects the default Firebase implementations from your app's dependency graph.
2. Add `customRemoteModule`: By adding your custom module, you effectively replace the default services with your tailored implementations.

By completing these steps, you have successfully set up custom endpoints for Authentication, Storage, and Database services in AppKickstarter. This approach ensures that the core functionalities of your app are not tightly coupled with Firebase or any specific backend service.&#x20;


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.appkickstarter.com/tech-things/backend-as-an-implementation-detail.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
