Как создать сервис для использования пользовательского uid при получении данных из firestore?Угловой / Firestore - PullRequest
0 голосов
/ 10 февраля 2019

Мне нужно получить данные из пожарного хранилища, используя uid пользователя, потому что я храню данные (детали) по следующему пути в пожарном хранилище: drills / [user.uid] / userDrills / [drill.id]

Iреализовано хранение данных с помощью uid, потому что я хотел, чтобы каждый пользователь имел доступ только к своим данным (упражнения).До того, как я это реализовал, у меня был один файл службы детализации, который содержал все методы CRUD для firestore, однако я не смог вовремя получить идентификатор пользователя из состояния auth, чтобы вставить его в запрос.Даже получение идентификатора пользователя в конструкторе сервиса не сработало.

Мое решение на данный момент - не использовать сервис.Это означает, что мне нужно получить пользовательский uid в трех разных компонентах (список, редактирование / удаление и новый) ...

У кого-нибудь есть решение для этого?Есть ли лучший способ получить UID, а затем выполнить запрос?Если нет, то будет ли лучшим решением просто управлять правами пользователей в firestore путем создания правил?

import { Component, OnInit } from '@angular/core';
import {Observable} from 'rxjs';
import { map } from 'rxjs/operators';

import {AngularFireAuth} from "@angular/fire/auth";
import {AngularFirestore, AngularFirestoreCollection} from 
 "@angular/fire/firestore";
import {Drill} from "../drill.model";

@Component({
  selector: 'app-drill-list',
  templateUrl: './drill-list.component.html',
  styleUrls: ['./drill-list.component.css']
})


export class DrillListComponent implements OnInit {

  drills: Observable<any[]>;
  drillsCollection: AngularFirestoreCollection<Drill>;
  userId: any;

  constructor(private afAuth: AngularFireAuth,
              private afs: AngularFirestore) { }

 ngOnInit() {
   this.afAuth.authState
    .subscribe((data) => {
      this.userId = data.uid;
      this.drillsCollection = this.afs.collection('drills/' + this.userId + '/userDrills',
          ref => ref.orderBy('title', 'asc'));
      this.drills = this.getDrills();
    });

}

 getDrills(): Observable<Drill[]> {
   return this.drillsCollection.snapshotChanges().pipe(map(actions => {
      return actions.map(a => {
         const data = a.payload.doc.data() as Drill;
         const id = a.payload.doc.id;
         return { id, ...data};
      });
    }));
  }

}

1 Ответ

0 голосов
/ 10 февраля 2019

Я добился этого, сохранив UID в наблюдаемой службе аутентификации.Я использую метод "fetchUid", чтобы передать и отфильтровать ложные значения, и чтобы отменить поток, просто используйте оператор, такой как оператор "first".

Что-то вроде:

// in auth service
private uidSubject = new BehaviorSubject(null);
private uid$ = this.uidSubject.asObservable();

fetchUid() {
    return this.uid$.pipe(
        filter(v => v), // only allows the non falsy value through
        first(), // cancels stream after first
    );
}

// component
ngOnInit() {
    this.authService.fetchUid().pipe(
        // do stuff with uid
    ); // handle subscribe if needed
}
...