Probe 마스터 모델 엔드포인트 및 수정 적용모델 org ID
- applyModel.source 기반 게이트를 직접 프로브로 교체 /api/security/master-model on mount; r.ok=false (409)는 org를 의미합니다 분기 유형에 의해 지배된다 — 같은 체크 백엔드 사용 - useAppliedModel에 null을 ...
Gate censorship tab options by applied model constraints
- Hide EDIT MASTER MODEL button when org is governed by a branch type (use appliedModel.source instead of unreliable org context branchTypeID) - Hide ATF fiel...
URL 쿼리 params의 활성 mailbox
현재 URL을 업데이트 (?mailboxType, ?mailboxId, ?mailbox) 브라우저가 같은 mailbox를 복원합니다. MessageBrowser는 읽기 window.location.search 그 게으른 useState 초기화기 복원 activeMailbox 첫 번째 렌...
Mark-as-read and message fetch for shared/member mailboxes
Classic mode now loads shared mailbox messages via the correct /messages/{folder} endpoint (was calling the non-existent /conversations endpoint). Fetching a fu...
Mark-as-read for shared and member mailboxes
EmailController.setFlags now accepts an optional mailboxId query param and routes through resolveProviderWithMailbox so member-mailbox flags are set against the...
Show accurate provider connection status from isConnected field
Replaces the old logic that showed "Connected" for any provider with no sync error (including brand-new providers that were never tested). New three-state badg...
Persist connection test result to isConnected field
- test() endpoint saves isConnected=true/false to DB after every health check - update() resets isConnected to null when configJson changes (credentials may h...
Add isConnected field to VoipProviderInstance
Nullable Boolean: null = never tested, true = last test passed, false = failed. Requires KamoInitializerService schema migration to add IS_CONNECTED column.
Use extensionId as external ID, not Relay node id
FreePBX returns the same Relay id (ZXh0ZW5zaW9uOg== = "extension:") for every extension because the id field is not populated. Using it caused all extensions to...
ClassCastException을 방지하기 위해 getMessage에서 IMAPInputStream 처리
JavaMail 대신 IMAPInputStream을 반환할 수 있습니다. part.getContent() 메시지 내용이 예쁘지 않은 경우. 더 보기 직접 (String)는 parseMultipart () threw ClassCastException에 캐스팅 영향을받는 메시지, fetch...
라이브 밀리 초 카운트 다운과 활성 제안 배너보기
Home 페이지에 활성 프로모션 서버 측을 Fetches하고 렌더링합니다. HeroOfferBanner는 하위 헤드 라인과 무료 통화 중입니다. 배너는 할인 금액, 기간 및 라이브 카운트 다운을 보여줍니다. *********** at 50ms) 애니메이션 gradient-glow 국경과...
와이어 사용 가능 / 사용 가능한 스위치 백엔드 및 수정 OFFLINE 존재 버그
- Paused/Active 칩을 NavTop에서 사용 가능 / 사용 가능 - 새로운 me/availability API를 통해 산과 persist toggles에 대한 초기 가용성 - 회원 인터페이스 및 MemberItem prop에 isAvailable 필드 추가 - MemberLi...
살아있는 schema introspection에 대한 모든 GQL 쿼리 / mutations를 보충
모든 필드 이름과 실제 FreePBX 17 스키마에 대한 유형 확인. 개정의 가득 차있는 세트: 질문: - fetchAllExtensions: 확장에서 non-existent 'voicemail' 필드를 제거 - fetchAllUsers → allCoreUsers { coreUser ...
SelectFolder를 ThreadDetailView로 전달하십시오
chat.folder는 Java ConversationEntity로 항상 정의되지 않습니다. folderIds (text[])는 폴더 문자열 필드가 아닙니다. 이것은 loadThread를 call markConversationRead 및 그 후 이메일 발송:폴더 변경 폴더:undefin...
GraphQL 필드 이름 fetchAsteriskDetails
FreePBX API는 "Did you mean fetchAsteriskDetails?"를 반환합니다. - 건강 이름을 바꾸십시오. 쿼리 및 그 데이터 경로 accessor에 따라 확인합니다.
XHR/Accept 헤더 및 문자열 응답을 GraphQL 클라이언트로 파싱
FreePBXTokenCache와 같은 패턴: X-Requested-With + Accept: application/json FreePBX의 HTML 리디렉션 응답을 억제하고 모든 3 개의 호출 사이트를 전환 (queryOnce, restGet, restPost) 의 응답Entity<J...
Sync mailbox dropdown 에 기본 mailbox 에 로드
SelectMailbox가 초기화되기 때문에 첫 번째 목록 항목에 기본적으로 드롭다운 mailboxId없이, currentValue가 'personal'으로 해결하기 위해 어떤 옵션이 없습니다. 이제 선택된Mailbox를 1 차 (또는 first) mailbox 접근 가능한 우편함 짐.
파일 업로드 크기 제한 500MB
봄 부트는 1MB에 모자 multipart 부속, 배경 이미지를 일으키는 원인이 되었습니다 으로 실패 500 요청에.getParts(). SecurityService의 일치 기존의 500MB의 한계 그래서 APIService는 큰 파일 업로드 할 수 있습니다.
Surface HTTP errors 그래서 업로드 실패가 표시됩니다
Un-OK 상태에 thrown Error를 가진 Silent console.warn를 대체했습니다, 그래서 사용자는 실제 실패 이유 (status + 응답 몸)를 참조 대신 침묵으로 계산을 업데이트합니다. console.log 추가 몇 가지 새로운 이미지가 누락되는지 추적하고 POSTe...
토큰 엔드포인트에 대한 Accept+XHR 헤더와 raw-string 응답 패싱 추가
FreePBX는 클러스터 DNS를 통해 호출 할 때 텍스트 / HTML을 반환했습니다. Host header는 구성 된 PBX HOSTNAME과 일치하지 않았습니다. 더 보기 수락: application/json 및 X-Requested-With: XMLHttpRequest는 FreeP...
애니메이션 컨트롤을 통해 최소화된 tab 엔트리를 구동
Animate={...} 를 animate={tabControls} 로 바꾸기 생기: tabControls에는 산에 queued 표적이 없습니다, 그래서 단추 체재했습니다 처음 { y : 100 } 위치 (아래 화면). useEffect 추가 명시적으로 y를 시작 위젯State에 key...
FreePBX API에 대한 정확한 OAuth2 범위 문자열
FreePBX 범위는 최상위 식별자입니다: 'gql' (모든 GraphQL) 과 'rest' (모든 REST). 'gql:read' 형식은 모듈의 GQL을 의미합니다. invalid scope 400 오류가 발생하지 않는 'read'로 이름을 붙입니다.
Live 읽지 않은 배지 + 새로운 에이전트 메시지에 반송
- 위젯이 최소화되는 동안 LiveSupportPanel 마운트 오프 스크린 유지 (지원 세션이 존재하는 경우) 그래서 STOMP 구독은 살아있고 onUnreadMessage 화재가 들어오는 에이전트 메시지 방문자가 채팅을 찾고 있지 않습니다. - 모든 카운트 변경에 스프링 스케일을 가...
ClusterIP 서비스에 직접 8088 노출
서비스는 항구 80→8088 매핑이 있었습니다. 내부 서비스 *************** (예: VOIPService API 토큰 요청) 포트 8088가 듣지 않았기 때문에 타이밍되었습니다. 클러스터IP.
Trust backend pendingCount, 드롭 클라이언트 오프셋
Backend pendingCount는 이제 읽지 않은 기반 (counts SUPPORT TICKET 세션)입니다. 소유자의 lastViewed보다 더 새로운 메시지). 에이전트가 열릴 때 티켓, markAsRead → 백엔드 방송 → frontend는 새로운 반영 자동 계산. fet...
방송 종료 수 + 읽지 않은 에이전트 읽기 & 방문자 보내기
- *********** 이제 위임 *********** 그래서 조사 읽지 않은 방문자 메시지와 decrements로 세션을 반영합니다. 에이전트 호출 MarkAsRead. - 새로운 대중 *********** 헬퍼. - *********** 현재 (a) 재방송 에이전트 per-sess...
Unread-based count + 보류바이저
추가 *********** 그래서 navtop SupportButton 배지는 실제로 필요로 하는 지원 표 수 있습니다 주의 (읽지 않은 방문자 메시지) 대신 PRE TICKET/NEW 이름 * 카운트는 DB에서 똑똑히 읽습니다 그래서 그것은 새로 살아남습니다. 또한 추가 ******...
K1m1에 대한 누락된 고장2ban-config ConfigMap 추가
배포 참조 실패2ban-config ConfigMap (jail.local + asterisk-security.conf) 하지만 존재 하지 않았다, 팟을 차단 마운트볼륨. 시작에서 FreePBX를 설정하고 방지합니다.
최신 kamo-shared-library를 잡아
새로운 선택 **************** 질문과 답변 SUPPORT TICKET 지점 ***********
MarkAsRead 후 에이전트는 이렇게 lastViewed advances
지원 티켓에, 둘 다 방문자 및 대리인 메시지는 아래에 저장됩니다 같은 systemMember, 그래서 읽지 않은 계정 쿼리는 멤버 agnostic 및 lastViewed에 완전히 의존합니다. 에이전트가 MarkAsRead하지 않는 경우 전송, 자신의 대답은 새로운 방문자 메시지로 계산...
지원 티켓 필요 회원-agnostic 읽지 않은 수
지원 티켓의 방문자 메시지는 같은 systemMember에 저장됩니다. 그 대리인은, 그래서 기존의 CHAT-session 읽었습니다 queries - m.member.id를 제외한 = :memberId - 항상 0을 반환 지원 세션. 티켓 목록 배지 그러므로 결코 등장하지 않았습니다....
UploadBackground endpoint에 로깅 추가
Log org/index, 파일 정보, userId, auth 결정, 그리고 MinIO staging 왜 배경 업로드를 추적하는 열쇠는 노후화 물통에서 나타나지 않습니다.
업로드-background 프록시 경로에 로그인
Log org/index, 파일 이름/크기/타입, 업스트림 응답 상태 왜 배경 업로드가 APIService에 도달하지 않는지 진단하십시오.
위치 열을 티켓 datagrid에 추가
지원하다 *************** SupportTicketDTO (지금은 티켓 엔터티에 스냅샷 창조 시간 - 여분의 왕복 없음. + 도시/지역/국가 렌더링 도구 끝에서 보이는 IP로; 지위 데이터가 없을 때 em-dash로 돌아갑니다. 티켓에 있습니다. 에이전트 보기만. Ticke...
생성에 티켓에 저장 지오, 드롭 GeoLite 읽기
*********** 이제 방문자의 지를 캡처 한 번 ( GeoLookupService를 통해) 및 persists IP/country/city/subdivision SupportTicket 자체. SupportTicketService.toDTO는 티켓에서 지오를 읽습니다. - 아니 ...
티켓 엔터티에 Snapshot 방문자 지
VISITOR IP ADDRESS, VISITOR COUNTRY CODE, VISITOR COUNTRY NAME에 추가하십시오. VISITOR CITY, VISITOR SUBDIVISION 열. 티켓 작성 그래서 목록/세부 끝점은 GeoLite 범위 검사 또는 할 필요가 없습니다 자주 ...
Bulk-load 방문객 및 GeoLite 검색 목록
/api/support/tickets list endpoint가 실행되었습니다., 20개의 행의 페이지 당: - 20 *********** 통화 (N+1) - 20은 GeoLookupService.lookup으로 호출되며, 각 범위는 GeoLite 블록 테이블에 대한 (열의 방사) 및 ...
Add findBySessionGuidin 대량 로딩
지원 티켓 목록 endpoint에 의해 사용하는 모든 방문자를 fetch N 별도의 findBySessionGuid 호출 대신 하나의 쿼리에 페이지.
LoadThread retry 버튼을 패스하십시오
loadThread는 (threadId, 폴더); 과실 상태 재량 단추만 걸립니다 threadId를 통과, kamo-internal 구조. 전화 일치 서명.
회원 JsonIdentity 픽업 kamo-shared-library의 정보 수정
kamo-shared-library b57d156 수정 @JsonIdentityInfo (property = "uniqueId") → 회원에 "id", PUT /api/security/org/{id}에 400 오류를 해결합니다.