131 lines
3.5 KiB
JavaScript
131 lines
3.5 KiB
JavaScript
/* global firebase */
|
|
|
|
/*
|
|
Firebase rule
|
|
|
|
{
|
|
"rules": {
|
|
".read": "auth != null",
|
|
"documents": {
|
|
"$documentId": {
|
|
"annotations": {
|
|
"$annotationId": {
|
|
".write": "auth.uid === newData.child('authorId').val() || auth.uid === data.child('authorId').val() || auth.uid === newData.child('parentAuthorId').val() || auth.uid === data.child('parentAuthorId').val()"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
|
|
"authors": {
|
|
"$authorId": {
|
|
".write": "auth.uid === $authorId"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
*/
|
|
|
|
(function() {
|
|
/* eslint-disable-next-line no-unused-vars */
|
|
class Server {
|
|
constructor() {
|
|
// Initialize server
|
|
const firebaseConfig = {
|
|
apiKey: 'AIzaSyACI5oR2Bh5FDXhTFNG0QJQmxtVXZaquSY',
|
|
authDomain: 'semiotic-pager-236718.firebaseapp.com',
|
|
databaseURL: 'https://semiotic-pager-236718.firebaseio.com',
|
|
projectId: 'semiotic-pager-236718',
|
|
storageBucket: 'semiotic-pager-236718.appspot.com',
|
|
messagingSenderId: '224191339954',
|
|
appId: '1:224191339954:web:707e0dc3d3bca0500c58ab',
|
|
};
|
|
|
|
firebase.initializeApp(firebaseConfig);
|
|
|
|
// Get references to database locations
|
|
this.authorsRef = firebase
|
|
.database()
|
|
.ref()
|
|
.child('authors');
|
|
}
|
|
|
|
// Custom bind function for authorization and data events
|
|
bind(action, callbackFunction) {
|
|
switch (action) {
|
|
case 'onAuthStateChanged':
|
|
firebase.auth().onAuthStateChanged(callbackFunction);
|
|
break;
|
|
case 'onAnnotationCreated':
|
|
this.annotationsRef.on('child_added', callbackFunction);
|
|
break;
|
|
case 'onAnnotationUpdated':
|
|
this.annotationsRef.on('child_changed', callbackFunction);
|
|
break;
|
|
case 'onAnnotationDeleted':
|
|
this.annotationsRef.on('child_removed', callbackFunction);
|
|
break;
|
|
default:
|
|
console.error('The action is not defined.');
|
|
break;
|
|
}
|
|
}
|
|
|
|
selectDocument(documentId) {
|
|
this.documentsRef = firebase
|
|
.database()
|
|
.ref()
|
|
.child('documents')
|
|
.child(documentId);
|
|
|
|
this.annotationsRef = this.documentsRef.child('annotations');
|
|
}
|
|
|
|
// Check if the author exists and open an appropriate popup
|
|
checkAuthor(authorId, openReturningAuthorPopup, openNewAuthorPopup) {
|
|
this.authorsRef.once('value', authors => {
|
|
if (authors.hasChild(authorId)) {
|
|
this.authorsRef.child(authorId).once('value', author => {
|
|
openReturningAuthorPopup(author.val().authorName);
|
|
});
|
|
} else {
|
|
openNewAuthorPopup();
|
|
}
|
|
});
|
|
}
|
|
|
|
// Sign in
|
|
signInAnonymously() {
|
|
firebase
|
|
.auth()
|
|
.signInAnonymously()
|
|
.catch(error => {
|
|
if (error.code === 'auth/operation-not-allowed') {
|
|
alert('You must enable Anonymous auth in the Firebase Console.');
|
|
} else {
|
|
console.error(error);
|
|
}
|
|
});
|
|
}
|
|
|
|
// Create/update/delete methods
|
|
createAnnotation(annotationId, annotationData) {
|
|
this.annotationsRef.child(annotationId).set(annotationData);
|
|
}
|
|
|
|
updateAnnotation(annotationId, annotationData) {
|
|
this.annotationsRef.child(annotationId).set(annotationData);
|
|
}
|
|
|
|
deleteAnnotation(annotationId) {
|
|
this.annotationsRef.child(annotationId).remove();
|
|
}
|
|
|
|
updateAuthor(authorId, authorData) {
|
|
this.authorsRef.child(authorId).set(authorData);
|
|
}
|
|
}
|
|
|
|
window.Server = Server;
|
|
})();
|