Zephyros
Zephyros

Reputation: 77

Firebase creator of room becomes admin of that room

As mentioned in the title, I want to allow the user that created the room to become an admin of that room, allowing him to update the details of that room or invite other users.I have gone through some database security rules tutorial and I still don't understand how it works. The closest thing i have found is this link:

Defining the User roles in Firebase

I tried and it still couldn't work, do i need so make a new table or something? Can someone explain to me how it works or how do I achieve it?My database

EDITED 1: Added Main and Add activity

EDITED 2: Added Team and TeamList class

AddActivity

public class AddActivity extends AppCompatActivity {

private FirebaseAuth firebaseAuth;

EditText editTextName;
Spinner spinnerSport;
Button buttonAddTeam;

List<Team> teams;

DatabaseReference databaseTeams;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_add);

    firebaseAuth = FirebaseAuth.getInstance();

    if(firebaseAuth.getCurrentUser() == null){

        finish();

        startActivity(new Intent(this, SignInActivity.class));
    }

    databaseTeams = FirebaseDatabase.getInstance().getReference("teams");

    editTextName = (EditText) findViewById(R.id.editTextName);
    spinnerSport = (Spinner) findViewById(R.id.spinnerSports);

    buttonAddTeam = (Button) findViewById(R.id.buttonAddTeam);

    teams = new ArrayList<>();


    buttonAddTeam.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

            addTeam();

            Intent myIntent = new Intent(AddActivity.this,
                    MainActivity.class);
            startActivity(myIntent);
        }
    });
}



private void addTeam() {

    String name = editTextName.getText().toString().trim();
    String sport = spinnerSport.getSelectedItem().toString();

    FirebaseUser user = firebaseAuth.getCurrentUser();
    user.getUid();

    if (!TextUtils.isEmpty(name)) {

        String id = databaseTeams.push().getKey();
        String owner = user.getUid();

        Team team = new Team(id, name, sport, owner);

        databaseTeams.child(id).setValue(team);

        editTextName.setText("");

        Toast.makeText(this, "Team added", Toast.LENGTH_LONG).show();
    } else {

        Toast.makeText(this, "Please enter a name", Toast.LENGTH_LONG).show();
    }
}
}

MainActivity

public class MainActivity extends AppCompatActivity {
public static final String TEAM_NAME = "com.example.user.stfv2.teamname";
public static final String TEAM_ID = "com.example.user.stfv2.teamid";

private FirebaseAuth firebaseAuth;

EditText editTextName;
Spinner spinnerSport;
Button buttonAddTeam;
ListView listViewTeams;


List<Team> teams;


DatabaseReference databaseTeams;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);


    firebaseAuth = FirebaseAuth.getInstance();


    if(firebaseAuth.getCurrentUser() == null){

        finish();

        startActivity(new Intent(this, SignInActivity.class));
    }


    FirebaseUser user = firebaseAuth.getCurrentUser();

    databaseTeams = FirebaseDatabase.getInstance().getReference("teams");


    editTextName = (EditText) findViewById(R.id.editTextName);
    spinnerSport = (Spinner) findViewById(R.id.spinnerSports);
    listViewTeams = (ListView) findViewById(R.id.listViewTeams);

    buttonAddTeam = (Button) findViewById(R.id.buttonAddTeam);


    teams = new ArrayList<>();


    buttonAddTeam.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Intent myIntent = new Intent(MainActivity.this,
                    AddActivity.class);
            startActivity(myIntent);
        }
    });


    listViewTeams.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {

            Team team = teams.get(i);

            Intent intent = new Intent(getApplicationContext(), TeamActivity.class);

            intent.putExtra(TEAM_ID, team.getTeamId());
            intent.putExtra(TEAM_NAME, team.getTeamName());


            startActivity(intent);
        }
    });

    listViewTeams.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
        @Override
        public boolean onItemLongClick(AdapterView<?> adapterView, View view, int i, long l) {
            Team team = teams.get(i);
            showUpdateDeleteDialog(team.getTeamId(), team.getTeamName());
            return true;
        }
    });


}

private void showUpdateDeleteDialog(final String teamId, String teamName) {

    AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(this);
    LayoutInflater inflater = getLayoutInflater();
    final View dialogView = inflater.inflate(R.layout.update_dialog, null);
    dialogBuilder.setView(dialogView);

    final EditText editTextName = (EditText) dialogView.findViewById(R.id.editTextName);
    final Spinner spinnerSport = (Spinner) dialogView.findViewById(R.id.spinnerSports);
    final Button buttonUpdate = (Button) dialogView.findViewById(R.id.buttonUpdateTeam);
    final Button buttonDelete = (Button) dialogView.findViewById(R.id.buttonDeleteTeam);

    dialogBuilder.setTitle(teamName);
    final AlertDialog b = dialogBuilder.create();
    b.show();


    buttonUpdate.setOnClickListener(new View.OnClickListener() {

        FirebaseUser user = firebaseAuth.getCurrentUser();

        @Override
        public void onClick(View view) {
            String name = editTextName.getText().toString().trim();
            String sport = spinnerSport.getSelectedItem().toString();
            String owner = user.getUid();

            if (!TextUtils.isEmpty(name)) {
                updateTeam(teamId, name, sport, owner);
                b.dismiss();
            }
        }
    });


    buttonDelete.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

            deleteTeam(teamId);
            b.dismiss();
        }
    });
}

