MrZaiko/Polysmee

View on GitHub
app/src/main/java/io/github/polysmee/database/DatabaseAppointment.java

Summary

Maintainability
D
1 day
Test Coverage
A
99%
package io.github.polysmee.database;

import com.google.firebase.database.ValueEventListener;

import io.github.polysmee.database.databaselisteners.childListeners.BooleanChildListener;
import io.github.polysmee.database.databaselisteners.valuelisteners.BooleanValueListener;
import io.github.polysmee.database.databaselisteners.valuelisteners.LongValueListener;
import io.github.polysmee.database.databaselisteners.childListeners.MessageChildListener;
import io.github.polysmee.database.databaselisteners.valuelisteners.StringSetValueListener;
import io.github.polysmee.database.databaselisteners.valuelisteners.StringValueListener;

public class DatabaseAppointment implements Appointment {

    private final String id;

    public DatabaseAppointment(String id) {
        this.id = id;
    }

    private void getStuffAndThen(String stuff, ValueEventListener l) {
        DatabaseSingleton
                .getAdaptedInstance()
                .getReference("appointments")
                .child(id)
                .child(stuff)
                .addValueEventListener(l);
    }

    private void getStuff_Once_AndThen(String stuff, ValueEventListener l) {
        DatabaseSingleton
                .getAdaptedInstance()
                .getReference("appointments")
                .child(id)
                .child(stuff)
                .addListenerForSingleValueEvent(l);
    }

    private void removeStuffListener(String stuff, ValueEventListener l) {
        DatabaseSingleton
                .getAdaptedInstance()
                .getReference("appointments")
                .child(id)
                .child(stuff)
                .removeEventListener(l);
    }


    @Override
    public String getId() {
        return id;
    }

    @Override
    public void getStartTimeAndThen(LongValueListener l) {
        getStuffAndThen("start", l);
    }

    @Override
    public void getStartTime_Once_AndThen(LongValueListener l) {
        getStuff_Once_AndThen("start", l);
    }

    @Override
    public void removeStartListener(LongValueListener l) {
        removeStuffListener("start", l);
    }

    @Override
    public void getDurationAndThen(LongValueListener l) {
        getStuffAndThen("duration", l);
    }

    @Override
    public void getDuration_Once_AndThen(LongValueListener l) {
        getStuff_Once_AndThen("duration", l);
    }

    @Override
    public void removeDurationListener(LongValueListener l) {
        removeStuffListener("duration", l);
    }

    @Override
    public void getCourseAndThen(StringValueListener s) {
        getStuffAndThen("course", s);
    }

    @Override
    public void getCourse_Once_AndThen(StringValueListener s) {
        getStuff_Once_AndThen("course", s);
    }

    @Override
    public void removeCourseListener(StringValueListener l) {
        removeStuffListener("course", l);
    }

    @Override
    public void getTitleAndThen(StringValueListener s) {
        getStuffAndThen("title", s);
    }

    @Override
    public void getTitle_Once_AndThen(StringValueListener s) {
        getStuff_Once_AndThen("title", s);
    }

    @Override
    public void removeTitleListener(StringValueListener l) {
        removeStuffListener("title", l);
    }

    @Override
    public void getParticipantsIdAndThen(StringSetValueListener s) {
        getStuffAndThen("participants", s);
    }

    @Override
    public void getParticipantsId_Once_AndThen(StringSetValueListener s) {
        getStuff_Once_AndThen("participants", s);
    }

    @Override
    public void removeParticipantsListener(StringSetValueListener s) {
        removeStuffListener("participants", s);
    }

    @Override
    public void getOwnerIdAndThen(StringValueListener s) {
        getStuffAndThen("owner", s);
    }

    @Override
    public void getOwnerId_Once_AndThen(StringValueListener s) {
        getStuff_Once_AndThen("owner", s);
    }

    @Override
    public void removeOwnerListener(StringValueListener s) {
        removeStuffListener("owner", s);
    }

    @Override
    public void getInvitesIdAndThen(StringSetValueListener s) {
        getStuffAndThen("invites", s);
    }

