A simple tool which lets you scrape twitter accounts and crosspost them to bluesky accounts! Comes with a CLI and a webapp for managing profiles! Works with images/videos/link embeds/threads.

feat: add 'Reset & Backfill' button to clear cache and re-sync

jack 225b5f0a 90b70a02

+26 -3
+26 -3
public/index.html
··· 233 233 } 234 234 }; 235 235 236 + const resetAndBackfill = async (id, twitterUsername) => { 237 + const limit = prompt(`Reset cache and backfill how many tweets for @${twitterUsername}?`, "100"); 238 + if (limit === null) return; 239 + 240 + try { 241 + // 1. Clear Cache 242 + await axios.delete(`/api/mappings/${id}/cache`, { 243 + headers: { Authorization: `Bearer ${token}` } 244 + }); 245 + // 2. Queue Backfill 246 + await axios.post(`/api/backfill/${id}`, { limit: parseInt(limit) || 100 }, { 247 + headers: { Authorization: `Bearer ${token}` } 248 + }); 249 + alert(`Cache cleared and backfill queued for @${twitterUsername}`); 250 + setTimeout(fetchStatus, 1000); 251 + } catch (err) { 252 + alert('Reset & Backfill failed'); 253 + } 254 + }; 255 + 236 256 const updateTwitter = async (e) => { 237 257 e.preventDefault(); 238 258 const formData = new FormData(e.target); ··· 387 407 <td className="text-end"> 388 408 {isAdmin && ( 389 409 <> 390 - <button onClick={() => runBackfill(m.id, m.twitterUsername)} className="btn btn-link btn-sm text-warning p-0 me-2" title="Backfill"> 410 + <button onClick={() => runBackfill(m.id, m.twitterUsername)} className="btn btn-link btn-sm text-warning p-0 me-2" title="Backfill (Keep Cache)"> 391 411 <span className="material-icons">history</span> 392 412 </button> 393 - <button onClick={() => clearCache(m.id, m.twitterUsername)} className="btn btn-link btn-sm text-secondary p-0 me-2" title="Clear Cache"> 413 + <button onClick={() => resetAndBackfill(m.id, m.twitterUsername)} className="btn btn-link btn-sm text-danger p-0 me-2" title="Reset & Backfill (Clears Cache)"> 414 + <span className="material-icons">restart_alt</span> 415 + </button> 416 + <button onClick={() => clearCache(m.id, m.twitterUsername)} className="btn btn-link btn-sm text-secondary p-0 me-2" title="Clear Cache Only"> 394 417 <span className="material-icons">delete_sweep</span> 395 418 </button> 396 419 </> 397 420 )} 398 - <button onClick={() => deleteMapping(m.id)} className="btn btn-link btn-sm text-danger p-0" title="Delete"> 421 + <button onClick={() => deleteMapping(m.id)} className="btn btn-link btn-sm text-danger p-0" title="Delete Account"> 399 422 <span className="material-icons">delete</span> 400 423 </button> 401 424 </td>