Как структурировать правило firebase и извлекать данные, когда чтение истинно, а запись ложно? - PullRequest
0 голосов
/ 29 июня 2019

Я создаю простое веб-приложение crud, которое позволяет создавать назначенному пользователю, и как пользователь, входящий в систему, так и не пользователь может читать сохраненные сообщения. Интересно, как структурировать правило firebase для достижения этой цели?

Я проверил рекомендацию из этого поста: Firebase: как структурировать публичные / приватные данные пользователя и найти собственное решение, как показано ниже.

Я создал два узла: частный (пользователи) и общедоступный (посты), и на моем редуксе. Я дважды пытался записать данные как в частном, так и в открытом доступе, но получил отказ в доступе из базы данных.

Мой вопрос заключается в том, как обойти эту ошибку или есть лучший подход для ее устранения.

Спасибо

Мое правило пожарной базы:

{
    "rules": {
    "users": {
        "$user_id": {
            ".read": "$user_id === 'Set_User_Id'",
            ".write": "$user_id === 'Set_User_Id'",
                "posts": {
                "$post_id": {
                    ".validate": "newData.hasChildren(['title', 'postType', 'image', 'createdAt', 'note', 'link'])",
                        "title": {
                        ".validate": "newData.isString() && newData.val().length > 0"
                    },
                    "postType": {
                        ".validate": "newData.isString()"
                    },
                    "createdAt": {
                        ".validate": "newData.isNumber()"
                    },
                    "image": {
                        ".validate": "newData.isString()"
                    },
                    "link": {
                        ".validate": "newData.isString()"
                    },
                    "note": {
                        ".validate": "newData.isString()"
                    },
                    "$other": {
                        ".validate": false
                    }
                }
            }, 
            "$other": { 
                ".validate": false 
            }
        }
    },
        "posts": {
    ".read": true,
    "$user_id": {
        ".write": "$user_id === 'Set_User_Id'",
    }
  }
}

}

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

export const startAddPost = (postData = {}) => {
return (dispatch, getState) => {
    const uid = getState().auth.uid;
    const {
        title = '',
        postType = '',
        image = '',
        createdAt = 0,
        note = '',
        link = ''
    } = postData;
    const post = { title, postType, image, createdAt, note, link }

    return (
        database.ref(`users/${uid}/posts`).push(post).then((ref) => {
            dispatch(addPost({
                id: ref.key,
                ...post
            }))
        }) &&
        database.ref('posts').push(post).then((ref) => {
            dispatch(addPost({
                id: ref.key,
                ...post
            }))
        })
    )
}

}; * * тысяча двадцать-одна

...