    @Override
    public void getInvitesId_Once_AndThen(StringSetValueListener s) {
        getStuff_Once_AndThen("invites", s);
    }

    @Override
    public void removeInvitesListener(StringSetValueListener s) {
        removeStuffListener("invites", s);
    }

    @Override
    public void getPrivateAndThen(BooleanValueListener b) {
        getStuffAndThen("private", b);
    }

    @Override
    public void getPrivate_Once_AndThen(BooleanValueListener b) {
        getStuff_Once_AndThen("private", b);
    }

    @Override
    public void removePrivateListener(BooleanValueListener b) {
        removeStuffListener("private", b);
    }

    @Override
    public void setStartTime(long startTime) {
        if (startTime < 0)
            return;

        DatabaseSingleton
                .getAdaptedInstance()
                .getReference("appointments")
                .child(id)
                .child("start")
                .setValue(startTime);
    }

    @Override
    public void setDuration(long duration) {
        if (duration < 0 || duration > 3600000 * 4)
            return;

        DatabaseSingleton
                .getAdaptedInstance()
                .getReference("appointments")
                .child(id)
                .child("duration")
                .setValue(duration);
    }

    @Override
    public void setCourse(String course) {
        DatabaseSingleton
                .getAdaptedInstance()
                .getReference("appointments")
                .child(id)
                .child("course")
                .setValue(course);
    }

    @Override
    public void setTitle(String title) {
        DatabaseSingleton
                .getAdaptedInstance()
                .getReference("appointments")
                .child(id)
                .child("title")
                .setValue(title);
    }

    @Override
    public void addParticipant(User newParticipant) {
        DatabaseSingleton
                .getAdaptedInstance()
                .getReference("appointments")
                .child(id)
                .child("participants")
                .child(newParticipant.getId())
                .setValue(true);
    }

    @Override
    public void removeParticipant(User participant) {
        DatabaseSingleton
                .getAdaptedInstance()
                .getReference("appointments")
                .child(id)
                .child("participants")
                .child(participant.getId())
                .setValue(null);
    }

    @Override
    public void getBansAndThen(StringSetValueListener s) {
        DatabaseSingleton
                .getAdaptedInstance()
                .getReference("appointments")
                .child(id)
                .child("banned")
                .addValueEventListener(s);
    }

    @Override
    public void getBans_Once_AndThen(StringSetValueListener s) {
        DatabaseSingleton
                .getAdaptedInstance()
                .getReference("appointments")
                .child(id)
                .child("banned")
                .addListenerForSingleValueEvent(s);
    }

    @Override
    public void removeBansListener(StringSetValueListener s) {
        DatabaseSingleton
                .getAdaptedInstance()
                .getReference("appointments")
                .child(id)
                .child("banned")
                .removeEventListener(s);
    }

    @Override
    public void setPrivate(boolean isPrivate) {
        DatabaseSingleton
                .getAdaptedInstance()
                .getReference("appointments")
                .child(id)
                .child("private")
                .setValue(isPrivate);
    }

    @Override
    public void addInvite(User newParticipant) {
        DatabaseSingleton
                .getAdaptedInstance()
                .getReference("appointments")
                .child(id)
                .child("invites")
                .child(newParticipant.getId())
                .setValue(true);
    }

    @Override
    public void removeInvite(User participant) {
        DatabaseSingleton
                .getAdaptedInstance()
                .getReference("appointments")
                .child(id)
                .child("invites")
                .child(participant.getId())
                .setValue(null);
    }

    @Override
    public void addBan(User banned) {
        DatabaseSingleton
                .getAdaptedInstance()
                .getReference("appointments")
                .child(id)
                .child("banned")
                .child(banned.getId())
                .setValue(true);
    }

    @Override
    public void removeBan(User unbanned) {
        DatabaseSingleton
                .getAdaptedInstance()
                .getReference("appointments")
                .child(id)
                .child("banned")
                .child(unbanned.getId())
                .setValue(null);
    }

