Skip to content

Commit eb23e66

Browse files
authored
feat: Handler Connection Errors (#119)
1 parent 5a29591 commit eb23e66

30 files changed

Lines changed: 296 additions & 335 deletions

src/@types/Gluegun.d.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
import { ApiApp, ApiTeamApps } from "@discloudapp/api-types/v2";
22
import { ApiResponse } from "gluegun";
3-
import { AskForAppsOptions, FetchAndAskForAppsOptions } from ".";
3+
import { Ora } from "ora";
4+
import { ApiResPrinterOptions, AskForAppsOptions, FetchAndAskForAppsOptions } from ".";
45

56
declare module "gluegun" {
67
interface GluegunPrint {
78
debug: Console["debug"]
8-
printApiRes<T = any>(apiRes: ApiResponse<T>, spin?: any): number
9-
spinApiRes<T = any>(apiRes: ApiResponse<T>, spin: any): number
9+
printApiRes<T>(apiRes: ApiResponse<T>, options?: ApiResPrinterOptions, spin?: Ora): number
10+
spinApiRes<T>(apiRes: ApiResponse<T>, spin: Ora, ApiResPrinterOptions?: ApiResPrinterOptions): number
1011
}
1112

1213
interface GluegunPrompt {

src/@types/index.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
import { DiscloudConfig } from "../util";
22

3+
export interface ApiResPrinterOptions {
4+
exitOnError?: boolean
5+
}
6+
37
export interface AskForAppsOptions {
48
/**
59
* @default false

src/commands/app-apt.ts

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import { APT, APTPackages, RESTPutApiAppAptResult, Routes } from "@discloudapp/api-types/v2";
22
import { GluegunCommand, GluegunToolbox } from "gluegun";
3-
import { exit } from "node:process";
43
import { apidiscloud, aptValidator, config, RateLimit } from "../util";
54

65
export default new class AppApt implements GluegunCommand {
@@ -75,8 +74,7 @@ export default new class AppApt implements GluegunCommand {
7574

7675
new RateLimit(apiRes.headers);
7776

78-
if (apiRes.status)
79-
if (print.spinApiRes(apiRes, spin) > 399) return exit(apiRes.status);
77+
print.spinApiRes(apiRes, spin, { exitOnError: true });
8078
}
8179
}
8280
};

src/commands/apps-team.ts

Lines changed: 10 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import { RESTGetApiAppTeamResult, RESTPostApiAppTeamResult, Routes } from "@discloudapp/api-types/v2";
22
import { GluegunCommand, GluegunToolbox } from "gluegun";
3-
import { exit } from "node:process";
43
import { apidiscloud, config, makeTable, RateLimit } from "../util";
54
import { ModPermissions } from "../util/constants";
65

@@ -84,20 +83,18 @@ export default new class AppsTeam implements GluegunCommand {
8483

8584
new RateLimit(apiRes.headers);
8685

87-
if (apiRes.status) {
88-
if (print.spinApiRes(apiRes, spin) > 399) return exit(apiRes.status);
86+
print.spinApiRes(apiRes, spin, { exitOnError: true });
8987

90-
if (!apiRes.data) return;
88+
if (!apiRes.data) return;
9189

92-
if ("app" in apiRes.data)
93-
print.table(makeTable(apiRes.data.app), {
94-
format: "lean",
95-
});
90+
if ("app" in apiRes.data)
91+
print.table(makeTable(apiRes.data.app), {
92+
format: "lean",
93+
});
9694

97-
if ("team" in apiRes.data)
98-
print.table(makeTable(apiRes.data.team), {
99-
format: "lean",
100-
});
101-
}
95+
if ("team" in apiRes.data)
96+
print.table(makeTable(apiRes.data.team), {
97+
format: "lean",
98+
});
10299
}
103100
};

src/commands/apps.ts

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import { RESTGetApiAppAllResult, RESTGetApiAppResult, Routes } from "@discloudapp/api-types/v2";
22
import { GluegunCommand, GluegunToolbox } from "gluegun";
3-
import { exit } from "node:process";
43
import { apidiscloud, config, makeTable, RateLimit } from "../util";
54

65
export default new class Apps implements GluegunCommand {
@@ -30,15 +29,14 @@ export default new class Apps implements GluegunCommand {
3029

3130
new RateLimit(apiRes.headers);
3231

33-
if (apiRes.status) {
34-
if (print.spinApiRes(apiRes, spin) > 399) return exit(apiRes.status);
32+
print.spinApiRes(apiRes, spin, { exitOnError: true });
3533

36-
if (!apiRes.data) return;
34+
if (!apiRes.data) return;
35+
36+
if ("apps" in apiRes.data)
37+
print.table(makeTable(apiRes.data.apps), {
38+
format: "lean",
39+
});
3740

38-
if ("apps" in apiRes.data)
39-
print.table(makeTable(apiRes.data.apps), {
40-
format: "lean",
41-
});
42-
}
4341
}
4442
};

src/commands/backups.ts

Lines changed: 37 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import { RESTGetApiAppAllBackupResult, RESTGetApiAppBackupResult, Routes } from "@discloudapp/api-types/v2";
22
import axios from "axios";
33
import { GluegunCommand, GluegunToolbox } from "gluegun";
4-
import { exit } from "node:process";
54
import { apidiscloud, config, makeTable, RateLimit } from "../util";
65
import { backupsPath } from "../util/constants";
76

@@ -32,63 +31,61 @@ export default new class Backups implements GluegunCommand {
3231

3332
new RateLimit(apiRes.headers);
3433

35-
if (apiRes.status) {
36-
if (print.spinApiRes(apiRes, spin) > 399) return exit(apiRes.status);
34+
print.spinApiRes(apiRes, spin, { exitOnError: true });
3735

38-
if (!apiRes.data) return;
36+
if (!apiRes.data) return;
3937

40-
if ("backups" in apiRes.data) {
41-
if (parameters.options.save || parameters.options.s)
42-
if (Array.isArray(apiRes.data.backups)) {
43-
for (let i = 0; i < apiRes.data.backups.length; i++) {
44-
const backup = apiRes.data.backups[i];
38+
if ("backups" in apiRes.data) {
39+
if (parameters.options.save || parameters.options.s)
40+
if (Array.isArray(apiRes.data.backups)) {
41+
for (let i = 0; i < apiRes.data.backups.length; i++) {
42+
const backup = apiRes.data.backups[i];
4543

46-
if (backup.status === "ok") {
47-
const outFileName = `${backupsPath}/${backup.id}.zip`;
44+
if (backup.status === "ok") {
45+
const outFileName = `${backupsPath}/${backup.id}.zip`;
4846

49-
const spin = print.spin({
50-
text: `Saving: ${outFileName}`,
51-
});
47+
const spin = print.spin({
48+
text: `Saving: ${outFileName}`,
49+
});
5250

53-
try {
54-
const result = await axios.get(backup.url, { responseType: "arraybuffer" });
51+
try {
52+
const result = await axios.get(backup.url, { responseType: "arraybuffer" });
5553

56-
filesystem.write(outFileName, result.data);
54+
filesystem.write(outFileName, result.data);
5755

58-
spin.succeed();
56+
spin.succeed();
5957

60-
apiRes.data.backups[i].url = outFileName;
61-
} catch {
62-
spin.fail();
63-
}
58+
apiRes.data.backups[i].url = outFileName;
59+
} catch {
60+
spin.fail();
6461
}
6562
}
66-
} else {
67-
const backup = apiRes.data.backups;
63+
}
64+
} else {
65+
const backup = apiRes.data.backups;
6866

69-
const outFileName = `${backupsPath}/${backup.id}.zip`;
67+
const outFileName = `${backupsPath}/${backup.id}.zip`;
7068

71-
const spin = print.spin({
72-
text: `Saving: ${outFileName}`,
73-
});
69+
const spin = print.spin({
70+
text: `Saving: ${outFileName}`,
71+
});
7472

75-
try {
76-
const result = await axios.get(backup.url, { responseType: "arraybuffer" });
73+
try {
74+
const result = await axios.get(backup.url, { responseType: "arraybuffer" });
7775

78-
filesystem.write(outFileName, result.data);
76+
filesystem.write(outFileName, result.data);
7977

80-
spin.succeed();
78+
spin.succeed();
8179

82-
apiRes.data.backups.url = outFileName;
83-
} catch {
84-
spin.fail();
85-
}
80+
apiRes.data.backups.url = outFileName;
81+
} catch {
82+
spin.fail();
8683
}
84+
}
8785

88-
print.table(makeTable(apiRes.data.backups), {
89-
format: "lean",
90-
});
91-
}
86+
print.table(makeTable(apiRes.data.backups), {
87+
format: "lean",
88+
});
9289
}
9390
}
9491
};

src/commands/commit.ts

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import { RESTPutApiAppCommitResult, Routes } from "@discloudapp/api-types/v2";
22
import FormData from "form-data";
33
import { GluegunCommand, GluegunToolbox } from "gluegun";
4-
import { exit } from "node:process";
54
import { apidiscloud, arrayOfPathlikeProcessor, config, DiscloudConfig, makeZipFromFileList, RateLimit } from "../util";
65

76
export default new class Commit implements GluegunCommand {
@@ -67,10 +66,10 @@ export default new class Commit implements GluegunCommand {
6766
if (parameters.options.eraseZip !== false)
6867
filesystem.remove(parameters.array[0]);
6968

70-
if (apiRes.status) {
71-
if (print.spinApiRes(apiRes, spin) > 399) return exit(apiRes.status);
69+
print.spinApiRes(apiRes, spin, { exitOnError: true });
7270

73-
if (apiRes.data?.logs) print.info(`[DISCLOUD API] ${apiRes.data.logs}`);
74-
}
71+
if (!apiRes.data) return;
72+
73+
if ("logs" in apiRes.data) print.info(`[DISCLOUD API] ${apiRes.data.logs}`);
7574
}
7675
};

src/commands/delete.ts

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import { RESTDeleteApiAppAllDeleteResult, Routes } from "@discloudapp/api-types/v2";
22
import { GluegunCommand, GluegunToolbox } from "gluegun";
3-
import { exit } from "node:process";
43
import { apidiscloud, config, makeTable, RateLimit } from "../util";
54

65
export default new class Delete implements GluegunCommand {
@@ -42,15 +41,14 @@ export default new class Delete implements GluegunCommand {
4241

4342
new RateLimit(apiRes.headers);
4443

45-
if (apiRes.status) {
46-
if (print.spinApiRes(apiRes, spin) > 399) return exit(apiRes.status);
44+
print.spinApiRes(apiRes, spin, { exitOnError: true });
4745

48-
if (!apiRes.data) return;
46+
if (!apiRes.data) return;
47+
48+
if ("apps" in apiRes.data)
49+
print.table(makeTable(apiRes.data.apps), {
50+
format: "lean",
51+
});
4952

50-
if ("apps" in apiRes.data)
51-
print.table(makeTable(apiRes.data.apps), {
52-
format: "lean",
53-
});
54-
}
5553
}
5654
};

src/commands/locale.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,11 @@ export default new class Locale implements GluegunCommand {
2727

2828
new RateLimit(apiRes.headers);
2929

30-
if (apiRes.status)
31-
print.printApiRes(apiRes);
30+
print.printApiRes(apiRes);
31+
32+
if (!apiRes.data) return;
33+
34+
if ("localeList" in apiRes.data)
35+
print.info("Supported locales: " + apiRes.data.localeList?.join(", "));
3236
}
3337
};

src/commands/login.ts

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import { RESTGetApiUserResult, Routes } from "@discloudapp/api-types/v2";
22
import { GluegunCommand, GluegunToolbox } from "gluegun";
3-
import { exit } from "node:process";
43
import { apidiscloud, config, RateLimit } from "../util";
54

65
export default new class Login implements GluegunCommand {
@@ -27,11 +26,9 @@ export default new class Login implements GluegunCommand {
2726

2827
new RateLimit(apiRes.headers);
2928

30-
if (apiRes.status) {
31-
if (print.printApiRes(apiRes) > 399) return exit(apiRes.status);
29+
print.printApiRes(apiRes, { exitOnError: true });
3230

33-
if (apiRes.data?.status === "ok")
34-
config.update({ token });
35-
}
31+
if (apiRes.data?.status === "ok")
32+
config.update({ token });
3633
}
3734
};

0 commit comments

Comments
 (0)