APIって知ってる?
特定のURLに「これほしい!!」とか「これやって!」とか言ったら情報がもらえたり、いろいろ処理してくれるやつのことだよ!!
とっても大雑把に解説すると、
「これほしい!!」をGET通信
「これやって!!」をPOST通信
と言って僕はそれを間違えてしまったんだ😣
背景
今回はRaycastというランチャーアプリの拡張機能を作ろうとしたんだ。(ドキュメントもしっかり整ってるからやってみたい人はやってみてね!)
そこで業務効率化の名目でTodoistとTogglというサービスをいい感じに連携した拡張機能を作ってたところ。。。
やっちゃった🥴
スクロールバーがこれほど小さくなるほどのオーガナイゼーションができちゃった🥴
Togglの拡張機能はあったので、それのapiをそのまま使ってたはず、、、(もしかしたら自分で書いてたかも)と思ってたのですが、急いで改修したので今となっては原因コードは不明、、、
(Togglの拡張機能↓)
https://github.com/raycast/extensions/blob/f10c4edbb993ac8a552eb0d84fb1f7df9a2e0538/extensions/toggl-track/README.md
TogglのAPI Documentを見る限り
fetch("https://api.track.toggl.com/api/v9/organizations", {
method: "POST",
body: {"name":"string","workspace_name":"string"},
headers: {
"Content-Type": "application/json",
"Authorization": `Basic ${base64.encode(<email>:<password>)}`
},
})
.then((resp) => resp.json())
.then((json) => {
console.log(json);
})
.catch(err => console.error(err));
これをやってしまったんだろうなぁ、、、
本来なら自分のオーガナイゼーションの一覧を取得したいので、
fetch("https://api.track.toggl.com/api/v9/me/organizations", {
method: "GET",
headers: {
"Content-Type": "application/json",
"Authorization": `Basic ${base64.encode(<email>:<password>)}`
},
})
.then((resp) => resp.json())
.then((json) => {
console.log(json);
})
.catch(err => console.error(err));
こっちを叩くべきだったのに、、、
解決策
まあやってしまったもんはしゃーない!
と泣きながら反転術式を組みます。
ToggleAPIのドキュメントを見るとorganizationIDさえわかれば削除できるっぽいので、
1.GET通信で自分のユーザーのorganizationの一覧を取得
2.ループで全部削除!
この順番で組んでいくよ!
const base64encode = (str: string) => {
return Buffer.from(str).toString("base64");
};
const deleteAction = async () => {
// Organization一覧の取得
const organizations: any = await fetch("https://api.track.toggl.com/api/v9/me/organizations", {
method: "GET",
headers: {
"Content-Type": "application/json",
"Authorization": `Basic ${base64encode(`${togglApiToken}:api_token`)}`
},
})
.then((resp) => resp.json())
.then((json) => {
return json;
})
.catch(err => console.error(err));
// 削除
for (const organization of organizations) {
const createdDate = new Date(organization.created_at)
console.log(organization.created_at, createdDate.getFullYear());
if (createdDate.getFullYear() === 2025) {
fetch(`https://api.track.toggl.com/api/v9/organizations/${organization.id}/users/leave`, {
method: "DELETE",
headers: {
"Content-Type": "application/json",
"Authorization": `Basic ${base64encode(`${togglApiToken}:api_token`)}`
},
})
.then((resp) => resp.json())
.then((json) => {
console.log('delete', json);
})
.catch(err => console.error(err));
}
}
}
deleteAction();
これでresponseがstatus200になったら成功!!
今回は2025年に作られたやつは全部対象だったのでわかりやすかった。。。
あとは実行して変なの消さないように拝むだけ!
もしOrganization作りすぎちゃった!って人がいたら使ってね!
「ピューッとやってぴょいっ」とまでは行かなかったけど、手動でやるよりかはこっちの方が断然早いし楽、、、、