    @Override
    public void addInCallUser(User inCall) {
        DatabaseSingleton
                .getAdaptedInstance()
                .getReference("appointments")
                .child(id)
                .child("inCall")
                .child(inCall.getId())
                .setValue(false);
    }

    @Override
    public void muteUser(User user, boolean muted) {
        DatabaseSingleton
                .getAdaptedInstance()
                .getReference("appointments")
                .child(id)
                .child("inCall")
                .child(user.getId())
                .setValue(muted);
    }

    @Override
    public void removeOfCall(User outOfCall) {
        DatabaseSingleton
                .getAdaptedInstance()
                .getReference("appointments")
                .child(id)
                .child("inCall")
                .child(outOfCall.getId())
                .setValue(null);
    }

    @Override
    public void addInCallListener(BooleanChildListener listener) {
        DatabaseSingleton
                .getAdaptedInstance()
                .getReference("appointments")
                .child(id)
                .child("inCall")
                .addChildEventListener(listener);
    }

    @Override
    public void removeInCallListener(BooleanChildListener listener) {
        DatabaseSingleton
                .getAdaptedInstance()
                .getReference("appointments")
                .child(id)
                .child("inCall")
                .removeEventListener(listener);
    }

    @Override
    public void addMessage(Message message) {
        DatabaseSingleton
                .getAdaptedInstance()
                .getReference("appointments")
                .child(id)
                .child("messages")
                .push()
                .setValue(message);

    }

    @Override
    public void removeMessage(String key) {
        DatabaseSingleton
                .getAdaptedInstance()
                .getReference("appointments")
                .child(id)
                .child("messages")
                .child(key)
                .removeValue();
    }

    @Override
    public void editMessage(String key, String newContent) {
        DatabaseSingleton
                .getAdaptedInstance()
                .getReference("appointments")
                .child(id)
                .child("messages")
                .child(key)
                .child("content")
                .setValue(newContent);
    }

    @Override
    public void editMessageReaction(String key, int newContent) {
        DatabaseSingleton
                .getAdaptedInstance()
                .getReference("appointments")
                .child(id)
                .child("messages")
                .child(key)
                .child("reaction")
                .setValue(newContent);
    }

    @Override
    public void getMessageReaction_Once_AndThen(String key, LongValueListener listener) {
        DatabaseSingleton
                .getAdaptedInstance()
                .getReference("appointments")
                .child(id)
                .child("messages")
                .child(key)
                .child("reaction")
                .addListenerForSingleValueEvent(listener);
    }

    @Override
    public void addMessageListener(MessageChildListener listener) {
        DatabaseSingleton
                .getAdaptedInstance()
                .getReference("appointments")
                .child(id)
                .child("messages")
                .addChildEventListener(listener);
    }

    @Override
    public void removeMessageListener(MessageChildListener listener) {
        DatabaseSingleton
                .getAdaptedInstance()
                .getReference("appointments")
                .child(id)
                .child("messages")
                .removeEventListener(listener);
    }


    @Override
    public void getTimeCodeOnceAndThen(User user, LongValueListener listener) {
        DatabaseSingleton
                .getAdaptedInstance()
                .getReference("appointments")
                .child(id)
                .child("callStates")
                .child(user.getId())
                .child("timeCode")
                .addListenerForSingleValueEvent(listener);
    }


    @Override
    public void setTimeCode(User user, Long timeCode) {
        DatabaseSingleton
                .getAdaptedInstance()
                .getReference("appointments")
                .child(id)
                .child("callStates")
                .child(user.getId())
                .child("timeCode")
                .setValue(timeCode);
    }

    @Override
    public void selfDestroy() {
        getParticipantsId_Once_AndThen(participants -> {
            for(String userId : participants) {
                User user = new DatabaseUser(userId);
                user.removeAppointment(this);
            }

            DatabaseSingleton
                    .getAdaptedInstance()
                    .getReference("appointments")
                    .child(id).removeValue();
        });
    }

    @Override
    public void setOwner(User user) {
        DatabaseSingleton
                .getAdaptedInstance()
                .getReference("appointments")
                .child(id)
                .child("owner")
                .setValue(user.getId());
    }
}