https://github.com/alextim/contact-form-firebase-functions
https://github.com/alextim/contact-form-firebase-functions
Last synced: 6 days ago
JSON representation
- Host: GitHub
- URL: https://github.com/alextim/contact-form-firebase-functions
- Owner: alextim
- Created: 2020-05-29T09:48:58.000Z (about 6 years ago)
- Default Branch: master
- Last Pushed: 2023-12-15T02:52:29.000Z (over 2 years ago)
- Last Synced: 2025-04-05T06:15:18.652Z (about 1 year ago)
- Language: JavaScript
- Size: 5.86 KB
- Stars: 0
- Watchers: 1
- Forks: 0
- Open Issues: 1
-
Metadata Files:
- Readme: readme.md
Awesome Lists containing this project
README
# Settings
## Firebase
- [Firebase Console](https://console.firebase.google.com)
- [Cloud Console - Functions](https://console.cloud.google.com/functions)
**Important:** Firebase Hosting supports Cloud Functions in us-central1 only (2020).
### Database
#### Add
#### Rules
```
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
function isSignedIn() {
return true || request.auth.uid != null;
}
function existingData() {
return resource.data;
}
function incomingData() {
return request.resource.data;
}
function validateEmail() {
return incomingData().email is string && incomingData().email.size() > 2 && incomingData().email.size() <= 254;
}
function validateName() {
return incomingData().name is string && incomingData().name.size() > 1 && incomingData().name.size() <= 40;
}
function validateMessage() {
return incomingData().message is string && incomingData().message.size() > 1 && incomingData().message.size() <= 256;
}
function validateData() {
return validateName() && validateEmail() && validateMessage();
}
match /emails/{document=**} {
allow read, delete, update: if isSignedIn();
allow create: if validateData();
}
}
}
```
## GMail
### Common
[Check Gmail through other email platforms](https://support.google.com/mail/answer/7126229)
### Troubleshooting
* [Enable less secure app access](https://myaccount.google.com/lesssecureapps)
* [Unlock Captcha](https://accounts.google.com/b/0/displayunlockcaptcha)
# Production
## index.js
1. EMAIL_FIELD 'tvtqk' -> 'your-field'
1. ALLOWED_ORIGIN '*' -> 'your-domain'
## Deploy
```
> cd functions
> firebase login
> firebase deploy
```
after modifications
```
> firebase deploy --only functions
```
# To-Do
1. [ ] function isSpam -> request.body.contans( || )
1. [ ] js -> ts
1. [ ] then -> async/await + try/catch
---
# Inspired by
- https://stackoverflow.com/questions/24098461/nodemailer-gmail-what-exactly-is-a-refresh-token-and-how-do-i-get-one/24123550
- https://masashi-k.blogspot.com/2013/06/sending-mail-with-gmail-using-xoauth2.html
- https://blog.mailtrap.io/nodemailer-gmail/
Database Rules
- https://fireship.io/snippets/firestore-rules-recipes/
- https://stackoverflow.com/questions/51916848/achieving-granular-data-validation-in-firestore-document?rq=1
- https://softauthor.com/firestore-security-rules