2015-12-14 3 views
2

Я создал правило, используя компилятор Firebase Bolt.Могу ли я создать свойство даты, если пользователь не отправил?

// ####### Root 

path/{ 
    read() = true; 
    write() = false; 
} 

// ######## USERS PHOTOS 
// Allow anyone to read the list of Photos. 
path /users_photos { 
    read() = true; 
} 

// All individual Photos are writable by anyone. 
path /users_photos/$id is Photos { 
    write() = isSignedIn(); 
} 

type Photos { 
    image: String, 
    user_id: String, 
    removed: Boolean, 
    dt_created: InitialTimestamp, 
    dt_updated: CurrentTimestamp 
} 


type CurrentTimestamp extends Number { 
    validate() = this == now; 
} 

type InitialTimestamp extends Number { 
    validate() = initial(this, now); 
} 


// 
// Helper Functions 
// 
isSignedIn() = auth != null; 
// Returns true if the value is intialized to init, or retains it's prior 
// value, otherwise. 
initial(value, init) = value == (prior(value) == null ? init : prior(value)); 

Ref: https://github.com/firebase/bolt/blob/master/docs/guide.md

Мой сценарий:

/*Upload*/ 
VigiApp.controller('UploadController', ['$scope', 'Upload', '$timeout', 'FirebaseURL', function ($scope, Upload, $timeout, FirebaseURL) { 
    // upload on file select or drop 
    $scope.upload = function (file, id) { 
     $('.page-spinner-bar').removeClass('ng-hide hide').addClass('ng-show show'); 

     id = typeof id !== 'undefined' ? id : null; 
     Upload.base64DataUrl(file).then(function(base64){ 
      //auth 
      var fbAuth = FirebaseURL.getAuth(); 
      //Ref 
      var usersPhotosRef = FirebaseURL.child("users_photos"); 
      usersPhotosRef.push({'image': base64,'removed': true, 'user_id': fbAuth.uid}, function(error){ 
       if (error) { 
        alert('Error: Something went wrong when creating your post please try again'); 
       } else { 
        var newID = usersPhotosRef.key(); 
        if(id !== null){ 
         $('#'+id).css("background-image", "url('"+base64+"')"); 
         $('#'+id).css("background-size", "100% 100%"); 
        } 
       } 

       $('.page-spinner-bar').removeClass('ng-show show').addClass('ng-hide hide'); 
      }); 
     }); 
    }  
}]); 

Compile ...

>firebase-bolt mmgv-vigiapp.bolt -o rules.json 
bolt: Generating rules.json... 

И развернуть ...

>firebase deploy:rules 

=== Deploying to 'vivid-heat-2144'... 

i deploying rules 

+ Deploy complete! 

Dashboard: https://vivid-heat-2144.firebaseio.com 

Но я получаю сообщение об ошибке:

FIREBASE WARNING: set at /users_photos/-K5VL1m04oF8s2xp8oTf failed: permission_denied 

правила, созданные:

{ 
    "rules": { 
    ".read": "true", 
    "users_photos": { 
     ".read": "true", 
     "$id": { 
     ".validate": "newData.hasChildren(['image', 'user_id', 'removed', 'dt_created', 'dt_updated'])", 
     "image": { 
      ".validate": "newData.isString()" 
     }, 
     "user_id": { 
      ".validate": "newData.isString()" 
     }, 
     "removed": { 
      ".validate": "newData.isBoolean()" 
     }, 
     "dt_created": { 
      ".validate": "newData.isNumber() && newData.val() == (data.val() == null ? now : data.val())" 
     }, 
     "dt_updated": { 
      ".validate": "newData.isNumber() && newData.val() == now" 
     }, 
     "$other": { 
      ".validate": "false" 
     }, 
     ".write": "auth != null" 
     } 
    } 
    } 
} 

Когда я удалить дату, это работает.

... 
type Photos { 
    image: String, 
    user_id: String, 
    removed: Boolean, 
} 
... 

Как я могу создать дату создания и обновление? Где моя ошибка?

+2

Используете ли вы созданную firebase метку времени (Firebase.ServerValue.TIMESTAMP) для дат создания и обновления? –

+0

Да, я пытаюсь =) это возможно? –

+0

Лично я использую <= вместо == для сравнения временных меток. Но можете ли вы проверить, работает ли он, когда вы используете только дату создания или обновление? Может быть, это всего лишь одна из двух, которая создает проблемы. –

ответ

2

При добавлении фото, вы передаете эту информацию:

usersPhotosRef.push({'image': base64,'removed': true, 'user_id': fbAuth.uid} 

Ваших правила безопасности требуют этих свойств:

".validate": "newData.hasChildren(['image', 'user_id', 'removed', 'dt_created', 'dt_updated'])", 

Там нет никакой магии «значения по умолчанию» для dt_created и dt_updated , поэтому вам необходимо передать их из вашего кода приложения:

usersPhotosRef.push({ 
    'image': base64, 
    'removed': true, 
    'user_id': fbAuth.uid, 
    'dt_created': Firebase.ServerValue.TIMESTAMP, 
    'dt_updated': Firebase.ServerValue.TIMESTAMP 
} 

Поскольку этот фрагмент добавляет новую запись, dt_created и dt_updated имеют одинаковое значение. Когда вы обновляете запись, вам нужно только установить dt_updated.