Changelog
Co nowego.
Każde ulepszenie platformy, jak to wysyła.
· kamo-internal
Pokaż każdą kategorię pamięci oddzielnie
Nagrania rozmów, wiadomości głosowe, załączniki do czatów, zasoby HR i marketing Materiały, które każdy otrzymuje własną linię zamiast dzielić się jednym "Dokumentami i obrazami" Wiosek ze wszystkim, co dzieje się, mieszka w tym samym stole. Dwa konsekwencje dla wizualizacji. Czternaście kategorii przekracza to, co Kategoryczna paleta może kodować — po około ośmiu, dodane odcienie przestają być Oddzielone dla czytelników ślepe na kolory i zostań dekoracją - tak tożsamość jest Przenoszony przez etykietę i bar udziałowy używa jednego odcienia wyłącznie jako sygnał wielkości. A trend jest obecnie pojedynczą łączną serią, a nie czternastokierunkowym stosem: Pytanie, na które odpowiedzi jest "jest moim wzrostem przechowywania", a która kategoria Rosną w tym miejscu jest praca stołu, co dokładnie robi stół.
· kamo-shared-library
Policz każdy rodzaj przechowywanego pliku jako jego własną kategorię
Nagrania rozmów, poczty głosowe, załączniki do czatów, zasoby HR, marketing materiały, nagrania spotkań i wszelkiego rodzaju dokumenty to wszystko wiersze w imgach, Wyróżnia się tylko przez ImageAssocType i wszystkie dzielące się jednym wiadrem, ponieważ Związek jest raczej metadanymi niż granicą przechowywania. Zgłaszania ich jako Pojedyncza linia była dokładna i bezużyteczna: dla jednej organizacji produkcyjnej ukryła się 5,08 GB o powierzchni 5,09 GB to załączniki do czatu. Każde stowarzyszenie należy teraz do domeny, więc organizacja może zobaczyć, co to jest W rzeczywistości spożywanie jego przechowywania zamiast jednej niezróżnicowanej sumy. StorageDomainCoverTest sprawia, że pominięcie jest pominięciem porażką: każdy ImageAssocType musi być zgłaszany przez dokładnie jedną domenę — nieodebrane oznacza przesyłanie Są przechowywane i nigdy nie są rozliczane, twierdzi się dwa razy, co oznacza dwa razy. Zweryfikowany przez sonda: usunięcie HR_RESOURCE ze swojej domeny nie udaje mu się zbudować z tego powodu, Zamiast przechodzić spokojnie. MEETING_RECORDINGS sumuje zarówno swoje źródła, tabelę meeting_recordings, jak i MEET_RECORDING stowarzyszenie. MeetRecordingService pisze tylko te pierwsze, więc Nie nakładają się na siebie.
· EmailService
Zmierz własne skrzynki pocztowe KamoMail każdego orgi
Spaceruje na każdym skrzynce pocztowej Kamo hostuje i rejestruje, za dzień przyjazdu, RFC822 jest w niejedności uchwytów – nagłówków, korpusu i zakodowanych załączników, w każdym folderze, w tym Śmieci i śmieci, ponieważ wiadomość w "Taszle" jest nadal na dysku. Jedna podróż w obie strony na Folder: dostawca IMAP poczty Jakarta Mail rozszerza FetchProfile.Item.ENVELOPE na ENVELOPE INTERNALDATE RFC822.SIZE, więc wielkość i data przyjazdu docierają razem. O czym jest to, czy Dovecot ma referencje na adres, a nie Czytamy ustawienia dostawcy. Obecność w virtual_users JEST definicja "Kamo przechowuje tę skrzynkę pocztową", podczas gdy kolumna dostawcy może być nieświeża, odziedziczona Od rodzica, czyli połowy migracji. Skrzynka pocztowa hostowana przez Microsoft lub Google Nie ma poświadczeń i jest pomijany, więc jego organizacja nie jest obciążona. To, dla kogo się liczy, pochodzi z własnej skrzynki pocztowej org_id. KamoMail nie jest ani jednym Najemca - produkcja ma 18 skrzynek pocztowych w ramach jednej organizacji i 41 w ramach Kolejny, połączony w czterech domenach - więc sumowanie domeny lub maildir Wyznaczy jedną organizację na pocztę inną. Adresy są dopasowane do maleńki. Stół użytkownika Dovecot i ścieżki maildir są Małatka, podczas gdy stół pocztowy zachowuje wszystko, co zakrywa skrzynię pocztową, która została utworzona Z rozmieszczeniem sprawy tutaj już raz podzieli się dostawą i odzyskaniem W dwóch różnych maildirów. Chroni również /api/wewnętrzny jako całość, a nie punkt końcowy przez punkt końcowy. A w potyczce w tym, w tym, w pot wt. w tym, że w tym w tym, że w tym w, pon. w tym w, pon. w tym, że w pot wt. w tym w, w tym filtr o nazwie /api/internal/calendar i /api/wewnętrzne/chadowe kierunki indywidualnie, Tak więc następny sterownik zamontowany pod tym prefiksem – ten – byłby Osiągalny bez tajemnicy, cicho i w kierunku ekspozycji. 6 nowych testów obejmujących atrybucję, obsługę sprawy i niehostowaną sprawę; 152 Całkowite, wszystkie przechodzące.
· InitializerService
Schemat na pomiar przechowywania w skrzynce na pocztę
- uchwyty, na skrzynkę pocztową i za dzień przyjazdu, RFC822 bajtuje tę skrzynkę pocztową. Rachunkowość magazynowa nie miała uczciwego źródła dla bajtów skrzynek pocztowych: indeks wyszukiwania obejmuje tylko wiadomości, które zostały zindeksowane, oraz Obejmuje je bez względu na to, kto je przechowuje. ORG_ID jest zdenormalizowany z email_provider.mailboxes, więc per-organization Agregacja to jedna suma indeksowana, a więc pobyt w przypisie na skrzynkę pocztową — kilka Organizacje mogą być na KamoMail na raz, a jeden z domen może pomieścić Skrzynieczowe należące do różnych organizacji. Biegnij przeciwko produkcji 2026-08-08; tabela i indeksy zweryfikowane.
· kamo-shared-library
Zmierz pocztę Kamo faktycznie hostuje, na skrzynkę pocztową
EMAIL pochodził z e-mail_metadata.search_index, który był błędny w obu Dojazd. W całości brakowało KamoMail – org na KAMO_MAIL ma swoje wiadomości oraz załączniki w własnym klastrze Dovecot maildir, 62 MB w produkcji, Liczy się jako zero. I obciążyłby org w Microsoft 365 lub Google Przestrzeń robocza dla poczty siedzącej na dyskach tego dostawcy, gdzie Kamo nie zawiera nic Ale własny indeks wyszukiwania. - zastępuje go: na skrzynkę pocztową, za dzień przyjazdu, Całkowite bajty RFC822 — nagłówki, korpus i zakodowane załączniki, co jest tym, co jest tym, co jest Zajmuje się maildir. Chwytanie za dzień, a nie na wiadomość, utrzymuje stół Proporcjonalne do dnia z pocztą, a jednocześnie wpuścić dowolne okno rozliczeniowe Dokładnie to wszystko zamiast zaokrąglać do całych miesięcy. Uznanie jest na skrzynkę pocztową za pośrednictwem własnej org_id, nigdy na domenę i nigdy Pocztadir. KamoMail nie jest pojedynczym najemcą: produkcja ma już 18 skrzynek pocztowych Pod jednym orgiem i 41 pod drugim, zmieszane w czterech domenach w jednej tabeli. Sumowanie domeny lub maildir jako całości, obciążyłoby jeden org dla drugiego Poczta. Schemat zweryfikowany w produkcji przed wylotem: e-mail_provider .mailbox_storage_days istnieje z jego unikalnym ograniczeniem po biegu KI.
· kamo-internal
Powiedz, dlaczego pamięć skrzynki pocztowej może odczytać zero
Pocztoskopowe bajty liczą tylko pocztę Kamo hostuje. Organizacja nastawa Microsoft 365 lub Google Workspace mają swoje wiadomości na dyskach tego dostawcy, więc Wiersz skrzynek pocztowych jest legalnie 0 - co, niewyjaśnione, czyta się jako zepsuty Liczba zamiast poprawnej.
· BillingService
Pozwól administratorowi platformy uruchomić migawkę na żądanie
Jest to, co powoduje, że przeprowadzki okresowe i sumy życia dla Trudności z usuwaniem domen w ogóle są odpowiedzialne, więc dni stracone z powodu przerwy są stracone Na stałe, jeśli luka nie zostanie wypełniona. Czekanie na następny bieg 04:20 nie jest Plan naprawy. Zamiata już dopełnia 14 dni i jest idempotent per (org, dzień, domena), Tak więc powtarzające się połączenia rozliczają się, a nie podwajają. To po prostu to obnaża, za PlatformAdMTly i zwraca liczbę wierszy, aby dzwonił, mógł zobaczyć, że działa.
· kamo-internal
Pokaż wykorzystanie pamięci masowej na karcie Statystyki konta
Zakładka mówi "Nie ma danych dotyczących użytkowania dostępnych dla tego okresu" dla każdej organizacji. billingApi.getCurrentUsage() to czab powracający liczniki: [] i UsageMeters Renderuje swój pusty stan na zero metrów - więc komunikat był doniesienia o stub, Nie dane. StorageUsagePanel czyta prawdziwy punkt końcowy BillingService i pokazuje dwa Liczby, które łatwo się zmieszać obok siebie: co organizacja trzyma W tej chwili, która spada, gdy pliki są usuwane, i co dodała Żywotność, która nie. Obok nich, co przesunęło ten okres, i Awaria per-domain w dokumentach, skrzynkach pocztowych, mediach z wiedzy, spotkania Nagrania i ujawnienia. Gdzie figura jest raczej podłogą niż pomiarem, mówi tak – usunięcie Suma bez otwierającego migawki za nim lub całkowita dożywotnia dla obszaru przechowywania To trudne do usunięcia jego rekordów. Chip wyjaśnia podstawę rekordu: org jest Liczyła się za każdy plik, który posiada, mimo że Kamo przechowuje jedną kopię na hash. Tendencja sprawia, że tylko raz dwa dni historii istnieją; jeden punkt nie jest trendem, Rysowanie oznaczałoby historię, która nie została jeszcze zebrana. Kolory serii są potwierdzoną kategoryczną kolejnością – najgorszą przylegającą . CVD .E 9.1, Najgorsza sąsiednia normalna (E 19.6) na tej powierzchni. Trzy miejsce poniżej 3:1 Kontrast, więc tabela podziału nie jest dekoracyjna: jest to odczyt bezkolorowy Z tych samych danych. Byte counts pozostają ciągi do końca (BillingService serializuje Long via ToStringSerializer) i są rozszerzane tylko tam, gdzie wielkość jest niezwykle bezpieczna.
· BillingService
Zgłoś, co przechowuje organizacja
Zakładka statystyk konta zawsze mówiła "Nie ma danych dotyczących wykorzystania w tym okresie", dla każdej organizacji, ponieważ getCurrentUsage() in kamo-internal jest stub Przynosząc zero metrów i nic za nim nigdy nie zagregowanym magazynem. Serwuje trzy różne liczby na powierzchnię magazynową, plus ogółem: - co organizacja posiada w tej chwili, która spada, gdy pliki są usuwane - co dodała przez całe życie, co nie - co się poruszyło w bieżącym okresie rozliczeniowym Usuwanie jest uzyskiwane - nie ma znaczników przechowywania znaczników czasowych dezaktywacji, ponieważ EmbRecordState.DATE_UPDATED jest wstawialny. Otwarcie + dodano - bieżący w stosunku do migawki otwarcia okresu. Z niemą Otwierając migawkę, spada z powrotem do znaczników śmieci i zgłasza się jako Podłoga zamiast przedstawiać zgadywanie jako pomiar. Żywotność jest dokładna gdzie Usunięte rzędy przetrwają i gromadzą się z migawek tam, gdzie nie są; oba Powiedz, jakie są, więc UI też może. BillingPeriodResolver preferuje okres subskrypcji na żywo i wraca do Miesiąc kalendarzowy w strefie czasowej orgi. Ta opad jest całością funkcji w Produkcja: każda subskrypcja zawiera NULL current_period_start i current_period_end, więc bez niego dane dotyczące okresu byłyby puste dla każdego Organizacja, która istnieje – ta sama klasa błędów, co stub, który zastępuje. StorageSnapshotSweep pisze codzienną pozycję, od której zależy historia każdego orgi, Dogonić do 14 nieodebranych dni i rozsiewanie pierwszego migawki z zapytania Żywotność, więc śledzenie nie uruchamia się ponownie na zero. Raporty o punktach końcowych platformy rozliczeń przeciwko fizycznie przechowywanym bajtom. Klienci są rozliczane na rekord; img_dats posiada jedną kopię na hash, jak wiele orgów ma Ten plik, miniatury i zwroty kosztują bajty, za które nikt nie jest rozliczany. Oba Luki są ekonomią Kamo, więc siedzą za PlatformAdminly. 21 nowych testów, łącznie 113, wszystkie przechodzące.
· InitializerService
Schemat runner dla org_storage_snapshots
Lustra OrgStorageSnapshot jako wyraźny DDL, według stylu domu — ddl-auto Najpierw tworzy tabelę, więc CREATE jest odwrotnością, a SET DEFAULTs są Co faktycznie sprawia, że jest użyteczny z prostego SQL (Hibernate nie emituje żadnych domyślnych kolumn Za wartości, które jednostka wypełnia w Javie). Indeksuje również (ORG_ID, DATE_CREATED) i (ORG_ID, DATE_TRASHED). Przechowywanie Agregacja odczytuje zarówno na każdym żądaniu podsumowania, jak i na istniejące indeksy W kształcie assoc- i folder. Biegnij przeciwko produkcji 2026-08-08; org_storage_snapshots zweryfikowane ze wszystkimi 16 Kolumny i jego unikalność ograniczają się przed zepchnięciem jednostki współdzielonej libicznej.
· kamo-shared-library
Model wykorzystania do przechowywania wzorowania na organizację
Nic nie zostało streszczące się w magazynie na organizację. Sześć podmiotów nosi bajt Liczba na plik, a żaden z nich nie zagreguje kod, dlatego konto Zakładka statystyk renderuje "Nie ma danych dotyczących użytkowania w tym okresie" dla każdego org. Dodaje wspólny model, którego wymaga agregacja: - StorageDomain — pięć lubgowych obszarów składowych, z których każdy deklaruje Czy jego usunięte rekordy przetrwają. Dokumenty i KB media soft-delete, więc Całkowita wartość dożywotnia to proste zapytanie; skrzynki pocztowe, nagrania i ujawnienia Twarde usunięcie, aby ich mógł gromadzić się tylko do przodu. - OrgStorageSnapshot — jeden rząd na (org, dzień, domena). Istnieje ona dla trzech Liczby, które są nie do odzyskania po fakcie: sumy dożywotnie dla Domy twarde, pozycja otwierająca, pozycja otwierająca, że przeprowadzki z okresu są Odróżnione przeciwko (bez znaczników czasu stołu dezaktywacja – EmbRecordState DATE_UPDATED jest wstawiwalny. Liczba ustalona po zakończeniu okresu. - OrgStorageAggregator — każda agregat na domenę w jednej klasie. Suma jest Sfałszowane nad rekordami, nigdy nad przechowywanymi obiektami: img_dats zachowuje jeden fizyczny Kopiuj na hash, jak wiele orgów trzyma ten plik, a ta oszczędność należy do Kamo. Agregator celowo nie ma stereotypu. Każda usługa działa "ComponentScan ("com.kamo"), więc dopisanie go do montowania go we wszystkich 40 euro BillingService deklaruje fasole. Dodaj również zapytania o indeks wyszukiwania, których wymaga zasypania rozmiaru wiadomości e-mail — size_bates Został napisany jako zakodowany 0 od czasu utworzenia indeksu, więc przechowywanie skrzynek pocztowych Czyta się jako zero bajtów w całej całej platformie, dopóki te wiersze nie zostaną naprawione. Schemat zweryfikowany w produkcji przed tym wylądowaniem: org_storage_snapshots istnieje Wszystkie 16 kolumn po uruchomieniu KamoInitializer.
· InitializerService
Ogłosić podział aplikacji .
Zaplecznik wypełniał tylko rząd planu, którego brakowało – celowo, więc nie mógł po cichu Przesuń poziom – który pozostawił aplikacje, które nigdy nie były wyceniane, gdziekolwiek je po raz pierwszy umieściły. Punkt sprzedaży Narzędzia marketingowe skończyły się na darmowych w ten sposób, co nie jest tym, czym Free jest sprzedawany. Zakotwiczenie tego, co każdy plan już obiecuje na stronie cenowej, więc matryca i kopia marketingowa Nie można dryfować: darmowa jest ocena (CRM, czat, docs, notatki, KB, kalkulator); Starter dodaje aplikacje a Handel biznesowy z (wsparcie, handel, marketing); Firma dodaje zestaw premium plus telefonię, Inwentaryzacja i klub; Enterprise dodaje Legal. Napastnik i dwa systemy pochodzenia pasują Do żadnego poziomu – e-mail jest wyceniony za miejsce na dowolnym planie, systemy inicjowania są negocjowane na pożyczkodawcę. W przeciwieństwie do zasypu, który godzi, a nie wypełnia luk, co jest celem bycia źródłem Prawda: zmiana poziomu należy tutaj, w recenzji, a nie w edycji interfejsu użytkownika, następny bieg powróci. Stosowany do prod: 11 rzędów uległo zmianie. POS i Marketing wolny, a także cztery niepublikowane aplikacje, które otrzymały Na poziomie wylądują, gdy będą wysyłać, więc publikowanie jednego jest odwrotem scenicznym, a nie zmianą danych. Drugi bieg zgłasza zero zmian.
· kamo-internal
Podziel aplikacje i funkcje w dostępne / Niedostępne / Zreprecjacja
Jedna płaska lista mieszanych aplikacji, które platforma oferuje z tymi, które nie oferuje i z nich Przeszedł na emeryturę, więc operator musiał przeczytać każdy chip, aby je odróżnić. Wiadra są ekskluzywne, a deprecjacja jest najpierw testowana: emerytowana aplikacja to Emerytował niezależnie od tego, co wciąż mówi flaga dostępności, więc pojawia się tylko pod Zrędmuchowany. To również sprawia, że chip na rzut "Deprecated" i ściemnianie Zbędny – każdy rząd w tej karcie jest wycofany – więc oba zniknęły. Rozróżnienie odczytuje stan serwera, a nie projekt, więc zaznaczając przestarzałe Przełącznik pozostawia rzęd w miejscu, aż do wyładunku ziemi, zamiast wyrwać go Z poddaniu edycji.
· SecurityService
Katalog aplikacji do odczytu najemcy dla Branch Types
Typy oddziałów -> Dopuszczone aplikacje zaczęły ładować listę aplikacji z /platform-config/app-catalog, które Wymaga właściciela orgi najwyższego poziomu. Strona hosta jest ogrodzony na CONFIGURE_SYSTEM, więc dla każdego Najemca GET 403'd: edytor udostępnił zero aplikacji, a następnie odmówił zapisania Model bezpieczeństwa w ogóle - blokowanie jego nazwy, przedziału wiekowego, ról i rodzajów handlu, z których żaden Zaangażuj katalog. Nie udało się również administratorowi KamoCRM bez isOrganizationOwner. Służy ten sam rozwiązany katalog w ramach CONFIGURE_SYSTEM, jako Celowo węższy projekcja: typ, nazwa wyświetlacza, opis, scena, dostępny, przestarzały. Brak uwagi operatora, brak niewykonania zobowiązań, brak diagnostyki uprawnień - te opisują, jak wygląda platforma Uciekaj, a pisze, aby pozostać platformą-właścicielem.
· kamo-internal
Dodaj zakładkę Aplikacje i funkcje i napraw listę Dozwolone aplikacje
Nowa zakładka, na prawo organizacji, kontroluje to, co każda organizacja Oferowane jest: dostępność, etap rozwoju, nazwa wyświetlania, opis, a Uwaga operatora i deprecjacja. Dostępność nie pochodzi już ze stadium, Tak więc aplikacja może zostać opublikowana, gdy jest jeszcze w testowaniu lub zatrzymana po tym, jak jest Skończony; teraz jeździ tylko odznaką i poprzeczką. Pojami są nadmierne pola Oznaczone i odwracane indywidualnie oraz deprecjacja — która ukrywa aplikację przed Każdy najemca korzystający z niego — potrzebuje nazwy aplikacji napisanej do potwierdzenia. Dozwolone aplikacje w edytorze modeli zabezpieczeń był ręcznie zachowany TypeScript Kopia ServiceType.java, z komentarzem z prośbą do redaktorów o jego dostosowanie. Odpłynęła, niewidzialnie: - MLOS zabrakło całkowicie, więc żaden model bezpieczeństwa nie mógł przyznać kredytu hipotecznego W ogóle początkowa. - LOS został oznaczony jako "Mortgage Loan Origination System" - oznacza to osobiste Pożyczki od zmiany nazwy 2026-08-08, więc redaktor napisał osobiste pożyczki Dotacja dla operatora, który myślał, że udziela kredytu hipotecznego. - POS i ESIG pokazały PLANOWANIE długo po wysłaniu. Dodanie wskaźników dostępności do tej listy wystarczyłoby Z pewnością źle, więc teraz czyta ten sam katalog, który zapisuje nowa zakładka i Nie można się z tym nie zgodzić. Oszczędzanie jest blokowane, aż katalog załaduje: każdy AppKonfiskator budujący go iter, więc pusta lista pozbawiłaby Dotacje modelowe.
· SecurityService
Przesługij katalog aplikacji i przeczytaj przez niego funkcje
CeatureController "jest tą aplikacją oferowaną" z etapu enum w czterech Oddzielne miejsca, więc odpowiedź można było zmienić tylko poprzez przesunięcie Platforma. Każdy z nich czyta teraz AppCatalogService wraz z Wyświetl nazwę, opis i deprecjacja. Jedyną subtelnością behawioralną jest brama root-org. Kiedyś czytał "scena jest Nieumożliwione, więc orgi dziecięce mogą tego nie umożliwić” – ścieżka karmy dla psów. To się stało. Teraz czytamy: „platforma nie oferuje tego obecnie”. Podczas gdy nie jest nadpisem Istnieją takie same zdanie, ponieważ nie można ustalić, aby zachować ich, aby Scena - kompetanta. Gdy operator publikuje aplikację, która wciąż jest w Testowanie, tylko nowa forma robi to, co należy: bez tego aplikacja Zachowaj cicho zablokowane dla każdego orgi. PlatformAppCatalogController jest zamknięty dla właścicieli najwyższego poziomu zorg, tak samo Publiczność jako sąsiednich zakładek platform i raportuje, czy jest dostępny Aplikacja jest w rzeczywistości w macierze planu - aplikacja, o której nie wspomina plan, za pomocą Ustawienie nieudanego, a nie poprzez wszystko, co wybrał operator.
· kamo-shared-library
Uczyń dostępność aplikacji i edytowalne scenę w czasie uruchamiania
Każdy atrybut renderuje strona aplikacji — wyświetlić nazwę, opis, Etap, deprecjacja — był stałą stałą w enum ServiceType, A "Available" nie był w ogóle przechowywany: został wyprowadzony jako etap - KOMPZOWANY W interfejsie użytkownika i w trzech miejscach po stronie serwera. Zmiana wszystkiego oznaczała edycję Biblioteka współdzielona i przesunięcie platformy. PLATFORM_APP_CATALOG posiada jeden wiersz na aplikację z każdą kolumną nadpisową Unieważne, a AppCatalogService rozwiązuje nadpisanie ?? enum. Brakujący rząd Oznacza enum dosłowne, więc instalacja tego nie zmienia żadnego zachowania. Dostępność staje się własną wartością, co sprawia, że jest to miękki start (oferowany Podczas gdy nadal TESTING) lub wstrzymany plik zbiorczymi aplikacją ekspresjowalny. Jego upadek Czyta etap RESOLVED, a nie enum, więc operator, który tylko się porusza Aplikacja do kompilacji uzyskuje dostępność bez przełączania przełącznika.
· InitializerService
Jeden prawidłowo skategoryzowany wiersz katalogowy na aplikację, na każdym korzeń uprawnieniach
Dziewięć aplikacji - POS, Narzędzia marketingowe, Kalkulator, Klub, Inspekcje, Prawne, Gry i dwie Systemy pochodzenia — nie miały w ogóle reprezentacji katalogowej: bez rzędu cen, żadnej kategorii, bez poziomu. Dwunastu innych zostało już opisanych w wierszu marketingowym, więc wiążąc te i dodając równoległość APP_- row dałoby jeden ServiceType dwa wiersze i zlecone planowanieDokładneZależność od Porządek iteracji. Biegacz zbiega teraz zamiast tego katalog: - wiąże opublikowany wiersz marketingowy z aplikacją, którą opisuje (VIDEO_CONF to Meet, MESSAGING is Chat), Utrzymanie kodu, nazwy, kategorii i wartości poziomów, aby opublikowana matryca nie poruszała się; - tworzy wiersz dla aplikacji, której katalog nie opisuje, w kategorii rzeczywistej - w tym nowy Commerce & Origination kategoria; - promuje każdy wcześniejszy symbol zastępczy APP_a do swojej prawdziwej tożsamości i usuwa płaskie Aplikacje Wiadro raz puste; - usuwa duplikaty wierszy dla tej samej aplikacji, preferując wiersz marketingowy. Nie ma APP_ fallback: każda aplikacja ma czytelny kod i aplikacje opublikowanego katalogu Już teraz nazwy ponownie zastosują ten dokładny kod, tak org z własną matrycą i jednym bez opisu Ten sam produkt identycznie. To miało znaczenie - sign.pink nie ma matrycy marketingowej i został z Jedenaście rzędów nazwanych na cześć stałych enum stałych. MLOS i pożyczki osobiste są negocjowane przez przedsiębiorstwa, nie na miejsce: zerowa cena, model cenowy FLAT, Kompatybilny tylko z planami typu CUSTOM (Enterprise), włączony do poziomu bez poziomów. Są one tworzone na Tylko org platformy - produkt białej etykiety nie odsprzedaje go, a dwa stworzone na Znak.pink przez wcześniejszą przepustkę są dezaktywowane. Zweryfikowany przeciwko prod po uruchomieniu: 0 kodów APP_ pozostało, 0 zduplikowanych wierszy typu service_, 21 aplikacji na Każdy korzeń, 0 odsłonięte kombinacje planu po aplikacji i ponowne uruchomienie jest no-op.
· kamo-internal
Konsola organizacji pagowanych przez serwery
Zakładka załadowała każdą organizację w jednym żądaniu i każda z nich wystawił kartę, Z backendem wybijającym się za pomocą orgudu, a następnie na konto, a następnie na subskrypcję. Wyszukiwanie, sortowanie, filtrowanie i uruchamianie strony serwera teraz przeciwko całemu posiadłości, Koszt strony jest płaski, bez względu na to, ile organizacji istnieje. Rząd jest również właściwym przedmiotem. Subskrypcja jest HELD przez konto i TARGETS a org, więc stara karta - na kluczu na posiadaczu - musiała wydrukować Nazwa celu wewnątrz zagnieżdżonego stołu, a orgs klient pojawił się jako sznurki Wewnątrz innych rzędów orgsa, a nie jak rzędy. Każdy rząd ma teraz uprawnienia (przychodząc: co rządzi tym orgiem) i rozliczaniem (odliczanie: za co to za rachunek Inne) jako oddzielne aspekty. Projekt: szyna statusowa w dół lewej krawędzi każdego rzędu i proporcjonalny pasek nieruchomości, Tak więc strona czyta się jako kolorowy histogram zdrowia komercyjnego, zanim słowo brzmi Czytaj; numery tabelarne z wyciszeniem zerami, ponieważ większość komórek na osiedlu rozliczeniowym Są zerowe. Stan stołu żyje w adresie URL, więc filtrowany widok jest łącznikowy - napisany poprzez kopię, która zachowuje "tab" i bez publikowania activeTab, który Należy do tabSync.
· SecurityService
Nieumieje zamknięte w aplikacjach, o których nigdy nie wspomina plan
Odrzuca kamo.entitlement.fail-open teraz, gdy AppEntitlementCatalogMigration startuje przeciwko Prod i każdy aktywny plan obu korzeni upraw (KamoCRM, Sign Pink) zawiera wyraźny Rząd dla wszystkich 21 aplikacji innych niż podstawowe — zweryfikowane zero odsłonięte kombinacje planu po aplikacji, więc jest Nic nie zostało, aby zaprzeczyć domyśle, aby złapać, z wyjątkiem naprawdę niespodziewanej aplikacji. Nie zmienia to tego, z czego żaden org może dziś używać: wysyłane aplikacje są wyraźnie zawarte, a MLOS A aplikacja do wypożyczania osób fizycznych została już odrzucona przez jawne, zawierane rzędy, które wiążą Bez względu na tę flagę. To, co zamyka, to aplikacja prześlizguje się przez niespodziewaną, nigdy nie pojawiając się W matrycy planu w ogóle. Odwróć się do prawdy, jeśli dodanie nowego korzenia uprawnień zostanie dodany, zanim migracja będzie na to potrwać.
· BillingService
Podawaj katalog org jako filtrowaną, posortowaną, pagowaną stronę
GET /orgs przyjmuje stronę/rozmiar/k/sort/r plus siedem filtrów i zwraca dom Koperta stron z agregatami o powierzchni. GET /orgs/'orgId' serwuje pełne szczegóły Do szuflady wiercenia konsoli, gdzie wentylator na znajd. Wspaniały na znajdowanie na znajdowanie jest w porządku, ponieważ Jest związany z jednym orgiem. ListAllOrgs() jest raczej wymieniany niż przechowywany jako delegat okrojenia: Dokładnie jeden rozmówca (ten kontroler) i lista frontenduOrgs() miała dokładnie Po jednym (zakładka jest przerobiona), więc kapsima kompatybilności tylko dodałaby Ryzyko cichego wymkszania bez zależności od niego.
· BillingService
Nawodnienie stron przy stałej liczbie zapytań
Tytuły rodziców, domena podstawowa, plan/rynek za uprawnieniem i Flaga subskrypcyjna kaskalogu jest po jednym naciągniętym IN (:ids) na całej stronie, Tak więc strona w 100-rzędowej kosztuje tyle samo sześciu instrukcji, co strona 1-rzędowa. Test Twierdzi, że równość bezpośrednio – wdrożenie, które to zastępuje, byłoby wynikiem 6 przeciwko 600. Subskrypcja regulująca jest wybierana przez EntitlementModeResolver, ten sam kod To zadecydował o trybie wiersza, więc pokazowy plan zawsze należy do państwa Pokazane. Zapytania przechodzą przez EntityManager zamiast nowych metod repozytorium Kamo-shared-library, od którego zależy każda usługa, nie musi się zmieniać.
· BillingService
Wiosek katalogowy / strona DTO i natywne repozytorium zapytań
PlatformOrgRow posiada dwa aspekty oddzielnie: uprawnienia (inbound subs Celowanie w org - co nim rządzi) i rozliczanie (rachunki posiada org - niezerowe tylko dla org platformy i sprzedawców). Agregaty opisują Cały filtrowany zestaw, a nie strona, więc pasek KPI nie zmienia znaczenia, jak Strony operatora. Każda wartość kierowcy jest zmuszana przez numer/Boolean zamiast rzucać: Węzeł(...,0), który nie pasuje do rzędów, zwraca liczbę osób, w których ta sama kolumna Rządy powracają Long, który minął w dev i rzucił w prod. Pieniądze przekraczają Drut jako sznurek dziesiętny.
· BillingService
Org katalog SQL z CTE na twarz
Konta przetrzymywane, subskrypcje przychodzące, członkowie, licencjobiorcy i dzieci Sekreg w ich własnym CTE przed dołączeniem do orgs. Dołącz do nich w jednym Przepustka mnożyłaby się i napomniała każde SUM. Czyste i jednostkowe testowane (26 testów): nie ':' odlewy, każda wartość graniczna, sort klucze Białe miejsce przez OrgSort. Dwie rzeczy testowe pin, ponieważ są łatwe "tidy" w błędach - PRZEWODA BY i pochodne predykaty (mode_rank, has_stripe) Należy nazwać kolumny projektowane przez CTE podstawę, ponieważ alias „o” jest poza zakresem działania w pytaniu na zewnątrz; i badanie PENDING nie ma terminu, a nie Najnowszy wygasł jeden. Zweryfikowany przeciwko klasterowi żywemu: oba stwierdzenia są wykonane, liczenie zgadza się Z rzędami, a także filtry / agregaty obowiązują. Wykorzystanie indeksu nie jest demonstrowane - W cenie 12 orgs / 9 subs CockroachDB pełnoskanuje niezależnie od, poprawnie.
· BillingService
Zatwierdzona, zaciśnięty lubg prośba katalogu
Rozmiar zacisków do [1,100] i nierozpoznany sort spada z powrotem do tytułu, więc a więc rękodzieło ewawizowane URL nie może żądać całościowego spadku ani nie docierać do SQL jako Słupka za darmo. OrgSort enum jest rodzajem białej listy.
· BillingService
Derive trybu uprawnienia poprzez wspólny, deterministyczny deterministyczny desolwator
TrialAdminService wybrało subskrypcję próbną z findFirst () Nieuporządkowane listy, więc orgia z udziałem zarówno oczekujących, jak i aktywnych prób może Zgłosić też. Nadchodzący katalog organizacji musi sortować i filtrować Ten stan i zapytanie nie mogą odtworzyć zasady niedeterministycznej. Pierwszeństwo żyje teraz w . wśród Próby na żywo, aktywne wygrane nad oczekującymi zwycięstwami powyżej wygasły, a aktywny wygaśnięcie Zgłoszony jest najnowszym. status() zachowuje dokładny kształt reakcji. Pierwsze testy w tym repo (11).
· InitializerService
Backfill app-rzędy uprawnień do katalogu planu platformy
Uprawnienia teraz rozwiązuje się na kolumnie typu service_type, ale nie przenoś żadnego wiersza katalogu, więc Każdy plan nadal wiązał się z „wszystko włączone” poprzez niewykonanie zobowiązania. To ziarno Matryca, więc kamo.entitlement.fail-open można ostatecznie wyłączyć bez aplikacji z ciemnego wypalania. - AppEntitlementCatalogMigration (?(51), po PlatformOwnerPlanSeeder): idempotent Zastój. Tworzy kategorię funkcji "Aplikacje" z jednym wierszem BOOLEAN na aplikację non-core Związany z serwisem, ponownie wiąże każdy wcześniej istniejący wiersz, który ma kod, ale nie serwisType, i wstawia brakujące wiersze do planu na poziom. Wstawianie-jeśli brakuje tylko - Nigdy nie usuwa i nigdy nie nadpisuje operatoraIncluded, więc poziom edytowany w Ustawienia UI przetrwają rebooty. Również ponownie łącz istniejące VIDEO_CONF / AI_ASSISTANT / HR_SYSTEM / ESIGNATURES / EMAIL_HOSTING dodatki, które nie przyznawali nic. - KamoCRMPricingLoader: ta sama matryca dla świeżego klastra. W rzędy aplikacji są dołączane do wewnątrz upsertFeatures zamiast pisać w drugim przejściu, ponieważ upsertPlanFeatures usuwa Planowe wiersze przed wstawieniem – drugie połączenie po cichu wyczyściłoby matrycę marketingową. Notatka Ta ładownica jest wyłączona (wczesne zwroty, a jego połączenie DataLoader jest komentowane), co oznacza Dlaczego migracja powyżej jest ścieżką produkcyjną.
· SecurityService
Bramka hipoteczna i pionowa z pożyczkami personalny na uprawnieniach do aplikacji
Rynek MORTGAGE pojawił się na/handlu za każdym razem, gdy POS był włączony, niezależnie od aplikacji MLOS, oraz /features/enable nie miał w ogóle kontroli rozliczeniowej — kłódka w ustawieniach UI była prezentacją Tylko tylko, a następnie POST włączył się w niezatytułowanej aplikacji. - FunkcjaController: 403 w włączeniu, gdy plan nie zawiera aplikacji; serializuj "Zatytułowany" werdykt na obu funkcjach[] i dostępny[], więc kłódka UI i 403 są Obliwiany przez tę samą usługę i nie może się nie zgodzić. - CommerceMarketController: GET / dozwolone typy dla pickera typu rynkowego (model dopuszczenia na listę modeli Przecięto z uprawnieniami); lista rynkowa spada niezatytułowane piony – ukryte, nigdy Zarchiwizowane, więc przywrócenie planu przywraca rynek z nienaruszonym stanem danych. - - nie zamkniętą straż na każdym rynku /marketId /... sub-route. AppAvailabilityInterceptor nie może tego wyrazić — jego mapa przedrostka jest jednym z prefiksów do jednego SerwisType i /commerce-markets obsługuje wszystkie siedem pionów w ramach POS. - POSController: publiczni dzwoniący w katalogu subskrypcyjnym nie widzą już wierszy związanych z aplikacją To nie osiągnęło KOMPLETED, więc przenoszenie ServiceType do COMPLETED jest tym, co publikuje go na Strona marketingowa. Wewnętrzni dzwoniący nadal widzą wszystko, aby wyceniać je wcześniej. - HiptgageVerticalResolver: gotowość mierzona tylko POS, więc org, który nigdy nie kupił MLOS Czytaję jako gotowy; teraz informuje o MLOS w "brakuszeniu".
· kamo-internal
Zinnowacja LOS na MLOS, dodaj Personalny system inicjowania pożyczek, bramy pionowe
Zakładka aplikacji pokazuje teraz "Commerce: Mortgage Loan Origination System" (tytuł jest obsługiwany z serwisu Zaplecze enum, a nie lustro TS) i nowy "commerce: Personal Loan Origination System" Nie dostępne. Rynki MORTGAGE i PERSONAL_LOANS są zamknięte w swojej aplikacji. - Aplikuj/ServiceType lustra: MLOS(14) + nowy LOS(25); również naprawia istniejący dryf, gdzie Lustro nie zgadzało się z enum Java. - Organizacja: jest dodana; isLos oznacza teraz pożyczki osobiste. to zero konsumentów. - FunkcjManager: Gating odczytuje flagę "zatytułowaną" flagę. Został przebudowany po stronie klienta Od billingApi, którego getCurrentSubscription rzuca i getAvailablePlans powraca [] (dziekacja stubs), więc każda aplikacja po cichu postanowiła "wysatać" i nigdy nie renderować kłódki. - Rysownicy rynku: zarówno strony twórz, jak i edytują, posiadały własną, zakodowaną w twardej tablicy COMMERCE_TYPES; Teraz renderują GET - więc pionowy org nie kupił, jest Nie do wyboru. Strona edycji pomijała również regułę jeden-MORTGAGE-per-org. To się utrzymuje Aktualny typ rynku do wyboru, więc wygasły org może nadal go otwierać i zmienić nazwę. - Powierzchnia hipoteczne bramy powierzchniowe na isMlos zamiast ispos.
· kamo-shared-library
Uprawnienie aplikacji przez ServiceType; zmienić nazwę LOS na MLOS
Uprawnienia rozwiązane ServiceType.name() przeciwko . Kody katalogów to kody marketingowe (USERS, VIDEO_CONF, HR_SYSTEM, ...) i nigdy nie pasują, Tak więc planFeatureDokładnie niewykonania zobowiązania do brakującego rzędu, przyznając każdą aplikację na każdy plan — rozliczeniu do aplikacji Link był obojętny. Rządy katalogowe mają teraz typowany zerwalny plik typu typu uciążliwy plik_typ i rozdzielczość przechodzi Jest to więc aplikacja może zostać przemianowana bez przenoszenia uprawnień. - > typowa kolumna typu (wytrwała jako id). - determinacja przez ServiceType; dodatki honorowe za pośrednictwem Wcześniej nieprzeczytany - jsonb; zachowanie w rzędzie Za kamo.entitlement.fail-open (domyślnie true do czasu rozstawienia matrycy katalogowej). - Subskrypcja: przenoś usługęPrzejjem przez create/aktualnie/DTO i wylicz app_code Z nazwy po pominięciu — okno dialogowe ustawień nigdy nie zostało wysłane, więc każdy utwórz z UI uderzyło w nie NULL constraint. - CommerceType: wiąże każdy pion z wymaganą aplikacją (MORTGAGE->MLOS, PERSONAL_LOANS->LOS). - AppliedModelEnforcementService: getAllpardCommerceTypes przecina model bezpieczeństwa Uprawnia z uprawnieniami; assertCommerceTypeAllpord już obejmuje tworzenie i edytowanie. - SerwisType: LOS -> MLOS utrzymujący id 14 (ORG_FEATURES utrzymuje id, a nie nazwa, więc nie Migracja danych); nowy LOS(25) dla pożyczek osobistych – id 25, ponieważ ponowne wypisanie 14 zostałoby ponownie przypisane Każdy istniejący rząd hipoteczny. - RoleRightType: MLOS_ odbicie, ids 139-144 bez zmian; personal-loan LOS_ dodano na 190-195. - PhiModule.PLOS dodał: zmienić nazwę aplikacji na pożyczki osobiste napisanym na hipotece PHI Moduł i kredyt hipoteczny nieobjęte, które kompilowały czysto.

Twój wszechświat czeka.
Rozpocznij bezpłatnie w kilka minut.Dodaj produkty, kiedy tylko będziesz gotowy — bez migracji, bez nowych logowań.
Bezpłatne na zawsze — nie wymaga karty kredytowej