Darbi02 / 05
Kāzu norises vieta vairs nežonglē ar kalendāriem un iesūtnēm: pāri piesakās apskatei telefonā, apstiprinājums pienāk no viņu menedžera personīgās pastkastes, un rezervācija pati nonāk norises vietas sistēmā.
blackbrookbarns.co.uk

- Klients
- Blackbrook Barns, kāzu norises vieta Staffordshire grāfistē, Anglijā
- Loma
- Izstrāde: API, administrēšanas panelis, logrīki, automatizācija
- Periods
- 2026. gada maijs–oktobris
- Tehnoloģijas
- TypeScript, Fastify, Drizzle, PostgreSQL, Next.js, Preact, Make, Heroku, Vercel
- Tiešsaistē
- blackbrookbarns.co.uk
Blackbrook Barns ir kāzu klēts ekskluzīvai lietošanai starp Lichfield un Sutton Coldfield pilsētām, ar nelielu pārdošanas komandu un Webflow vietni, kas savu darbu jau darīja. Jauna vietne nevienam nebija vajadzīga. Vajadzēja, lai darbs aiz tās vairs nebūtu manuāls.
Mērķis bija konkrēts: nevienam nav jāskrien pakaļ, jāpārkopē dati starp sistēmām vai jāvada divas iesūtnes. Pasākumi paliek Events 500 — norises vietas esošajā sistēmā. Maksājumi paliek ārpus darba apjoma.
No tā izrietēja stingrais ierobežojums: visam bija jādzīvo kāda cita lapā, vietnē, ko es nekontrolēju, un jāiztur viss, ko šī lapa dara.
- 01
Apskates rezervācija norises vietas pašas lapā
21 dienas laiku saraksts Shadow DOM iekšienē, lai vietnes CSS un mans CSS nevarētu viens otram pieskarties. Iknedēļas dežūru grafiks nosaka, kas uzņem viesus; pāris redz, ar ko tiksies, izvēlas laiku un saņem apstiprinājuma ekrānu un e-pastu. Darbojas telefona platumā.
- 02
API, kurā rezervācija nevar izgāzties sveša iemesla dēļ
Fastify, Drizzle un PostgreSQL. Vispirms rinda tiek komitēta; e-pasts un norises vietas sistēma darbojas pēc tam un var tikai ierakstīt kļūmi žurnālā. Trešās puses slikta diena nekad neatņem pārim rezervēto laiku.
- 03
E-pastu automatizācija
Uz brošūras pieprasījumu uzreiz pienāk pateicība, pēc apmēram septiņām dienām — viens atgādinājums pieteikties; tas izpaliek, ja pāra rezervācija vai jautājums jau ir saņemts. Pēc kontaktformas aizpildīšanas pienāk apstiprinājums. Pasts aiziet no atbildīgā menedžera pastkastes, un atbildes atgriežas pie šī cilvēka.
- 04
Viens administrēšanas panelis
Next.js: kāzu datumu režģis trim gadiem, apskates kalendārs, katra menedžera pieejamība, dežūru grafiks ar atvaļinājuma slēdzi „viss uz X”, komandas konti un neizdevušies paziņojumi. Rezervētas kāzas pašas slēdz šo dienu apskatēm.
- 05
Events 500 bez pārrakstīšanas
Katra rezervācija norises vietas sistēmā parādās automātiski, ar atzīmi, no kurienes tā nāk: vietne, čatbots vai brošūras e-pasts.
- 06
AI asistents vietnē
Tērzēšanas asistents vietnē no 13,9 KB lielas zināšanu bāzes atbild uz jautājumiem par telpām, ietilpību, Twilight cenām un apskatēm un novirza pārus uz pieraksta lapu.
Kā tas uzbūvēts
Pāris
- Norises vietas Webflow lapa
- Rezervācijas logrīks40 KB, Shadow DOM
- Iebūvētās formaspievienotas ar webhook
Kodols
- API36 ceļi
- PostgreSQLtiesnesis katram laika logam
Pēc komita
- E-pastsparakstīts webhook → Make → pastkaste
- Events 500vienvirziena sūtījums
Komanda
- Administrēšanas panelis
- Dežūru grafikskam pieder kuras stundas

