Masrafı düzenlemek bölüşümü neden yeniden belirtmeli
Bir düzenlemenin varsayılanları para hatası olduğundan Dimesum, eski bir düzenlemeyi birleştirmek yerine reddeden base_version ile birlikte participants ve split_type alanlarını her masraf düzenlemesinde zorunlu kılar
Bir yazım hatasını düzeltmek kimin borçlu olduğunu değiştirmemeli. Dimesum'da ortak bir masrafı düzenlemek bölüşümün tamamını yeniden belirtir. participants ve split_type her PATCH isteğinde zorunludur ve ikisinden birini atlayan bir düzenleme, varsayılan doldurmak yerine 400 döner. Oluşturma varsayılanları mevcut tüm üyeler ve eşit bölüşümdür; bir düzenlemede bunlar para hatasıdır.
İki hata durumu bunu somutlaştırır. Ağustos'ta katılan bir ev arkadaşı Temmuz'un yemeğine dahil edilir, çünkü "mevcut tüm üyeler" masraf yazıldığında değil düzenleme geldiğinde değerlendirilir. Bilinçli bir 70/30 kira bölüşümü 50/50'ye düzleşir, çünkü eksik bir split_type EQUAL anlamına gelir. Her iki hata da bir hata vermez ve ikisi de gerçek para taşır.
Bir düzenlemenin varsayılanları para hatasıdır. Oluşturma zamanı varsayılanı, yazarın şu anda baktığı grup hakkında tahmin yürütür. Bir düzenleme daha sonra, değişmiş bir gruba karşı gelir ve aynı tahmin sessizce insanların borcunu yeniden yazar.
Oluşturma varsayılanları eski bir masrafı değil yeni bir masrafı tanımlar
Oluşturma zamanında varsayılanlar dürüsttür. Yazar gruba olduğu haliyle bakar ve herkes arasında eşit bölüşüm yaygın durumdur, bu yüzden Dimesum ikisini de doldurur. Masraf yalnızca sonuçlarını değil girdilerini saklar: splits.percent_bp, splits.weight ve splits.exact_minor kullanıcının yazdığını tutar, böylece sonraki bir düzenleme onu yeniden açabilir.
Bir düzenleme farklı bir eylemdir. Aynı masraf haftalar sonra, yeni bir ev arkadaşı katıldıktan ya da bir hayalet üye sahiplenildikten sonra düzeltilebilir. Üyelik hareketli bir hedeftir, bölüşüm değildir. Oluşturma varsayılanlarını yeniden kullanmak, eski masrafın zaten yanıtladığı bir soruyu bugünkü gruba sorar.
Tahmin etmeyi reddetmek burada yeni değildir. Çok ödemeli bir masraf ödeyenlerini de yeniden belirtmelidir. soleStoredPayer saklanan ödeyeni yalnızca masrafın tam olarak bir ödeyeni olduğunda yeniden kullanır, böylece iki ödeyen hakkında sessiz kalan bir düzenleme yeniden atanmak yerine reddedilir. Ödeyenler hakkında hiçbir şey söylemeyen bir düzenleme, düzenlemeyi yapan kişiyi değil masrafın kendi ödeyenini korur.
API bölüşümünü yeniden belirtmeyen bir düzenlemeyi reddeder
Ağ geçidi denetimi herhangi bir para hesaplanmadan önce çalışır. participants boş olduğunda veya split_type boş olduğunda, istek invalid_expense koduyla ve "an edit must restate the split: participants and split_type are required" mesajıyla 400 döner. Masraf hizmeti kuralı validateAmend içinde yineler, böylece hizmete başka bir yoldan ulaşan bir çağıran aynı reddi karşılar.
| Alan | Oluşturmada | Düzenlemede | Varsayılanın bedeli ne olurdu |
|---|---|---|---|
participants | İsteğe bağlı. Mevcut tüm üyelere varsayılanlanır | Zorunlu | Sonradan katılan bir üye eski bir masrafa katılır |
split_type | İsteğe bağlı. EQUAL'a varsayılanlanır | Zorunlu | Bir 70/30 bölüşümü 50/50'ye düzleşir |
payers | İsteğe bağlı. Yazara varsayılanlanır | Atlanması masrafın tek ödeyenini korur; iki ödeyen yeniden belirtilmelidir | Düzenleyen ödeyen olur, kimin kime borçlu olduğunu tersine çevirir |
base_version | Gönderilmez | Zorunlu ve mevcut sürüme eşit olmalı | Eski bir düzenleme, yazarının hiç okumadığı bir değişikliğin üzerine yazar |
revision_id | İstemci UUIDv7, idempotency anahtarı | Aynı, sürüm başına bir tane | Yeniden denenen bir düzenleme gruba iki kez yükler |
currency | Masraf başına belirtilir | Eşleşmeli; değişiklik reddedilir | Bir bakiye satırı üye başına tek para birimi tutar |
Para birimi aynı ret ailesine aittir. Bir düzenleme bir masrafın para birimini değiştiremez, çünkü bir bakiye satırı üye başına tek para birimi tutar. Yazma tarafı değişikliği reddeder ve yalnızca ekleme yapılan defter böyle bir değişiklik ona ulaşırsa onu park eder. Kapıda reddetmek iki yarının uyuşmazlığa düşmesini önler.
Eski bir düzenleme yazarı için reddedilir, asla birleştirilmez
base_version sözleşmenin diğer yarısıdır. Her PATCH yazarının okuduğu sürümü taşır ve checkTransition onu işlemin az önce kilitlediği satırla karşılaştırır. Eşitse, düzenleme sürüm artı bir olarak uygulanır. Farklıysa, çağıran stale_version koduyla HTTP 409 alır.
Birleştirmek cazip alternatiftir ve yanlıştır. Bir masrafa yapılan iki düzenleme, faturanın ne anlama geldiğine dair iki eksiksiz ifadedir. Onları birleştirmek, kimsenin yazmadığı üçüncü bir ifade üretir ve payları hiçbir yazar tanımaz. Reddetme, çatışmayı çözebilecek tek kişiye geri verir.
İdempotency ve eşzamanlılık bilinçli olarak ayrı tutulur. Revizyon eklemesi sürüm denetiminden önce çalışır, çünkü yeniden denenen bir düzenleme başta okuduğu temel sürümü taşır ve bu artık eskimiştir. Bir yeniden oynatma çatışma olarak değil yeniden oynatma olarak okunmalıdır, bu yüzden önce revision_id yanıtlar ve saklanan sonucu döner.
Yanıt bir sonraki düzenlemenin ihtiyaç duyduğunu zaten taşır
Bir PATCH'te daha fazla alan istemek, ancak bir istemci onları ucuza alabiliyorsa adildir. Her masraf yanıtı version taşır, böylece bir masrafı az önce yazan bir istemci onu ikinci bir okuma olmadan düzenleyebilir. Oluşturma yanıtı, değişiklik yanıtı ve her liste satırı aynı alanı taşır.
Masrafı az önce yazmayan istemci için GET /v1/groups/{id}/expenses/{id} sürümü, hesaplanan payları ve onların arkasındaki girdileri döner. Girdiler bir PATCH'in kabul ettiği aynı adlar altında geri gelir: participants, split_type, percents, weights, shares, items, pools. Bir istemci tek bir biçim okur ve düzenlemelerle geri gönderir, tek bir fatura için iki sözcük dağarcığı arasında çeviri yapmak yerine.
Bu bakışım en çok, yeniden kurulamayan bölüşümler için önemlidir. Bir PERCENT bölüşümü ya da kalem kalem bir fatura, yalnızca çözülmüş paylarından yeniden belirtilemez, çünkü yuvarlama zaten uygulanmıştır ve baz puanlar ile satır kalemleri gitmiştir. Revizyon anlık görüntüleri girdileri de taşır, böylece geçmiş sayfası herhangi bir geçmiş sürümde neyin kalemlendiğini gösterebilir.
Şimdi zorunlu, çünkü bir gereksinim sonradan eklenemez
Bir alanı ilk günden zorunlu kılmak, bugünle ilgili değil gelecekle ilgili bir karardır. Zorunlu bir alanı sonradan gevşetmek geriye dönük uyumludur: istemciler onu zaten gönderir ve sunucu onsuz gelen istekleri kabul etmeye başlar. Bir gereksinimi sonradan eklemek, eski varsayılana güvenen her istemciyi bozar.
Bu yüzden yön bir kez, erkenden seçilir. Dimesum, istemci sayısı hâlâ değiştirilebilecek kadar küçükken bir düzenlemede participants, split_type ve base_version'ı zorunlu kılar. Düzenlemeler için güvenli bir varsayılan bir gün bulunursa, alanlar isteğe bağlı olur ve halihazırda gönderilmiş hiçbir şey çalışmayı durdurmaz.
Bir düzenleme neyi ifade ettiğini yeniden belirtsin
Varsayılanlar, yazarın onayladığı grubu görebildiği oluşturmaya aittir. Bir düzenlemede aynı varsayılanlar, o zamandan beri değişmiş bir grup hakkında bir tahmindir. Sonraki adımınız: kendi okuma uç noktanızı açın ve yazma uç noktanızın kabul ettiği tam alan adları altında bölüşüm girdilerini geri verdiğini denetleyin. İkisi arasında çeviri yapmak zorunda olan bir istemci er ya da geç birini yanlış çevirir.
Sık sorulan sorular
Ortak bir masrafı düzenlemek neden participants ve split_type istiyor?
Dimesum her iki alanı da ister çünkü oluşturma varsayılanları bir düzenleme için yanlıştır. Oluşturmada Dimesum, yazarın baktığı grupla eşleşen mevcut her üyeye ve eşit bölüşüme varsayılanlanır. Bir düzenleme haftalar sonra, biri katıldıktan sonra gelebilir. O varsayılanları yeniden kullanmak yeni bir ev arkadaşını eski bir yemeğe çeker ve bilinçli bir 70/30 kira bölüşümünü hiçbir hata göstermeden 50/50'ye düzleştirir.
İki kişi aynı masrafı aynı anda düzenlerse ne olur?
İkinci düzenleme HTTP 409 ve stale_version hata koduyla reddedilir. Her PATCH, yazarının okuduğu sürümü base_version olarak taşır ve değişiklik yolu bunu kilitli satırla karşılaştırır. Bir uyumsuzluk masrafın hareket ettiği anlamına gelir, bu yüzden düzenleme yazarına şimdi görebildiği sürüme karşı yeniden uygulaması için geri döner. Hiçbir şey birleştirilmez.
Masrafı düzenlemek defter satırlarını yerinde günceller mi?
Hayır, Dimesum'da bir masrafı düzenlemek asla bir defter satırını güncellemez. Bir düzenleme tek işlemde iki kayıt yükler: eski sürümü bacak bacak sıfırlayan bir EXPENSE_REVERSAL ve ardından yeni sürüm için bir EXPENSE kaydı. UPDATE ve DELETE, defterin kendi veritabanı rolünden geri alınmıştır, böylece hatalı kod için bile bir değişiklik imkansızdır. Düzenlendi rozeti ve bir geçmiş sayfası görürsünüz.
Ortak bir masrafı düzenlemeden önce ikinci bir API çağrısı gerekir mi?
Hayır, masrafı az önce yazan bir istemci bir düzenlemenin ihtiyaç duyduğu sürümü zaten tutar. Her masraf yanıtı version taşır ve bir sonraki PATCH bunu base_version olarak gönderir. Masrafı yazmayan bir istemci GET /v1/groups/{id}/expenses/{id} çağırır ve bu, sürümü ve PATCH'in kabul ettiği aynı alan adları altındaki bölüşüm girdilerini döner.
participants ve split_type neden sonradan değil şimdi zorunlu?
Bir alanı ilk günden zorunlu kılmak geri alınabilir, sonradan eklemek ise değildir. Zorunlu bir alanı sonradan gevşetmek geriye dönük uyumludur: istemciler onu zaten gönderir ve sunucu onsuz istekleri kabul etmeye başlar. Bir gereksinimi sonradan eklemek eski varsayılana güvenen her istemciyi bozar ve bir para API'sinde bu bozulma, birinin bakiyesi yanlış olana kadar sessizdir.
Popüler yazılar
- Bakiyeleri tam tutan salt ekleme defteri7 dakika okuma
- Çok para birimli giderlerde altı para hatası8 dakika okuma
- Hesaplaşma: grup harcamalarını daha az transferle kapatın4 dakika okuma
- Paylaşılmayan bir yemek olduğunda hesap nasıl bölünür7 dakika okuma
- Kira paylaşım rehberi: ev arkadaşlarıyla adil bölüşün4 dakika okuma