private boolean updateTeam(String id, String name, String sport, String owner) {

    DatabaseReference dR = FirebaseDatabase.getInstance().getReference("teams").child(id);


    Team team = new Team(id, name, sport, owner);
    dR.setValue(team);
    Toast.makeText(getApplicationContext(), "Team Updated", Toast.LENGTH_LONG).show();
    return true;
}

private boolean deleteTeam(String id) {

    DatabaseReference dR = FirebaseDatabase.getInstance().getReference("teams").child(id);


    dR.removeValue();


    DatabaseReference drTracks = FirebaseDatabase.getInstance().getReference("tracks").child(id);


    drTracks.removeValue();
    Toast.makeText(getApplicationContext(), "Team Deleted", Toast.LENGTH_LONG).show();

    return true;
}

@Override
protected void onStart() {
    super.onStart();

    databaseTeams.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {


            teams.clear();


            for (DataSnapshot postSnapshot : dataSnapshot.getChildren()) {

                Team team = postSnapshot.getValue(Team.class);

                teams.add(team);
            }


            TeamList teamAdapter = new TeamList(MainActivity.this, teams);

            listViewTeams.setAdapter(teamAdapter);
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.menu_main, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {

    switch (item.getItemId()) {
        case R.id.action_logout:

            firebaseAuth.signOut();

            finish();

            startActivity(new Intent(this, SignInActivity.class));
            return true;
        default:
            return super.onOptionsItemSelected(item);
    }
}


}

Team.java:

package com.example.user.stfv2;

import com.google.firebase.database.IgnoreExtraProperties;

@IgnoreExtraProperties
public class Team {
private String teamId;
private String teamName;
private String teamSport;
private String teamOwner;


public Team(String teamId, String teamName, String teamSport, String teamOwner) {
    this.teamId = teamId;
    this.teamName = teamName;
    this.teamSport = teamSport;
    this.teamOwner = teamOwner;
}

public String getTeamId() {return teamId;}

public String getTeamName() {
    return teamName;
}

public String getTeamSport() {
    return teamSport;
}
//this method is never used, i don't know where to use it
public String getTeamOwner() { return  teamOwner; }
}

TeamList.java

public class TeamList extends ArrayAdapter<Team> {
private Activity context;
List<Team> teams;

public TeamList(Activity context, List<Team> teams) {
    super(context, R.layout.layout_team_list, teams);
    this.context = context;
    this.teams = teams;
}


@Override
public View getView(int position, View convertView, ViewGroup parent) {
    LayoutInflater inflater = context.getLayoutInflater();
    View listViewItem = inflater.inflate(R.layout.layout_team_list, null, true);

    TextView textViewName = (TextView) listViewItem.findViewById(R.id.textViewName);
    TextView textViewSport = (TextView) listViewItem.findViewById(R.id.textViewSport);

    Team team = teams.get(position);
    textViewName.setText(team.getTeamName());
    textViewSport.setText(team.getTeamSport());

    return listViewItem;
}
}

Upvotes: 0

Views: 100

Answers (1)

user3476154
user3476154

Reputation:

If your room only has one admin you can use this. With $uid being the uid of the user that created the room.

db structure:

root: {
  sportsteamfinder: {
    teams: {
      $team: {
        teamId: $team,
        teamOwner: $uid,
        teamName: henq,
        teamSport: Football
      }
    }
  }
}

With the following rules:

{
  "rules": {
    "sportsteamfinder": {
      "teams": {
        "$team": {
          ".write": "data.child('teamOwner').val() === auth.uid || !data.exists()"
        }
      }
    }
  }
}

Or, if you want multiple admins per room. Again with $uid and $uid2 being the ID's of the admins.

db structure:

root: {
  sportsteamfinder: {
    teams: {
      $team: {
        teamId: $team,
        teamAdmins: {
          $uid: true,
          $uid2: true
        },
        teamName: henq,
        teamSport: Football
      }
    }
  }
}

With the following rules:

{
  "rules": {
    "sportsteamfinder": {
      "teams": {
        "$team": {
          ".write": "data.child('teamAdmins/'+auth.uid).exists() || !data.exists()"
        }
      }
    }
  }
}

Upvotes: 1

Related Questions