Tas, kas portfolio parasti nenonāk. Tas viss notika patiesībā, un tas viss ir komitu vēsturē.
Kļūme 01
Ritjosla, kurai vajadzēja piecus labojumus
- Simptoms
- Lapās ar logrīku lapa iestrēga. Pāri nevarēja aizritināt līdz rezervācijas formai vai kājenei: ritināšana apstājās pie 1470 no 2636 pikseļiem.
- Cēlonis
- Vietne izmanto Lenis vienmērīgo ritināšanu, kas startā kešo lapas augstumu. Logrīks, kas izaug vēlāk, tai nav redzams. Katrs labojums atrada dziļāku slāni: par agru nosūtīts resize notikums, aptauja, kas apstājās pārāk ātri, pēc tam atklājums, ka Lenis resize vispār ignorē, ja vietne fiksē html augstumu.
- Risinājums
- Lenis savu instanci tur privātu, tāpēc logrīks tieši uz vienu kadru pieslēdzas tās prototipam, notver dzīvo instanci, kad izpildes cikls to izsauc, atjauno metodi un pie katras augstuma izmaiņas izsauc resize(). Tas dzīvo pakotnē, jo kājenes skripti, uz kuriem tas kādreiz balstījās, vēlāk no vietnes pazuda. Lapa, kurā jūsu kods ir iegults, jums nepieder.
Kļūme 02
Integrācija ar API, kura gandrīz nav
- Simptoms
- Piegādātāja PDF dokumentē vienu galapunktu, un atsauces sadaļas no tā ir izņemtas. Tāpēc es iztaustīju dzīvo servisu un pierakstīju, kas tur patiesībā ir.
- Cēlonis
expires_inir dokumentēts kā sekundes, bet atgriež ISO laikspiedolu. Pasākuma izveide nepieņem datumu. Pasākumu lasīšana neatgriež identifikatorus. Nav ne atjaunināšanas, ne dzēšanas, ne webhook.- Risinājums
- Marķieru kešatmiņa pieņem abus derīguma termiņa formātus. Datums, laiks un menedžeris ceļo piezīmju laukā, lai ieraksts komandai būtu noderīgs. Sūtījums nekad nemet izņēmumu un ir idempotents pēc saglabātā ID. Edit un Delete administrēšanas panelī paliek paslēpti, uzbūvēti un testēti, jo tie nevarēja sasniegt norises vietas sistēmu, un divi kalendāri, kas nesakrīt, ir sliktāk nekā viena trūkstoša poga. Kad darbojas atcelšanas pārbaude, tā reaģē tikai uz nepārprotamu signālu: kļūdaini atcelt īstu pierakstu ir daudz sliktāk nekā pamanīt atcelšanu ar nokavēšanos.
Kļūme 03
Vasaras laiks, divreiz
- Simptoms
- Maijā, britu vasaras laikā, krita pirmie pieejamības testi: pirmdiena tika klasificēta kā svētdiena. Pēc tam koda pārskatīšana atrada ko sliktāku rudens pulksteņa maiņā.
- Cēlonis
- Laika logs ir Londonas sienas pulksteņa laiks, bet serveris strādā UTC. Pusnakts Londonā BST laikā ir 23:00 iepriekšējā dienā, tāpēc nedēļas diena iznāca nepareiza. Un, soļojot pa 24 stundām cauri 25 stundu dienai 25. oktobrī, datums varēja atkārtoties, un rezervācijas logs varēja zaudēt vienu dienu.
- Risinājums
- Kodā viena laika joslas robeža. Katra diena ir piesaistīta pusdienlaikam Londonā, kas nekad nav tuvu pulksteņa maiņai, un nedēļas dienas tiek nolasītas no datuma iezīmes, nekad no laika momenta. Trīs pilna cikla testi nofiksē rudens maiņu, pavasara maiņu un parastu ziemas nedēļu. Norises vieta rezervē mēnešiem uz priekšu, tāpēc kalendāram jābūt pareizam arī datumos, kurus neviens nevēro.
Kļūme 04
Lai tiesnesis ir datubāze
- Simptoms
- Divi pāri var vienā mirklī noklikšķināt uz viena laika loga; administrators var divreiz noklikšķināt uz Cancel. Pārskatīšana to pašu kļūdu klasi atrada arī citur, vēl pirms produkcijas.
- Cēlonis
- Pārbaude un pēc tam rakstīšana atstāj spraugu. Dīvainākais gadījums: atkārtoti izmantojot atjaunošanas marķieri, kods atsauca marķieru saimi un tad tajā pašā transakcijā izmeta izņēmumu, tāpēc atsaukšana atritinājās kopā ar kļūdu. Atkārtotais pieprasījums saņēma 401, un saime palika derīga.
- Risinājums
- Daļējs unikāls indekss pēc menedžera, datuma un laika tur, kur statuss ir „apstiprināts”. Rezervācija ir vienkāršs INSERT, kas noķer konfliktu un atgriež „laika logs aizņemts”, pārbaudīts ar īstām paralēlām sacīkstēm: tieši viens uzvarētājs. Atcelšana ir viens nosacījuma UPDATE, tāpēc e-pastu izsūta tikai uzvarētājs. Administratori var apiet politiku, bet ne indeksu: konflikts nav politika.
Kļūme 05
Viena adrese, no kuras nevar sūtīt, varēja apturēt visus e-pastus
- Simptoms
- Pāriem jāsaņem ziņa no sava menedžera, bet pasta savienojums pieder vienam cilvēkam. Acīmredzamā izmaiņa bija ielikt laukā From šī menedžera adresi.
- Cēlonis
- Adrese, no kuras savienojums nedrīkst sūtīt, izgāž moduli, un neizdevies palaidiens var izslēgt tūlītēju scenāriju. Viens jauns menedžeris bez tiesību piešķīruma varēja klusi apturēt visus apstiprinājumus visiem.
- Risinājums
- Katrā datu paketē atsevišķs sūtītājs: menedžera adrese tikai tad, ja tā ir atļauto sarakstā, citādi noklusējuma adrese, bet Reply-To joprojām ir menedžeris. Pievienojiet menedžeri, un nekas nesalūst. Atkārtojumi to pārrēķina no pašreizējās konfigurācijas, tāpēc saglabāta datu pakete nevar atkārtot atsauktu piešķīrumu. Pārbaudīts ar īstu sūtījumu: rindas „on behalf of” nav.
- automatizēti testi 62 failosCI žurnāls, 2026. gada 27. oktobris
- zaļi CI palaidieni kopš jūnijaGitHub Actions
- katrs logrīks pēc gzipReact aizstāts ar Preact būvēšanas laikā; virs 50 KB būvējums krīt
- datubāzes tabulas36 API ceļi, 47 operācijas
- diena dzīvajā rezervāciju sarakstāredzams norises vietas vietnē
- dienas no pirmā komita līdz jaunākajam342 komiti; būvēts ar Claude Code
Projekta pulss
Katrs komits projekta repozitorijos uz vienas līnijas. Jo augstāks stabiņš, jo karstāks laiks.
- Repozitorijs, prasības, sešu fāžu ceļvedis
- CI, API, administrēšanas panelis un logrīki produkcijas mitināšanā
- Izmaiņu pieprasījums: savs kalendārs katram menedžerim
- Events 500 kods pēc dzīvā API iztaustīšanas
- Events 500 sūtījums sāk darboties produkcijā
- E-pasti sāk iet no menedžera personīgās pastkastes
Vietne, kas jau pārdod, nav jābūvē no jauna. Tajā var dzīvot nelieli, labi testēti gabali, ja vien katras trešās puses kļūme ir ieprojektēta jau no pirmās dienas. Ja jūsu komanda joprojām pārkopē datus starp sistēmām, ar šo darbu es sāktu.
Vai pajautājiet par to digitālajam prātam