Săriți la conținut

Blog ·

O scurtătură este o referință, nu un drept

Șase carduri de adăugat pe tabloul de bord și scurtături care apar doar dacă cel care privește mai are voie să vadă ținta astăzi. Două descoperiri reale.

De Provibr

Tabloul de bord al unui panou de găzduire este ecranul pe care îl vede toată lumea prima dată și despre care aproape nimeni nu are o părere până când nu îi este așezat greșit. Cererea era modestă: să lăsăm oamenii să adauge carduri și să pună scurtături către un server sau o integrare la care se întorc mereu.

Cererile modeste sunt locul unde se ascund deciziile interesante, pentru că o scurtătură este o preferință salvată care arată către un obiect real cu drepturi reale. Strâmbarea acelei relații este felul în care un panou ajunge să îi arate cuiva o mașină de la care a fost scos acum trei luni.

Șase carduri, nicio migrare, și nimic nu vine necerut

Există șase carduri care se pot adăuga: o listă de agenți, o listă de servere, o listă de integrări, o listă de tichete, creditul și o scurtătură. Toate șase sunt pe jumătate de lățime, pentru că sunt priviri de ansamblu așezate alături și nu ceva care să ceară rândul întreg.

Așezarea este salvată ca JSON, iar runda aceasta nu a adăugat nicio migrare. Este o decizie și nu o uitare. O intrare era un identificator și un indicator de ascuns; acum poartă și un identificator de instanță și o configurare pe card. Un rând vechi se citește curat în forma nouă, cu identificatorul de instanță completat din cel al cardului și configurarea goală, iar un test verifică exact asta: o așezare veche se citește ca aceleași carduri în aceeași ordine. Aici o migrare ar pune doar o marcă de timp în jurnal, iar o marcă de timp care mai târziu se dovedește prea mare este o problemă adevărată pentru runda următoare.

A doua regulă este că un card opțional nu apare niciodată singur. Există o buclă care adaugă cardurile pe care o așezare nu le numește, ca un card fix nou să apară la toată lumea, iar bucla aceea acoperă intenționat doar cardurile fixe. Dacă ar intra în ea unul opțional, „a adăuga” ar înceta să mai fie o acțiune, iar fiecare tablou de bord din produs ar crește la fiecare publicare cu un card pe care nu l-a cerut nimeni.

Ce carduri lipsesc este la fel de mult o decizie ca și care sunt acolo. Supravegherea și copiile de siguranță există în cod în spatele unor steaguri de lansare stinse, deci un card pentru ele ar fi un card fără utilizatori. Activitatea recentă a rămas afară pentru că există deja ca un card fix.

Două jumătăți ale unei singure reguli

În așezarea salvată a unei persoane, o scurtătură nu este nimic altceva decât un fel și un identificator. Tot ce ajunge pe ecran, numele, starea, legătura, este adus din nou la fiecare încărcare de pagină cu drepturile celui care privește în acel moment. Regula are două jumătăți și amândouă sunt necesare.

Prima este modulul. Un membru care pierde modulul de agenți nu își mai vede scurtătura către un agent, chiar dacă ea rămâne în așezarea lui. Poarta aceasta cunoaște și suprafețele: pe domeniul de marcă propriu al unui client, unde facturarea nici nu există, scurtătura către credit dispare deci prin construcție și nu printr-o a doua regulă scrisă anume.

A doua este interogarea pe obiect. Identificatorul de organizație stă în fiecare WHERE, filtrul de ștergere blândă lângă el, iar la un server domeniul de servere al acelui membru lângă acesta. Un server care nu i-a fost niciodată atribuit unui membru nu există pentru acel membru, iar asta trebuie să fie valabil și pentru o scurtătură pe care a făcut-o pe vremea când încă avea voie să îl vadă.

Cardul de scurtătură este și singurul card fără modul și singurul care are voie să existe de mai multe ori. Este corect și nu neglijent: o scurtătură nu este un ecran de sine stătător, este o referință către un ecran care își poartă deja dreptul propriu. Dacă felul de card ar purta un modul, cineva cu acel modul ar putea vedea o scurtătură către ceva ce nu are voie să deschidă.

Modulul luat și obiectul dispărut sunt evenimente diferite

Două lucruri care pe ecran arată la fel primesc tratamente opuse.

Ce s-a întâmplatCe vede cel care privește
Modulul a fost retrasCardul dispare fără un cuvânt și se întoarce odată cu modulul
Ținta nu a fost găsităUn card care spune că nu mai există, cu un buton pentru a-l scoate

Primul este tăcut pentru că scurtătura nu este povestea. Dacă rolul cuiva s-a schimbat, scurtătura lipsă este un simptom, iar anunțarea ei pe tabloul de bord ar fi zgomot peste o schimbare pe care o cunoaște deja. Se întoarce, pe deasupra, neatinsă îndată ce se întoarce modulul, ceea ce este posibil doar pentru că nu a fost șters nimic.

Al doilea este zgomotos pentru că persoana nu a greșit cu nimic și i s-a luat ceva. Intenționat nu este un 404 și nici un mesaj de eroare: doar un card care numește situația și se oferă să se strângă singur.

Afișare îngăduitoare, nu curățare la ștergere

