масштабирование приложения углового пожарного депо путем привязки данных к каждому пользователю - PullRequest
2 голосов
/ 07 мая 2019

Я создал приложение, используя Angular 7 и crud with firestore. Все отлично работает с одним пользователем. Теперь я пытаюсь масштабировать его и связывать данные с каждым зарегистрированным пользователем. Я не могу найти подробный материал в Интернете.

У меня есть пользователи в коллекции. Я хочу создать коллекцию «отпусков» и поместить ее под каждого пользователя, для его коллекции отпусков. Я считаю, что первый шаг - это получить текущий зарегистрированный пользовательский uid и обновить любую функцию, которая у меня может быть, для редактирования коллекции, а затем .doc («текущий идентификатор пользователя»).

Это код, который я использовал для получения идентификатора текущего пользователя:

this.userID = this.firestore.collection('users').doc(this.auth().user.uid);

ошибки в прекомпиляторе:

1- Тип 'AngularFirestoreDocument <{}>' нельзя назначить типу 'Строка'

2 - Невозможно вызвать выражение, тип которого не имеет подписи вызова. Тип «AuthService» не имеет совместимых подписей вызовов.

В настоящее время структура данных такова:

enter image description here

Это служба авторизации:

export class AuthService {

  user$: Observable<User>;



  constructor(
        public afAuth: AngularFireAuth,
        public afs: AngularFirestore,
        public router: Router
  ) { 
    // Get the auth state, then fetch the Firestore user document or return null
    this.user$ = this.afAuth.authState.pipe(
      switchMap(user => {
          // Logged in
        if (user) {
          return this.afs.doc<User>(`users/${user.uid}`).valueChanges();
        } else {
          // Logged out
          return of(null);
        }
      })
    )
  }


  googleLogin() {
    const provider = new auth.GoogleAuthProvider()
    return this.oAuthLogin(provider);
  }

  public oAuthLogin(provider) {
    return this.afAuth.auth.signInWithPopup(provider)
      .then((credential) => {
        this.updateUserData(credential.user)
      })
  }

  public updateUserData(user) {
    // Sets user data to firestore on login
    const userRef: AngularFirestoreDocument<User> = this.afs.doc(`users/${user.uid}`);

    const data = { 
      uid: user.uid, 
      email: user.email, 
      displayName: user.displayName, 
      photoURL: user.photoURL
    } 
    return userRef.set(data, { merge: true })

  }
}

Ценю вашу помощь.

1 Ответ

0 голосов
/ 07 мая 2019

Googles официальный ответ можно найти здесь - Получить зарегистрированного пользователя - Firebase

Ниже приведена функция, которая возвращает обещание типа string. Обещание разрешается с помощью пользовательского uid, который возвращается из onAuthStateChangedwhich () вместе с остальной частью объекта аутентификации firebase пользователя (displayName ... и т. Д.).

getCurrentUser(): Promise<string> {
  var promise = new Promise<string>((resolve, reject) => {
    this.afAuth.auth.onAuthStateChanged(returnedUser => {
      if (returnedUser) {
        resolve(returnedUser.uid);
      } else {
        reject(null);
      }
    });
  })
  return promise
}

Вы бы назвали это в конструкторе или ngOninit:

userDoc: User = null;

constructor() {
  this.getCurrentUser().then((userID: string) => {
    //here you can use the id to get the users firestore doc 
    this.afs.collection('users').doc(userID).valueChanges()
    .subscribe(userFirestoreDoc => { // remember to subscribe
      this.userDoc = userFirestoreDoc;
    })
  }).catch(nullID => {
    //when there is not a current user
    this.userDoc = null
  }) 
}

Чтобы добавить коллекцию для «отпусков», вложенную в пользовательский документ, вам необходимо добавить подколлекцию в этот документ пользователя firestore. Я бы посоветовал делать это только тогда, когда пользователь получает / добавляет свой первый отпуск. Вы можете просто установить документ во вложенной коллекции, и если подколлекция еще не существует, Firestore сначала создаст его, а затем добавит новый документ (vaction), так что это единственный код, который вам нужен для установки новой коллекции и новой vaction внутри. это собрание.

this.afs.collection('users').doc(this.userDoc.uid).collection('vacations).add(vactionObject).then(returnedVaction => {

}).catch(error => {

})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...