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

Blackbrook Barns sākumlapa ar atvērtu norises vietas AI asistentu
Asistents norises vietas pašas vietnē. Lapā nekas nebija jāmaina.
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.

  1. 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ā.

  2. 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.

  3. 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.

  4. 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.

  5. 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.

  6. 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

  1. Pāris

    • Norises vietas Webflow lapa
    • Rezervācijas logrīks40 KB, Shadow DOM
    • Iebūvētās formaspievienotas ar webhook
  2. Kodols

    • API36 ceļi
    • PostgreSQLtiesnesis katram laika logam
  3. Pēc komita

    • E-pastsparakstīts webhook → Make → pastkaste
    • Events 500vienvirziena sūtījums
  4. Komanda

    • Administrēšanas panelis
    • Dežūru grafikskam pieder kuras stundas
Apskates rezervācijas saraksts ar pieejamiem laikiem Blackbrook Barns vietnē
21 dienas laiku saraksts: logrīks, kas uzvedas tā, it kā vienmēr būtu tur bijis.

Tas, kas portfolio parasti nenonāk. Tas viss notika patiesībā, un tas viss ir komitu vēsturē.

  1. 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.
  2. 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_in ir 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.
  3. 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.
  4. 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.
  5. 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.

2026. g. maijs2026. g. okt.
  1. Repozitorijs, prasības, sešu fāžu ceļvedis
  2. CI, API, administrēšanas panelis un logrīki produkcijas mitināšanā
  3. Izmaiņu pieprasījums: savs kalendārs katram menedžerim
  4. Events 500 kods pēc dzīvā API iztaustīšanas
  5. Events 500 sūtījums sāk darboties produkcijā
  6. 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.

Uzrakstīt brīfu

Ātri atbildu WhatsApp un Telegram

Vai pajautājiet par to digitālajam prātam
Nākamais projektsLeonida Ledger