SDPTeam15/PolyEvents

View on GitHub
app/src/main/java/com/github/sdpteam15/polyevents/model/database/remote/objects/EventDatabase.kt

Summary

Maintainability
A
0 mins
Test Coverage
A
92%
package com.github.sdpteam15.polyevents.model.database.remote.objects

import com.github.sdpteam15.polyevents.model.database.remote.DatabaseConstant
import com.github.sdpteam15.polyevents.model.database.remote.DatabaseConstant.CollectionConstant.*
import com.github.sdpteam15.polyevents.model.database.remote.DatabaseInterface
import com.github.sdpteam15.polyevents.model.database.remote.adapter.EventAdapter
import com.github.sdpteam15.polyevents.model.database.remote.adapter.RatingAdapter
import com.github.sdpteam15.polyevents.model.database.remote.matcher.Matcher
import com.github.sdpteam15.polyevents.model.entity.Event
import com.github.sdpteam15.polyevents.model.entity.Rating
import com.github.sdpteam15.polyevents.model.observable.Observable
import com.github.sdpteam15.polyevents.model.observable.ObservableList

const val TAG = "EventDatabase"

class EventDatabase(private val db: DatabaseInterface) : EventDatabaseInterface {
    override fun createEvent(event: Event): Observable<Boolean> =
        db.addEntity(event, EVENT_COLLECTION, EventAdapter)

    override fun updateEvent(event: Event): Observable<Boolean> =
        db.setEntity(event, event.eventId!!, EVENT_COLLECTION)

    override fun removeEvent(eventId: String): Observable<Boolean> =
        db.deleteEntity(eventId, EVENT_COLLECTION)

    override fun getEventFromId(
        id: String,
        returnEvent: Observable<Event>
    ): Observable<Boolean> =
        db.getEntity(returnEvent, id, EVENT_COLLECTION, EventAdapter)

    override fun getEvents(
        eventList: ObservableList<Event>,
        limit: Long?,
        matcher: Matcher?
    ): Observable<Boolean> =
        db.getListEntity(
            eventList,
            null,
            {
                var query = matcher?.match(it) ?: it

                if (limit != null) query = query.limit(limit)
                query
            },
            EVENT_COLLECTION
        )

    override fun createEventEdit(event: Event): Observable<Boolean> =
        db.addEntity(event, EVENT_EDIT_COLLECTION)

    override fun updateEventEdit(event: Event): Observable<Boolean> =
        db.setEntity(event, event.eventEditId!!, EVENT_EDIT_COLLECTION)

    override fun removeEventEdit(eventId: String): Observable<Boolean> =
        db.deleteEntity(eventId, EVENT_EDIT_COLLECTION)

    override fun getEventEditFromId(
        id: String,
        returnEvent: Observable<Event>
    ): Observable<Boolean> = db.getEntity(returnEvent, id, EVENT_EDIT_COLLECTION)

    override fun getEventEdits(
        eventList: ObservableList<Event>,
        matcher: Matcher?
    ): Observable<Boolean> =
        db.getListEntity(
            eventList,
            null,
            matcher,
            EVENT_EDIT_COLLECTION
        )

    override fun getRatingsForEvent(
        eventId: String,
        limit: Long?,
        ratingList: ObservableList<Rating>
    ): Observable<Boolean> =
        db.getListEntity(
            ratingList,
            null, {
                val query =
                    it.whereEqualTo(DatabaseConstant.RatingConstant.RATING_EVENT_ID.value, eventId)
                if (limit != null) {
                    query.limit(limit)
                } else {
                    query
                }
            }, RATING_COLLECTION
        )

    override fun addRatingToEvent(rating: Rating): Observable<Boolean> =
        db.addEntity(rating, RATING_COLLECTION, RatingAdapter)

    override fun removeRating(rating: Rating): Observable<Boolean> =
        db.deleteEntity(rating.ratingId!!, RATING_COLLECTION)

    override fun updateRating(rating: Rating): Observable<Boolean> =
        db.setEntity(rating, rating.ratingId!!, RATING_COLLECTION, RatingAdapter)


    override fun getMeanRatingForEvent(
        eventId: String,
        mean: Observable<Float>
    ): Observable<Boolean> {
        val end = Observable<Boolean>()
        val rating = ObservableList<Rating>()

        getRatingsForEvent(eventId, null, rating).observeOnce {
            if (it.value) {
                val m = rating.fold(
                    Pair(0.0F, 0),
                    { a, b ->
                        Pair(
                            (a.first * a.second + b.rate!!) / (a.second + 1),
                            a.second + 1
                        )
                    })
                mean.postValue(m.first, it.sender)
                end.postValue(true, it.sender)
            } else {
                end.postValue(false, it.sender)
            }
        }

        return end
    }

    override fun getUserRatingFromEvent(
        userId: String,
        eventId: String,
        returnedRating: Observable<Rating>
    ): Observable<Boolean> {
        val end = Observable<Boolean>()
        val rating = ObservableList<Rating>()

        db.getListEntity(rating, null, {
            it.whereEqualTo(DatabaseConstant.RatingConstant.RATING_EVENT_ID.value, eventId)
                .whereEqualTo(DatabaseConstant.RatingConstant.RATING_USER_ID.value, userId)
                .limit(1)
        }, RATING_COLLECTION).observeOnce {
            if (it.value) {
                if (rating.size == 0) {
                    end.postValue(false, db)
                } else {
                    returnedRating.postValue(rating[0])
                    end.postValue(true, db)
                }
            } else {
                end.postValue(false, db)
            }
        }
        return end
    }

    override fun getEventsByZoneId(
        zoneId: String,
        limit: Long?,
        events: ObservableList<Event>
    ): Observable<Boolean> =
        db.getListEntity(
            events,
            null,
            {
                val query =
                    it.whereEqualTo(DatabaseConstant.EventConstant.EVENT_ZONE_ID.value, zoneId)
                if (limit != null) query.limit(limit)
                query
            },
            EVENT_COLLECTION
        )

}