Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
225 changes: 100 additions & 125 deletions Firestore/firestore.rules
Original file line number Diff line number Diff line change
Expand Up @@ -349,8 +349,8 @@ service cloud.firestore {
}

function validAffectedFields(){
return (isTheRenter() && request.resource.data.diff(resource.data).affectedKeys().hasOnly(['renterArrived','renterAdmitDamage','renterConfirmHandover', 'renterAcceptCompensationPrice', 'renterMediaOK', 'renterMediaUrls'])) ||
(isTheToolOwner() && request.resource.data.diff(resource.data).affectedKeys().hasOnly(['ownerArrived','toolDamaged','ownerConfirmHandover', 'compensationPrice', 'ownerMediaOK', 'ownerMediaUrls']))
return (isTheRenter() && request.resource.data.diff(resource.data).affectedKeys().hasOnly(['renterArrived','renterAdmitDamage','renterConfirmHandover', 'renterMediaOK', 'renterMediaUrls'])) ||
(isTheToolOwner() && request.resource.data.diff(resource.data).affectedKeys().hasOnly(['ownerArrived','toolDamaged','ownerConfirmHandover', 'ownerMediaOK', 'ownerMediaUrls']))
}

function onlyAllow(list){
Expand All @@ -362,146 +362,121 @@ service cloud.firestore {
request.resource.data.renterConfirmHandover is bool &&
request.resource.data.renterMediaOK is bool &&
(request.resource.data.renterAdmitDamage is bool || request.resource.data.renterAdmitDamage == null) &&
(request.resource.data.renterAcceptCompensationPrice is bool || request.resource.data.renterAcceptCompensationPrice == null) &&
request.resource.data.renterMediaUrls is list &&

request.resource.data.ownerArrived is bool &&
request.resource.data.ownerConfirmHandover is bool &&
request.resource.data.ownerMediaOK is bool &&
(request.resource.data.toolDamaged is bool || request.resource.data.toolDamaged == null) &&
(request.resource.data.compensationPrice is float || request.resource.data.compensationPrice == null) &&
request.resource.data.ownerMediaUrls is list;
}

function areRenterUpdatesValid() {
return ((resource.data.disagreementCaseSettled != null)
? (resource.data.disagreementCaseSettled == false)
?
// 👮⏳
false //allowNothing()
:
// 👮✅
(bothArrived() == true)
?
// 🤝 both arrived
(resource.data.disagreementCaseResult == true)
?
// 👮💔
(resource.data.compensationPrice != null)
? (resource.data.renterAcceptCompensationPrice == true)
? onlyAllow(['renterArrived', 'renterAcceptCompensationPrice', 'renterConfirmHandover'])
: onlyAllow(['renterArrived', 'renterAcceptCompensationPrice'])
: onlyAllow(['renterArrived'])
:
// 👮💖
onlyAllow(['renterArrived', 'renterConfirmHandover'])
:
// 🧍 didn't both arrive
return (resource.data.disagreementCaseSettled != null) ?
(resource.data.disagreementCaseSettled == false) ?
// 👮⏳ Disagreement case still processing
false
:
// 👮✅
(bothArrived() == true) ?
// 🤝 both arrived
onlyAllow(['renterArrived', 'renterConfirmHandover'])
:
// 🧍 didn't both arrive
onlyAllow(['renterArrived'])
// }
// }
:
// No disagreement case
(bothArrived() == false) ?
// 🧍
onlyAllow(['renterArrived'])
:
// 🤝 bothArrived
(resource.data.toolDamaged == null) ?
// ❓ Tool unchecked
onlyAllow(['renterArrived'])
:
(resource.data.toolDamaged == true) ?
// 💔 Tool Damaged
(resource.data.renterAdmitDamage != null) ?
// Renter responded to claims
(resource.data.renterAdmitDamage == true) ?
// 😞 Admit damage
onlyAllow(['renterArrived'])
: (bothArrived() == false)
?
// 🧍
onlyAllow(['renterArrived'])
:
// 😡 Deny damage
(resource.data.renterMediaOK == true) ?
onlyAllow(['renterArrived', 'renterAdmitDamage', 'renterMediaOK'])
:
onlyAllow(['renterArrived', 'renterAdmitDamage', 'renterMediaUrls', 'renterMediaOK'])
// }
// }
:
// 🤝
(resource.data.toolDamaged == null)
?
// ❓ Tool unchecked
onlyAllow(['renterArrived'])
: (resource.data.toolDamaged == true)
?
// 💔 Tool Damaged
(resource.data.renterAdmitDamage != null)
?
// Renter responded to claims
(resource.data.renterAdmitDamage == true)
?
// 😞 Admit damage
(resource.data.compensationPrice != null)
? (resource.data.renterAcceptCompensationPrice== true)
? onlyAllow([
'renterArrived',
'renterAdmitDamage',
'renterAcceptCompensationPrice',
'renterConfirmHandover',
])
: onlyAllow([
'renterArrived',
'renterAdmitDamage',
'renterAcceptCompensationPrice',
])
: onlyAllow(['renterArrived', 'renterAdmitDamage'])
:
// 😡 Deny damage
(resource.data.renterMediaOK == true)
? onlyAllow(['renterArrived', 'renterAdmitDamage', 'renterMediaOK'])
: onlyAllow(['renterArrived', 'renterAdmitDamage', 'renterMediaUrls', 'renterMediaOK'])
:
// Renter hasn't responded to claims yet
onlyAllow(['renterArrived', 'renterAdmitDamage'])
:
// 💖 Tool Undamaged
onlyAllow(['renterArrived', 'renterConfirmHandover'])
);
// Renter hasn't responded to claims yet
onlyAllow(['renterArrived', 'renterAdmitDamage'])
// }
:
// 💖 Tool Undamaged
onlyAllow(['renterArrived', 'renterConfirmHandover']);
// }
// }
// }
// }
}

function areOwnerUpdatesValid() {
return ((resource.data.disagreementCaseSettled != null)
? (resource.data.disagreementCaseSettled == false)
?
// 👮⏳
false //allowNothing()
:
// 👮✅
(bothArrived() == true)
?
// 🤝 both arrived
(resource.data.disagreementCaseResult == true)
?
// 👮💔
(resource.data.renterAcceptCompensationPrice != null && resource.data.renterAcceptCompensationPrice == true)
? onlyAllow(['ownerArrived', 'ownerConfirmHandover'])
: onlyAllow(['ownerArrived', 'compensationPrice'])
:
// 👮💖
onlyAllow(['ownerArrived', 'ownerConfirmHandover'])
return (resource.data.disagreementCaseSettled != null) ?
(resource.data.disagreementCaseSettled == false) ?
// 👮⏳ Disagreement case still processing
false
:
// 👮✅
(bothArrived() == true) ?
// 🤝 both arrived
onlyAllow(['ownerArrived', 'ownerConfirmHandover'])
:
// 🧍 didn't both arrive
onlyAllow(['ownerArrived'])
// }
// }
:
// No disagreement case
(bothArrived() == false) ?
// 🧍
onlyAllow(['ownerArrived'])
:
// 🤝
(resource.data.toolDamaged == null) ?
// ❓ Tool unchecked
onlyAllow(['ownerArrived', 'toolDamaged'])
:
(resource.data.toolDamaged == true) ?
// 💔 Tool Damaged
(resource.data.renterAdmitDamage != null) ?
// Renter responded to claims
(resource.data.renterAdmitDamage == true) ?
// 😞 Admit damage
onlyAllow(['ownerArrived', 'toolDamaged'])
:
// 😡 Deny damage
(resource.data.ownerMediaOK == true) ?
onlyAllow(['ownerArrived', 'toolDamaged', 'ownerMediaOK'])
:
// 🧍 didn't both arrive
onlyAllow(['ownerArrived'])
: (bothArrived() == false)
?
// 🧍
onlyAllow(['ownerArrived'])
onlyAllow(['ownerArrived', 'toolDamaged', 'ownerMediaUrls', 'ownerMediaOK'])
// }
// }
:
// 🤝
(resource.data.toolDamaged == null)
?
// ❓ Tool unchecked
onlyAllow(['ownerArrived', 'toolDamaged'])
: (resource.data.toolDamaged == true)
?
// 💔 Tool Damaged
(resource.data.renterAdmitDamage != null)
?
// Renter responded to claims
(resource.data.renterAdmitDamage == true)
?
// 😞 Admit damage
(resource.data.renterAcceptCompensationPrice != null && resource.data.renterAcceptCompensationPrice == true)
? onlyAllow(['ownerArrived', 'toolDamaged', 'compensationPrice', 'ownerConfirmHandover'])
: onlyAllow(['ownerArrived', 'toolDamaged', 'compensationPrice'])
:
// 😡 Deny damage
(resource.data.ownerMediaOK == true)
? onlyAllow(['ownerArrived', 'toolDamaged', 'ownerMediaOK'])
: onlyAllow(['ownerArrived', 'toolDamaged', 'ownerMediaUrls', 'ownerMediaOK'])
:
// Renter hasn't responded to claims yet
onlyAllow(['ownerArrived', 'toolDamaged'])
:
// 💖 Tool Undamaged
onlyAllow(['ownerArrived', 'toolDamaged', 'ownerConfirmHandover'])
);
// Renter hasn't responded to claims yet
onlyAllow(['ownerArrived', 'toolDamaged'])
// }
:
// 💖 Tool Undamaged
onlyAllow(['ownerArrived', 'toolDamaged', 'ownerConfirmHandover']);
// }
// }
// }
// }
}

allow read, write: if isAdmin();
Expand Down
2 changes: 0 additions & 2 deletions functions/src/deliver_meetings.ts
Original file line number Diff line number Diff line change
Expand Up @@ -364,8 +364,6 @@ async function startRent(
'renterArrived': false,
'toolDamaged': null,
'renterAdmitDamage': null,
'compensationPrice': null,
'renterAcceptCompensationPrice': null,
'ownerConfirmHandover': false,
'renterConfirmHandover': false,
'disagreementCaseID': null,
Expand Down
39 changes: 22 additions & 17 deletions functions/src/return_meeting.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,16 @@ async function returnMeetingHandler(change: functions.Change<functions.firestore
const newData = change.after.data();
const oldData = change.before.data();

if(newData.disagreementCaseResult == true){
return endRent(
toolID,
requestID,
newData.ownerUID,
newData.renterUID,
change.after.ref,
);
}

// if renterArrived CHANGED to `false` set everything that comes after it to false
if (!oldData.renterArrived && newData.renterArrived) {
// same for other fields
Expand All @@ -20,13 +30,11 @@ async function returnMeetingHandler(change: functions.Change<functions.firestore
// if there is a disagreement case don't change `renterAdmitDamage` and `renterMediaOK`
// because 1- changing them won't change anythin 2- they must be `false` and `true` respectively for a disagreement case to have been created
updates = {
'renterAcceptCompensationPrice': null,
'renterConfirmHandover': false,
};
} else {
updates = {
'renterAdmitDamage': null,
'renterAcceptCompensationPrice': null,
'renterMediaOK': false,
'renterConfirmHandover': false,
};
Expand All @@ -41,13 +49,11 @@ async function returnMeetingHandler(change: functions.Change<functions.firestore
// if there is a disagreement case don't change `toolDamaged` and `ownerMediaOK`
// because 1- changing them won't change anythin 2- they must be both `true` for a disagreement case to have been created
updates = {
'compensationPrice': null,
'ownerConfirmHandover': false,
};
} else {
updates = {
'toolDamaged': null,
'compensationPrice': null,
'ownerMediaOK': false,
'ownerConfirmHandover': false,
};
Expand Down Expand Up @@ -85,11 +91,14 @@ async function returnMeetingHandler(change: functions.Change<functions.firestore
}
}

const compensationPriceChanged = oldData.compensationPrice != newData.compensationPrice;
if (compensationPriceChanged) {
await change.after.ref.update({
'renterAcceptCompensationPrice': null,
});
if (newData.renterAdmitDamage) {
return endRent(
toolID,
requestID,
newData.ownerUID,
newData.renterUID,
change.after.ref,
);
}

const ownerConfirmedHO = !oldData.ownerConfirmHandover && newData.ownerConfirmHandover;
Expand All @@ -103,7 +112,6 @@ async function returnMeetingHandler(change: functions.Change<functions.firestore
requestID,
newData.ownerUID,
newData.renterUID,
newData.compensationPrice,
change.after.ref,
);
}
Expand All @@ -117,28 +125,25 @@ async function endRent(
requestID: string,
ownerUID: string,
renterUID: string,
compensationPrice: number = 0,
returnMeetingDoc: FirebaseFirestore.DocumentReference<FirebaseFirestore.DocumentData>,
) {
// calculate total - and process payment
const requestDoc = admin.firestore().doc(`Tools/${toolID}/requests/${requestID}`);
const requstData = (await requestDoc.get()).data()!;

const insuranceAmount = requstData.insuranceAmount;
if (typeof compensationPrice == 'undefined') compensationPrice = 0;

const total_to_renter = insuranceAmount - compensationPrice;
const total_to_owner = compensationPrice;
const total_to_renter = 0;
const total_to_owner = insuranceAmount;

if (total_to_renter > 0) {
const payment_type = compensationPrice > 0 ?
'refund_some_insurance_to_renter' :
'refund_all_insurance_to_renter';
const payment_type = 'refund_all_insurance_to_renter';

const deliveryPaymentProcessingDoc = await admin.firestore()
.doc(`Tools/${toolID}/deliver_meetings/${requestID}/private/payments_processing`).get();

const renter_payment_ids = deliveryPaymentProcessingDoc.data()?.renter_payment_ids;

if (typeof renter_payment_ids == 'object') {
for (const id in renter_payment_ids) {
if (Object.prototype.hasOwnProperty.call(renter_payment_ids, id)) {
Expand Down
Loading