3
3
*
4
4
* Usage:
5
5
*
6
- * node members-bulk-delete.js https://blah.ghost.io ADMIN_API_KEY [doDelete ]
6
+ * node members-bulk-delete.js https://blah.ghost.io ADMIN_API_KEY [true ]
7
7
*
8
8
* If you run this script with just a URL and key, it will do a dry run
9
9
* If you run this script with an extra argument (e.g. true) the deletions will be executed
10
10
*/
11
11
12
12
if ( process . argv . length < 4 ) {
13
- console . error ( 'Missing an argument' ) ;
13
+ console . error ( 'Missing an argument. Requires API_URL API_KEY [confirm] ' ) ;
14
14
process . exit ( 1 ) ;
15
15
}
16
16
17
17
const url = process . argv [ 2 ] ;
18
18
const key = process . argv [ 3 ] ;
19
- const doDelete = process . argv [ 4 ] ;
19
+ const doDelete = process . argv [ 4 ] === 'true' ;
20
20
21
21
if ( ! doDelete ) {
22
22
console . log ( 'Dry run...' ) ;
@@ -33,41 +33,53 @@ const api = new GhostAdminAPI({
33
33
} ) ;
34
34
35
35
( async function main ( ) {
36
- try {
37
- const allMembers = await api . members . browse ( { limit : 'all' } ) ;
36
+ if ( doDelete ) {
37
+ console . log ( 'REAL Run' ) ;
38
+ } else {
39
+ console . log ( 'Dry Run - nothing will be deleted' ) ;
40
+ }
38
41
39
- console . log ( allMembers ) ;
42
+ console . log ( 'API URL' , url ) ;
43
+ console . log ( 'API KEY' , key ) ;
44
+ // Give the user time to read...
45
+ await Promise . delay ( 1000 ) ;
40
46
47
+ try {
48
+ const allMembers = await api . members . browse ( { limit : 'all' } ) ;
49
+ const keep = [ ] ;
41
50
const freeMembers = allMembers . filter ( ( member ) => {
42
51
// Comped members should have a subscription, but just in case
43
52
if ( ! member . comped && member . stripe . subscriptions . length === 0 ) {
44
- console . log ( 'Will delete' , member . email ) ;
45
53
return true ;
46
54
}
47
55
48
- console . log ( 'Will keep' , member . email ) ;
56
+ keep . push ( member . email ) ;
49
57
50
58
return false ;
51
59
} ) ;
52
60
53
- console . log ( freeMembers . length , 'Members will be deleted' ) ;
61
+ console . log ( freeMembers . length , 'Members will be deleted out of' , allMembers . length , 'total members. This will leave' , keep . length , 'members ') ;
54
62
55
- const result = await Promise . mapSeries ( freeMembers , async ( member ) => {
56
- console . log ( 'Deleting' , member . email ) ;
57
- let result = { } ;
63
+ console . log ( 'Keeping:' ) ;
64
+ console . log ( keep ) ;
58
65
59
- // Call the API
60
- if ( doDelete ) {
61
- result = await api . members . delete ( { id : member . id } ) ;
62
- }
66
+ if ( doDelete ) {
67
+ const result = await Promise . mapSeries ( freeMembers , async ( member ) => {
68
+ console . log ( 'Deleting' , member . email ) ;
63
69
64
- // Add a delay but return the original result
65
- return Promise . delay ( 50 ) . return ( result ) ;
66
- } ) ;
70
+ // Call the API
71
+ const result = await api . members . delete ( { id : member . id } ) ;
72
+ // Add a delay but return the original result
73
+ return Promise . delay ( 50 ) . return ( result ) ;
74
+ } ) ;
67
75
68
- console . log ( 'Deleted' , result . length , 'members' ) ;
76
+ console . log ( 'Deleted' , result . length , 'members' ) ;
77
+ }
69
78
} catch ( err ) {
70
79
console . error ( 'There was an error' , require ( 'util' ) . inspect ( err , false , null ) ) ;
80
+ if ( err . type === 'NotFoundError' ) {
81
+ console . log ( 'Resource not found - is members actually enabled?' ) ;
82
+ }
71
83
process . exit ( 1 ) ;
72
84
}
73
85
} ( ) ) ;
0 commit comments