Alternativa evidentă este să scoatem scurtăturile atunci când ținta lor este ștearsă. Nu am făcut-o, iar raționamentul merită notat pentru că decizia contrară a fost luată în altă parte a aceleiași baze de cod: când un membru părăsește un cont, așezarea lui salvată este într-adevăr uitată, pentru că rândul acela nu atinge nicio cascadă și altfel ar rămâne pentru totdeauna într-un cont în care nu se mai întoarce.

Aici balanța cade în cealaltă parte, din trei motive.

Dispariția are mai multe cauze decât ștergerea. Un membru pierde un modul, domeniul lui de servere se schimbă, privește pe un domeniu de marcă. Nicio rutină de curățare nu prinde cele trei cazuri, deci calea îngăduitoare trebuie să existe oricum, iar un al doilea mecanism devine doar încă un loc care se poate desincroniza.

Așezarea este salvată pe persoană. Un server șters ar obliga la rescrierea JSON-ului fiecărui membru al organizației, într-o tranzacție pe calea de ștergere. Aceasta este amplificare de scriere pe o cale caldă în schimbul unei preferințe de ecran.

Și nu este nimic de protejat. Rândul salvat este un UUID al unui obiect din propria organizație și nimic altceva. Nu scapă nimic, nu crește, iar persoana vede imediat că poate pleca.

Proba cap la cap este brutală intenționat. După o ștergere blândă serverul nu se întoarce, iar numele lui nu apare nicăieri în ieșire. Un membru fără modulul de agenți nu primește nici agent, nici integrare, iar selectorul nu i le oferă. Un domeniu de servere gol dă zero rânduri și nu tot.

Două descoperiri pe care doar o probă reală le-a scos la iveală

Cele două defecte adevărate ale acestei runde erau amândouă invizibile pentru testele unitare, iar amândouă au costat vreo zece secunde de îndată ce ceva real a fost pornit.

Selectorul are un câmp de căutare, iar căutarea integrărilor rupea întreg selectorul cu o eroare de bază de date. Motivul este că această coloană cu tipul integrării este un tip enumerat din Postgres, iar pentru un enumerat nu există operator de tipar insensibil la majuscule: interogarea a întors 42883 operator does not exist, iar pentru că acea interogare hrănea tot selectorul nu se afișa absolut nimic. Convertirea coloanei în text rezolvă. Niciun test unitar cu un executant simulat nu ar fi văzut asta, pentru că o simulare nu are tipuri.

Al doilea a ieșit din trecerea de accesibilitate. O plăcuță de scurtătură este un nume, o stare și un fel, iar întregul se poate apăsa. Prima versiune punea totul într-o singură legătură, iar auditul a semnalat o nepotrivire între numele accesibil și eticheta vizibilă, pentru că textul ascuns contează la numele accesibil. Plăcuța este acum un înveliș obișnuit cu o legătură care poartă doar numele și o suprafață de apăsare absolută și goală care prinde clicul. Asta a adus o a doua problemă, mai mică: clasa de tăiere de pe legătură tăia acea suprafață la lățimea textului, așa că cea mai mare parte a plăcuței nu se mai putea apăsa. Tăierea s-a mutat pe un element interior, iar acoperirea a fost măsurată în loc să fie presupusă.

Ce am nota

  1. Salvați o referință, rezolvați un drept. În preferință intră un identificator. Ce ajunge pe ecran se aduce de fiecare dată cu drepturile celui care privește.
  2. O coloană fără schemă este o migrare pe care nu trebuie să o scrieți. Dar doar dacă puteți dovedi că forma veche se recitește identic, iar aceasta este un test.
  3. Opțional înseamnă la cerere, pentru totdeauna. Un card care apare singur face din „a adăuga” un cuvânt fără conținut.
  4. Deosebiți șters de inaccesibil. Pe ecran arată la fel și merită tratamentul contrar: tăcere pentru unul, o explicație pentru celălalt.
  5. Necurățarea poate fi alegerea mai puternică. Dacă același simptom are cauze pe care curățarea dumneavoastră nu le vede, calea îngăduitoare trebuie să existe oricum, iar curățarea devine doar un al doilea lucru de ținut la fel.
  6. Porniți lucrul. Un enumerat fără operator de tipar și o legătură care își taie propria suprafață de apăsare se văd într-o clipă într-un navigator și nu se văd deloc într-o baterie de teste fără bază de date.

Pentru claritate despre ce este acest lucru: cardurile descrise aici sunt în producție pentru orice cont. Mai multe lucruri nu sunt dovedite. Reordonarea cu mausul nu a fost condusă, cardurile de supraveghere și de copii aflate în spatele unui steag nu există, deci calea lor de cod nu a fost niciodată parcursă, domeniul de marcă a fost verificat într-o interogare și nu într-un navigator, iar un card abia adăugat apare doar după runda următoare a serverului.

Din munca de platformă a Provibr. Ce vede și ce nu vede un client al clientului nostru pe un panou de marcă se află în panouri cu marcă albă: ce vede clientul, iar de ce un ecran de sinteză nu rescrie niciodată în tabelele pe care le citește se află în a proiecta, niciodată a înlocui.

Începeți cu o gazdă și un agent

Creați un cont, instalați agentul cu o singură comandă și conectați primul dumneavoastră host Proxmox. Perioada de probă durează 14 zile și nu cere date de plată.