Skip to content
This repository was archived by the owner on Feb 6, 2024. It is now read-only.

Commit bbfb515

Browse files
authored
Merge pull request #4 from deckgo/master
[GSF] Syncing Fork
2 parents 046e2ca + 63de1ff commit bbfb515

36 files changed

+906
-180
lines changed

CHANGELOG.md

+12-2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,14 @@
1-
<a name="1.0.0-rc.11"-2></a>
1+
<a name="1.0.0-rc.12"></a>
2+
# [1.0.0-rc.12](https://github.com/deckgo/deckdeckgo/compare/v1.0.0-rc.11-2...v1.0.0-12) (2019-09-08)
3+
4+
### Applications
5+
* studio: v1.0.0-beta.3 ([CHANGELOG](https://github.com/deckgo/deckdeckgo/blob/master/studio/CHANGELOG.md))
6+
7+
### Others
8+
9+
* cloud: v1.0.0-beta.1 ([CHANGELOG](https://github.com/deckgo/deckdeckgo/blob/master/cloud/CHANGELOG.md))
10+
11+
<a name="1.0.0-rc.11-2"></a>
212
# [1.0.0-rc.11-2](https://github.com/deckgo/deckdeckgo/compare/v1.0.0-rc.11-1...v1.0.0-11-2) (2019-09-04)
313

414
### Web Components
@@ -11,7 +21,7 @@
1121

1222
* starter kit: v1.0.0-rc.1-3 ([CHANGELOG](https://github.com/deckgo/deckdeckgo-starter/blob/master/CHANGELOG.md))
1323

14-
<a name="1.0.0-rc.11"-1></a>
24+
<a name="1.0.0-rc.11-1"></a>
1525
# [1.0.0-rc.11-1](https://github.com/deckgo/deckdeckgo/compare/v1.0.0-rc.11...v1.0.0-11-1) (2019-09-02)
1626

1727
### Others

README.md

+6-6
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ Cherry on the cake 🍒🎂 [DeckDeckGo] comes with a [Progressive Web App](http
88

99
- [Getting Started](#getting-started)
1010
- [Documentation](#documentation)
11-
- [Example](#example)
11+
- [Contributing](#contributing)
1212
- [Progressive Web Apps](#progressive-web-apps)
1313
- [Web Components](#web-components)
1414
- [Others](#others)
@@ -21,17 +21,17 @@ Start you new presentation by following the quick 👉 [Getting Started guide](
2121

2222
The developers' documentation is available online at [https://docs.deckdeckgo.com](https://docs.deckdeckgo.com).
2323

24-
## Example
25-
26-
The [DeckDeckGo website](https://github.com/deckgo/deckdeckgo-website) is a full featured presentation developed with [DeckDeckGo].
24+
## Contributing
25+
26+
Are you interested to contribute to our open source project? That would be awesome 👍 Have a look to our contributing [guide](CONTRIBUTING.md) to get started.
2727

2828
## Progressive Web Apps
2929

3030
| Project | Version | Online | Links |
3131
| ------- | ------- | ------- |:-----:|
3232
| **Documentation** | [![version](https://img.shields.io/static/v1.svg?label=production&message=v1.0.0-rc.1&color=success)](https://docs.deckdeckgo.com) | [https://docs.deckdeckgo.com](https://docs.deckdeckgo.com) | [`README.md`](docs/README.md)
3333
| **Remote control** | [![version](https://img.shields.io/static/v1.svg?label=production&message=v1.0.0-beta.1&color=success)](https://deckdeckgo.app) | [https://deckdeckgo.app](https://deckdeckgo.app) | [`README.md`](remote/README.md)
34-
| **Studio** | ![version](https://img.shields.io/static/v1.svg?label=in%20development&message=v1.0.0-beta.2&color=orange) | | [`README.md`](studio/README.md)
34+
| **Studio** | ![version](https://img.shields.io/static/v1.svg?label=in%20development&message=v1.0.0-beta.3&color=orange) | | [`README.md`](studio/README.md)
3535
| **Website** | [![version](https://img.shields.io/static/v1.svg?label=production&message=v1.0.0-rc.1&color=success)](https://deckdeckgo.com) | [https://deckdeckgo.com](https://deckdeckgo.com) | [`Repo`](https://github.com/deckgo/deckdeckgo-website/)
3636

3737
## Web Components
@@ -74,7 +74,7 @@ The [DeckDeckGo website](https://github.com/deckgo/deckdeckgo-website) is a full
7474
| ------- | ------- | ------- |:-----:|
7575
| **Backend** | | ![version](https://img.shields.io/static/v1.svg?label=version&message=v1.0.0-alpha.2&color=success) | [`README.md`](backend/README.md)
7676
| **CLI** | [`create-deckdeckgo`](https://www.npmjs.com/package/create-deckdeckgo) | [![version](https://img.shields.io/npm/v/create-deckdeckgo/latest.svg?color=success)](https://www.npmjs.com/package/create-deckdeckgo) | [`README.md`](cli/README.md)
77-
| **Cloud** | | | [`README.md`](cloud/README.md)
77+
| **Cloud** | | ![version](https://img.shields.io/static/v1.svg?label=in%20development&message=v1.0.0-beta.1&color=orange) | [`README.md`](cloud/README.md)
7878
| **Infrastructure** | | | [`README.md`](infra/README.md)
7979
| **Starter kit** | | ![version](https://img.shields.io/static/v1.svg?label=version&message=v1.0.0-rc.1-3&color=success) | [`Repo`](https://github.com/deckgo/deckdeckgo-starter/)
8080
| **WAI Lambda** | | | [`Repo`](https://github.com/deckgo/wai-lambda)

cloud/CHANGELOG.md

+6
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
<a name="1.0.0-rc.1"></a>
2+
# 1.0.0-rc.1 (2019-09-08)
3+
4+
### Features
5+
6+
* first stable release

cloud/functions/package-lock.json

+1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

cloud/functions/package.json

+1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
{
22
"name": "functions",
3+
"version": "1.0.0-beta.1",
34
"scripts": {
45
"lint": "tslint --project tsconfig.json",
56
"build": "tsc",

cloud/functions/src/index.ts

+7-2
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,16 @@ import * as admin from 'firebase-admin';
44
const app: admin.app.App = admin.initializeApp();
55
app.firestore().settings({timestampsInSnapshots: true});
66

7-
import {applyWatchDeckWrite} from './watch/watch-deck-write';
7+
import {applyWatchDeckDelete, applyWatchDeckUpdate} from './watch/watch-deck';
8+
import {applyWatchUserDelete} from './watch/watch-user';
89

910
const runtimeOpts = {
1011
timeoutSeconds: 120,
1112
memory: <const> '1GB'
1213
};
1314

14-
export const watchDeckWrite = functions.runWith(runtimeOpts).firestore.document('decks/{deckId}').onWrite(applyWatchDeckWrite);
15+
export const watchDeckUpdate = functions.runWith(runtimeOpts).firestore.document('decks/{deckId}').onUpdate(applyWatchDeckUpdate);
16+
17+
export const watchDeckDelete = functions.firestore.document('decks/{deckId}').onDelete(applyWatchDeckDelete);
18+
19+
export const watchUserDelete = functions.auth.user().onDelete(applyWatchUserDelete);

cloud/functions/src/model/deck.ts

+6
Original file line numberDiff line numberDiff line change
@@ -42,3 +42,9 @@ export interface DeckData {
4242
created_at?: firestore.Timestamp;
4343
updated_at?: firestore.Timestamp;
4444
}
45+
46+
export interface Deck {
47+
id: string;
48+
data: DeckData;
49+
ref: firestore.DocumentReference;
50+
}

cloud/functions/src/model/slide.ts

+6
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
import {firestore} from 'firebase-admin';
2+
3+
export interface Slide {
4+
id: string;
5+
ref: firestore.DocumentReference;
6+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
import {EventContext} from 'firebase-functions';
2+
import {DocumentSnapshot} from 'firebase-functions/lib/providers/firestore';
3+
4+
import {DeckSlides, deleteSlides, findSlides} from './utils/delete-slides-utils';
5+
6+
export async function deleteDeckSlides(snap: DocumentSnapshot, context: EventContext) {
7+
const deckId: string = context.params.deckId;
8+
9+
if (!deckId || deckId === undefined || deckId === '') {
10+
return;
11+
}
12+
13+
try {
14+
const deckSlides: DeckSlides | null = await findSlides(deckId);
15+
16+
if (!deckSlides) {
17+
return;
18+
}
19+
20+
await deleteSlides(deckId, deckSlides.slides);
21+
22+
} catch (err) {
23+
console.error(err);
24+
}
25+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,158 @@
1+
import * as admin from 'firebase-admin';
2+
3+
import {Deck, DeckData} from '../../model/deck';
4+
5+
import {DeckSlides, deleteSlides, findSlides} from './utils/delete-slides-utils';
6+
7+
export async function deleteDecksSlides(userRecord: admin.auth.UserRecord) {
8+
if (!userRecord || !userRecord.uid || userRecord.uid === undefined || userRecord.uid === '') {
9+
return;
10+
}
11+
12+
try {
13+
const userId: string = userRecord.uid;
14+
15+
const decks: Deck[] | null = await findDecks(userId);
16+
17+
if (!decks || decks.length <= 0) {
18+
return;
19+
}
20+
21+
const decksSlides: (DeckSlides | null)[] = await findAllSlides(decks);
22+
23+
if (!decksSlides || decksSlides.length <= 0) {
24+
await deleteDecks(decks);
25+
return;
26+
}
27+
28+
await deleteAllSlides(decksSlides);
29+
30+
await deleteDecks(decks);
31+
32+
} catch (err) {
33+
console.error(err);
34+
}
35+
}
36+
37+
function findDecks(userId: string): Promise<Deck[] | null> {
38+
return new Promise<Deck[] | null>(async (resolve, reject) => {
39+
try {
40+
const collectionRef: admin.firestore.CollectionReference = admin.firestore().collection('/decks/');
41+
42+
const snapShot: admin.firestore.QuerySnapshot = await collectionRef
43+
.where('owner_id', '==', userId)
44+
.get();
45+
46+
if (snapShot && snapShot.docs && snapShot.docs.length > 0) {
47+
const decks: Deck[] = snapShot.docs.map((doc) => {
48+
const data: Object = doc.data() as DeckData;
49+
const id = doc.id;
50+
const ref = doc.ref;
51+
52+
return {
53+
id: id,
54+
ref: ref,
55+
data: data
56+
} as Deck;
57+
});
58+
59+
resolve(decks);
60+
} else {
61+
resolve(null);
62+
}
63+
} catch (err) {
64+
reject(err);
65+
}
66+
})
67+
}
68+
69+
function findAllSlides(decks: Deck[]): Promise<(DeckSlides | null)[]> {
70+
return new Promise<(DeckSlides | null)[]>(async (resolve, reject) => {
71+
try {
72+
const promises: Promise<DeckSlides | null>[] = [];
73+
decks.forEach((deck: Deck) => {
74+
promises.push(findSlides(deck.id));
75+
});
76+
77+
if (!promises || promises.length <= 0) {
78+
resolve([]);
79+
return;
80+
}
81+
82+
const slides: (DeckSlides | null)[] = await Promise.all(promises);
83+
resolve(slides);
84+
} catch (err) {
85+
reject(err);
86+
}
87+
});
88+
}
89+
90+
function deleteAllSlides(decksSlides: (DeckSlides | null)[]): Promise<void> {
91+
return new Promise<void>(async (resolve, reject) => {
92+
try {
93+
if (!decksSlides || decksSlides.length <= 0) {
94+
resolve();
95+
return;
96+
}
97+
98+
const promises: Promise<void>[] = [];
99+
decksSlides.forEach((deckSlides: DeckSlides | null) => {
100+
if (deckSlides) {
101+
promises.push(deleteSlides(deckSlides.deckId, deckSlides.slides));
102+
}
103+
});
104+
105+
if (promises && promises.length > 0) {
106+
await Promise.all(promises);
107+
}
108+
109+
resolve();
110+
} catch (err) {
111+
reject(err);
112+
}
113+
});
114+
}
115+
116+
function deleteDecks(decks: Deck[]): Promise<void> {
117+
return new Promise<void>(async (resolve, reject) => {
118+
try {
119+
if (!decks || decks.length <= 0) {
120+
resolve();
121+
return;
122+
}
123+
124+
const promises: Promise<void>[] = [];
125+
decks.forEach((deck: Deck) => {
126+
promises.push(deleteDeck(deck));
127+
});
128+
129+
if (promises && promises.length > 0) {
130+
await Promise.all(promises);
131+
}
132+
133+
resolve();
134+
} catch (err) {
135+
reject(err);
136+
}
137+
});
138+
}
139+
140+
function deleteDeck(deck: Deck): Promise<void> {
141+
return new Promise<void>(async (resolve, reject) => {
142+
try {
143+
if (!deck || !deck.id || deck.id === undefined || deck.id === '') {
144+
resolve();
145+
return;
146+
}
147+
148+
const collectionRef: admin.firestore.CollectionReference = admin.firestore().collection(`/decks/`);
149+
const doc: admin.firestore.DocumentReference = collectionRef.doc(deck.id);
150+
151+
await doc.delete();
152+
153+
resolve();
154+
} catch (err) {
155+
reject(err);
156+
}
157+
});
158+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
import * as admin from 'firebase-admin';
2+
3+
export async function deleteUserStorage(userRecord: admin.auth.UserRecord) {
4+
if (!userRecord || !userRecord.uid || userRecord.uid === undefined || userRecord.uid === '') {
5+
return;
6+
}
7+
8+
try {
9+
const userId: string = userRecord.uid;
10+
11+
await deleteStorage(userId);
12+
} catch (err) {
13+
console.error(err);
14+
}
15+
}
16+
17+
function deleteStorage(userId: string | null): Promise<void> {
18+
return new Promise<void>(async (resolve, reject) => {
19+
try {
20+
if (!userId || userId === undefined || userId === '') {
21+
resolve();
22+
return;
23+
}
24+
25+
const bucket = admin.storage().bucket();
26+
await bucket.deleteFiles({prefix: `${userId}/`});
27+
28+
resolve();
29+
} catch (err) {
30+
reject(err);
31+
}
32+
});
33+
}

0 commit comments

Comments
 (0)