diff --git a/report.20190724.123950.30270.001.json b/report.20190724.123950.30270.001.json new file mode 100644 index 0000000000000..dd198be20844c --- /dev/null +++ b/report.20190724.123950.30270.001.json @@ -0,0 +1,441 @@ + +{ + "header": { + "event": "Allocation failed - JavaScript heap out of memory", + "location": "OnFatalError", + "filename": "report.20190724.123950.30270.001.json", + "dumpEventTime": "2019-07-24T12:39:50Z", + "dumpEventTimeStamp": "1563993590610", + "processId": 30270, + "commandLine": [ + "/Users/steph/.nvm/versions/node/v11.10.1/bin/node", + "/Applications/WebStorm.app/Contents/plugins/JavaScriptLanguage/jsLanguageServicesImpl/js-language-service.js", + "-id=1563896018786", + "-debug-name=typescript" + ], + "nodejsVersion": "v11.10.1", + "wordSize": 64, + "arch": "x64", + "platform": "darwin", + "componentVersions": { + "node": "11.10.1", + "v8": "7.0.276.38-node.17", + "uv": "1.26.0", + "zlib": "1.2.11", + "brotli": "1.0.7", + "ares": "1.15.0", + "modules": "67", + "nghttp2": "1.34.0", + "napi": "4", + "llhttp": "1.1.1", + "http_parser": "2.8.0", + "openssl": "1.1.1a", + "cldr": "34.0", + "icu": "63.1", + "tz": "2018e", + "unicode": "11.0" + }, + "release": { + "name": "node", + "headersUrl": "https://nodejs.org/download/release/v11.10.1/node-v11.10.1-headers.tar.gz", + "sourceUrl": "https://nodejs.org/download/release/v11.10.1/node-v11.10.1.tar.gz" + }, + "osName": "Darwin", + "osRelease": "18.6.0", + "osVersion": "Darwin Kernel Version 18.6.0: Thu Apr 25 23:16:27 PDT 2019; root:xnu-4903.261.4~2/RELEASE_X86_64", + "osMachine": "x86_64", + "host": "Stephs-MacBook-Pro.local" + }, + "javascriptStack": { + "message": "No stack.", + "stack": [ + "Unavailable." + ] + }, + "nativeStack": [ + { + "pc": "0x000000010013437e", + "symbol": "report::TriggerNodeReport(v8::Isolate*, node::Environment*, char const*, char const*, std::__1::basic_string, std::__1::allocator >, v8::Local) [/Users/steph/.nvm/versions/node/v11.10.1/bin/node]" + }, + { + "pc": "0x00000001000634c7", + "symbol": "node::OnFatalError(char const*, char const*) [/Users/steph/.nvm/versions/node/v11.10.1/bin/node]" + }, + { + "pc": "0x00000001001aeda7", + "symbol": "v8::Utils::ReportOOMFailure(v8::internal::Isolate*, char const*, bool) [/Users/steph/.nvm/versions/node/v11.10.1/bin/node]" + }, + { + "pc": "0x00000001001aed44", + "symbol": "v8::internal::V8::FatalProcessOutOfMemory(v8::internal::Isolate*, char const*, bool) [/Users/steph/.nvm/versions/node/v11.10.1/bin/node]" + }, + { + "pc": "0x00000001005b5bd2", + "symbol": "v8::internal::Heap::FatalProcessOutOfMemory(char const*) [/Users/steph/.nvm/versions/node/v11.10.1/bin/node]" + }, + { + "pc": "0x00000001005b8103", + "symbol": "v8::internal::Heap::CheckIneffectiveMarkCompact(unsigned long, double) [/Users/steph/.nvm/versions/node/v11.10.1/bin/node]" + }, + { + "pc": "0x00000001005b4638", + "symbol": "v8::internal::Heap::PerformGarbageCollection(v8::internal::GarbageCollector, v8::GCCallbackFlags) [/Users/steph/.nvm/versions/node/v11.10.1/bin/node]" + }, + { + "pc": "0x00000001005b27f5", + "symbol": "v8::internal::Heap::CollectGarbage(v8::internal::AllocationSpace, v8::internal::GarbageCollectionReason, v8::GCCallbackFlags) [/Users/steph/.nvm/versions/node/v11.10.1/bin/node]" + }, + { + "pc": "0x00000001005bf09c", + "symbol": "v8::internal::Heap::AllocateRawWithLightRetry(int, v8::internal::AllocationSpace, v8::internal::AllocationAlignment) [/Users/steph/.nvm/versions/node/v11.10.1/bin/node]" + }, + { + "pc": "0x00000001005bf11f", + "symbol": "v8::internal::Heap::AllocateRawWithRetryOrFail(int, v8::internal::AllocationSpace, v8::internal::AllocationAlignment) [/Users/steph/.nvm/versions/node/v11.10.1/bin/node]" + }, + { + "pc": "0x000000010058e314", + "symbol": "v8::internal::Factory::NewFillerObject(int, bool, v8::internal::AllocationSpace) [/Users/steph/.nvm/versions/node/v11.10.1/bin/node]" + }, + { + "pc": "0x0000000100840c54", + "symbol": "v8::internal::Runtime_AllocateInNewSpace(int, v8::internal::Object**, v8::internal::Isolate*) [/Users/steph/.nvm/versions/node/v11.10.1/bin/node]" + }, + { + "pc": "0x0000110a9144fc7d", + "symbol": "" + } + ], + "javascriptHeap": { + "totalMemory": 1497907200, + "totalCommittedMemory": 1495102096, + "usedMemory": 1445498400, + "availableMemory": 30728328, + "memoryLimit": 1526909922, + "heapSpaces": { + "read_only_space": { + "memorySize": 524288, + "committedMemory": 42224, + "capacity": 515584, + "used": 33520, + "available": 482064 + }, + "new_space": { + "memorySize": 2097152, + "committedMemory": 1079328, + "capacity": 1031168, + "used": 13440, + "available": 1017728 + }, + "old_space": { + "memorySize": 1461391360, + "committedMemory": 1460536464, + "capacity": 1414729128, + "used": 1414311344, + "available": 417784 + }, + "code_space": { + "memorySize": 5242880, + "committedMemory": 5156096, + "capacity": 4785664, + "used": 4785664, + "available": 0 + }, + "map_space": { + "memorySize": 1585152, + "committedMemory": 1221616, + "capacity": 698320, + "used": 698320, + "available": 0 + }, + "large_object_space": { + "memorySize": 27066368, + "committedMemory": 27066368, + "capacity": 54466864, + "used": 25656112, + "available": 28810752 + }, + "new_large_object_space": { + "memorySize": 0, + "committedMemory": 0, + "capacity": 0, + "used": 0, + "available": 0 + } + } + }, + "resourceUsage": { + "userCpuSeconds": 2481.89, + "kernelCpuSeconds": 2481.89, + "cpuConsumptionPercent": 0.000317378, + "maxRss": 1828775264256, + "pageFaults": { + "IORequired": 175, + "IONotRequired": 3295188 + }, + "fsActivity": { + "reads": 0, + "writes": 0 + } + }, + "libuv": [ + ], + "environmentVariables": { + "PATH": "/Users/steph/.nvm/versions/node/v11.10.1/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin", + "PLUGIN_NAME": "siem", + "JAVA_HOME": "/Library/Java/JavaVirtualMachines/jdk-11.0.3.jdk/Contents/Home", + "VERSIONER_PYTHON_VERSION": "2.7", + "LOGNAME": "steph", + "XPC_SERVICE_NAME": "com.jetbrains.WebStorm.11360", + "PWD": "/Users/steph/dev/kibana", + "KIBANA_HOME": "/Users/steph/dev/kibana", + "NODE_PATH": "/usr/local/lib/node_modules", + "NVM_CD_FLAGS": "-q", + "NVM_DIR": "/Users/steph/.nvm", + "SHELL": "/bin/zsh", + "PAGER": "less", + "LSCOLORS": "Gxfxcxdxbxegedabagacad", + "OLDPWD": "/Applications/WebStorm.app/Contents/bin", + "VERSIONER_PYTHON_PREFER_32_BIT": "no", + "USER": "steph", + "ZSH": "/Users/steph/.oh-my-zsh", + "TMPDIR": "/var/folders/zh/v2dzq4v13s99s4fntrm4c4xh0000gn/T/", + "SSH_AUTH_SOCK": "/private/tmp/com.apple.launchd.BoB5xOwi5r/Listeners", + "XPC_FLAGS": "0x0", + "__CF_USER_TEXT_ENCODING": "0x1F5:0x0:0x0", + "Apple_PubSub_Socket_Render": "/private/tmp/com.apple.launchd.cd0V3pspfP/Render", + "LESS": "-R", + "LC_CTYPE": "", + "NVM_BIN": "/Users/steph/.nvm/versions/node/v11.10.1/bin", + "HOME": "/Users/steph" + }, + "userLimits": { + "core_file_size_blocks": { + "soft": 0, + "hard": "unlimited" + }, + "data_seg_size_kbytes": { + "soft": "unlimited", + "hard": "unlimited" + }, + "file_size_blocks": { + "soft": "unlimited", + "hard": "unlimited" + }, + "max_locked_memory_bytes": { + "soft": "unlimited", + "hard": "unlimited" + }, + "max_memory_size_kbytes": { + "soft": "unlimited", + "hard": "unlimited" + }, + "open_files": { + "soft": 49152, + "hard": "unlimited" + }, + "stack_size_bytes": { + "soft": 8388608, + "hard": 67104768 + }, + "cpu_time_seconds": { + "soft": "unlimited", + "hard": "unlimited" + }, + "max_user_processes": { + "soft": 2837, + "hard": 4256 + }, + "virtual_memory_kbytes": { + "soft": "unlimited", + "hard": "unlimited" + } + }, + "sharedObjects": [ + "/Users/steph/.nvm/versions/node/v11.10.1/bin/node", + "/System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation", + "/usr/lib/libSystem.B.dylib", + "/usr/lib/libc++.1.dylib", + "/usr/lib/libobjc.A.dylib", + "/usr/lib/libDiagnosticMessagesClient.dylib", + "/usr/lib/libicucore.A.dylib", + "/usr/lib/libz.1.dylib", + "/usr/lib/libc++abi.dylib", + "/usr/lib/system/libcache.dylib", + "/usr/lib/system/libcommonCrypto.dylib", + "/usr/lib/system/libcompiler_rt.dylib", + "/usr/lib/system/libcopyfile.dylib", + "/usr/lib/system/libcorecrypto.dylib", + "/usr/lib/system/libdispatch.dylib", + "/usr/lib/system/libdyld.dylib", + "/usr/lib/system/libkeymgr.dylib", + "/usr/lib/system/liblaunch.dylib", + "/usr/lib/system/libmacho.dylib", + "/usr/lib/system/libquarantine.dylib", + "/usr/lib/system/libremovefile.dylib", + "/usr/lib/system/libsystem_asl.dylib", + "/usr/lib/system/libsystem_blocks.dylib", + "/usr/lib/system/libsystem_c.dylib", + "/usr/lib/system/libsystem_configuration.dylib", + "/usr/lib/system/libsystem_coreservices.dylib", + "/usr/lib/system/libsystem_darwin.dylib", + "/usr/lib/system/libsystem_dnssd.dylib", + "/usr/lib/system/libsystem_info.dylib", + "/usr/lib/system/libsystem_m.dylib", + "/usr/lib/system/libsystem_malloc.dylib", + "/usr/lib/system/libsystem_networkextension.dylib", + "/usr/lib/system/libsystem_notify.dylib", + "/usr/lib/system/libsystem_sandbox.dylib", + "/usr/lib/system/libsystem_secinit.dylib", + "/usr/lib/system/libsystem_kernel.dylib", + "/usr/lib/system/libsystem_platform.dylib", + "/usr/lib/system/libsystem_pthread.dylib", + "/usr/lib/system/libsystem_symptoms.dylib", + "/usr/lib/system/libsystem_trace.dylib", + "/usr/lib/system/libunwind.dylib", + "/usr/lib/system/libxpc.dylib", + "/System/Library/Frameworks/ApplicationServices.framework/Versions/A/ApplicationServices", + "/System/Library/Frameworks/CoreGraphics.framework/Versions/A/CoreGraphics", + "/System/Library/Frameworks/CoreText.framework/Versions/A/CoreText", + "/System/Library/Frameworks/ImageIO.framework/Versions/A/ImageIO", + "/System/Library/Frameworks/ColorSync.framework/Versions/A/ColorSync", + "/System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/ATS.framework/Versions/A/ATS", + "/System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/ColorSyncLegacy.framework/Versions/A/ColorSyncLegacy", + "/System/Library/Frameworks/CoreServices.framework/Versions/A/CoreServices", + "/System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/HIServices.framework/Versions/A/HIServices", + "/System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/LangAnalysis.framework/Versions/A/LangAnalysis", + "/System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/PrintCore.framework/Versions/A/PrintCore", + "/System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/QD.framework/Versions/A/QD", + "/System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/SpeechSynthesis.framework/Versions/A/SpeechSynthesis", + "/System/Library/PrivateFrameworks/SkyLight.framework/Versions/A/SkyLight", + "/System/Library/Frameworks/IOSurface.framework/Versions/A/IOSurface", + "/usr/lib/libxml2.2.dylib", + "/System/Library/Frameworks/CFNetwork.framework/Versions/A/CFNetwork", + "/System/Library/Frameworks/Accelerate.framework/Versions/A/Accelerate", + "/System/Library/Frameworks/Foundation.framework/Versions/C/Foundation", + "/usr/lib/libcompression.dylib", + "/System/Library/Frameworks/SystemConfiguration.framework/Versions/A/SystemConfiguration", + "/System/Library/Frameworks/CoreDisplay.framework/Versions/A/CoreDisplay", + "/System/Library/Frameworks/IOKit.framework/Versions/A/IOKit", + "/System/Library/Frameworks/Metal.framework/Versions/A/Metal", + "/System/Library/Frameworks/MetalPerformanceShaders.framework/Versions/A/MetalPerformanceShaders", + "/System/Library/PrivateFrameworks/MultitouchSupport.framework/Versions/A/MultitouchSupport", + "/System/Library/Frameworks/Security.framework/Versions/A/Security", + "/System/Library/Frameworks/QuartzCore.framework/Versions/A/QuartzCore", + "/usr/lib/libbsm.0.dylib", + "/usr/lib/liblzma.5.dylib", + "/usr/lib/libauto.dylib", + "/System/Library/Frameworks/DiskArbitration.framework/Versions/A/DiskArbitration", + "/usr/lib/libarchive.2.dylib", + "/usr/lib/liblangid.dylib", + "/usr/lib/libCRFSuite.dylib", + "/usr/lib/libenergytrace.dylib", + "/usr/lib/system/libkxld.dylib", + "/System/Library/PrivateFrameworks/AppleFSCompression.framework/Versions/A/AppleFSCompression", + "/usr/lib/libOpenScriptingUtil.dylib", + "/usr/lib/libcoretls.dylib", + "/usr/lib/libcoretls_cfhelpers.dylib", + "/usr/lib/libpam.2.dylib", + "/usr/lib/libsqlite3.dylib", + "/usr/lib/libxar.1.dylib", + "/usr/lib/libbz2.1.0.dylib", + "/usr/lib/libnetwork.dylib", + "/usr/lib/libapple_nghttp2.dylib", + "/usr/lib/libpcap.A.dylib", + "/System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/FSEvents.framework/Versions/A/FSEvents", + "/System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/CarbonCore.framework/Versions/A/CarbonCore", + "/System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/Metadata.framework/Versions/A/Metadata", + "/System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/OSServices.framework/Versions/A/OSServices", + "/System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/SearchKit.framework/Versions/A/SearchKit", + "/System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/AE.framework/Versions/A/AE", + "/System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/LaunchServices.framework/Versions/A/LaunchServices", + "/System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/DictionaryServices.framework/Versions/A/DictionaryServices", + "/System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/SharedFileList.framework/Versions/A/SharedFileList", + "/System/Library/Frameworks/NetFS.framework/Versions/A/NetFS", + "/System/Library/PrivateFrameworks/NetAuth.framework/Versions/A/NetAuth", + "/System/Library/PrivateFrameworks/login.framework/Versions/A/Frameworks/loginsupport.framework/Versions/A/loginsupport", + "/System/Library/PrivateFrameworks/TCC.framework/Versions/A/TCC", + "/System/Library/PrivateFrameworks/CoreNLP.framework/Versions/A/CoreNLP", + "/System/Library/PrivateFrameworks/MetadataUtilities.framework/Versions/A/MetadataUtilities", + "/usr/lib/libmecabra.dylib", + "/usr/lib/libmecab.1.0.0.dylib", + "/usr/lib/libgermantok.dylib", + "/usr/lib/libThaiTokenizer.dylib", + "/usr/lib/libChineseTokenizer.dylib", + "/usr/lib/libiconv.2.dylib", + "/usr/lib/libcharset.1.dylib", + "/System/Library/PrivateFrameworks/LanguageModeling.framework/Versions/A/LanguageModeling", + "/System/Library/PrivateFrameworks/CoreEmoji.framework/Versions/A/CoreEmoji", + "/System/Library/PrivateFrameworks/Lexicon.framework/Versions/A/Lexicon", + "/System/Library/PrivateFrameworks/LinguisticData.framework/Versions/A/LinguisticData", + "/usr/lib/libcmph.dylib", + "/System/Library/Frameworks/CoreData.framework/Versions/A/CoreData", + "/System/Library/Frameworks/OpenDirectory.framework/Versions/A/Frameworks/CFOpenDirectory.framework/Versions/A/CFOpenDirectory", + "/System/Library/PrivateFrameworks/APFS.framework/Versions/A/APFS", + "/usr/lib/libutil.dylib", + "/System/Library/Frameworks/ServiceManagement.framework/Versions/A/ServiceManagement", + "/System/Library/PrivateFrameworks/BackgroundTaskManagement.framework/Versions/A/BackgroundTaskManagement", + "/usr/lib/libxslt.1.dylib", + "/System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vImage.framework/Versions/A/vImage", + "/System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/vecLib", + "/System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libvMisc.dylib", + "/System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libvDSP.dylib", + "/System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libBLAS.dylib", + "/System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libLAPACK.dylib", + "/System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libLinearAlgebra.dylib", + "/System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libSparseBLAS.dylib", + "/System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libQuadrature.dylib", + "/System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libBNNS.dylib", + "/System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libSparse.dylib", + "/System/Library/PrivateFrameworks/GPUWrangler.framework/Versions/A/GPUWrangler", + "/System/Library/PrivateFrameworks/IOAccelerator.framework/Versions/A/IOAccelerator", + "/System/Library/PrivateFrameworks/IOPresentment.framework/Versions/A/IOPresentment", + "/System/Library/PrivateFrameworks/DSExternalDisplay.framework/Versions/A/DSExternalDisplay", + "/System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libCoreFSCache.dylib", + "/System/Library/Frameworks/MetalPerformanceShaders.framework/Frameworks/MPSCore.framework/Versions/A/MPSCore", + "/System/Library/Frameworks/MetalPerformanceShaders.framework/Frameworks/MPSImage.framework/Versions/A/MPSImage", + "/System/Library/Frameworks/MetalPerformanceShaders.framework/Frameworks/MPSNeuralNetwork.framework/Versions/A/MPSNeuralNetwork", + "/System/Library/Frameworks/MetalPerformanceShaders.framework/Frameworks/MPSMatrix.framework/Versions/A/MPSMatrix", + "/System/Library/Frameworks/MetalPerformanceShaders.framework/Frameworks/MPSRayIntersector.framework/Versions/A/MPSRayIntersector", + "/System/Library/PrivateFrameworks/MetalTools.framework/Versions/A/MetalTools", + "/System/Library/PrivateFrameworks/AggregateDictionary.framework/Versions/A/AggregateDictionary", + "/usr/lib/libMobileGestalt.dylib", + "/System/Library/Frameworks/CoreImage.framework/Versions/A/CoreImage", + "/System/Library/Frameworks/CoreVideo.framework/Versions/A/CoreVideo", + "/System/Library/Frameworks/OpenGL.framework/Versions/A/OpenGL", + "/System/Library/PrivateFrameworks/GraphVisualizer.framework/Versions/A/GraphVisualizer", + "/System/Library/PrivateFrameworks/FaceCore.framework/Versions/A/FaceCore", + "/System/Library/Frameworks/OpenCL.framework/Versions/A/OpenCL", + "/usr/lib/libFosl_dynamic.dylib", + "/System/Library/PrivateFrameworks/OTSVG.framework/Versions/A/OTSVG", + "/System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/ATS.framework/Versions/A/Resources/libFontParser.dylib", + "/System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/ATS.framework/Versions/A/Resources/libFontRegistry.dylib", + "/System/Library/Frameworks/ImageIO.framework/Versions/A/Resources/libJPEG.dylib", + "/System/Library/Frameworks/ImageIO.framework/Versions/A/Resources/libTIFF.dylib", + "/System/Library/Frameworks/ImageIO.framework/Versions/A/Resources/libPng.dylib", + "/System/Library/Frameworks/ImageIO.framework/Versions/A/Resources/libGIF.dylib", + "/System/Library/Frameworks/ImageIO.framework/Versions/A/Resources/libJP2.dylib", + "/System/Library/Frameworks/ImageIO.framework/Versions/A/Resources/libRadiance.dylib", + "/System/Library/PrivateFrameworks/AppleJPEG.framework/Versions/A/AppleJPEG", + "/System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libGFXShared.dylib", + "/System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libGLU.dylib", + "/System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libGL.dylib", + "/System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libGLImage.dylib", + "/System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libCVMSPluginSupport.dylib", + "/System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libCoreVMClient.dylib", + "/usr/lib/libcups.2.dylib", + "/System/Library/Frameworks/Kerberos.framework/Versions/A/Kerberos", + "/System/Library/Frameworks/GSS.framework/Versions/A/GSS", + "/usr/lib/libresolv.9.dylib", + "/System/Library/PrivateFrameworks/Heimdal.framework/Versions/A/Heimdal", + "/usr/lib/libheimdal-asn1.dylib", + "/System/Library/Frameworks/OpenDirectory.framework/Versions/A/OpenDirectory", + "/System/Library/PrivateFrameworks/CommonAuth.framework/Versions/A/CommonAuth", + "/System/Library/Frameworks/SecurityFoundation.framework/Versions/A/SecurityFoundation", + "/System/Library/Frameworks/CoreAudio.framework/Versions/A/CoreAudio", + "/System/Library/Frameworks/AudioToolbox.framework/Versions/A/AudioToolbox", + "/System/Library/PrivateFrameworks/AppleSauce.framework/Versions/A/AppleSauce", + "/System/Library/PrivateFrameworks/AssertionServices.framework/Versions/A/AssertionServices", + "/System/Library/PrivateFrameworks/BaseBoard.framework/Versions/A/BaseBoard" + ] +} \ No newline at end of file diff --git a/x-pack/legacy/plugins/siem/public/components/page/add_to_kql/index.test.tsx b/x-pack/legacy/plugins/siem/public/components/page/add_to_kql/index.test.tsx index 67cabfa4914cf..1c33e7c89b755 100644 --- a/x-pack/legacy/plugins/siem/public/components/page/add_to_kql/index.test.tsx +++ b/x-pack/legacy/plugins/siem/public/components/page/add_to_kql/index.test.tsx @@ -91,14 +91,17 @@ describe('AddToKql Component', () => { limit: 10, }, hosts: { + activePage: 0, limit: 10, direction: 'desc', sortField: 'lastSeen', }, events: { + activePage: 0, limit: 10, }, uncommonProcesses: { + activePage: 0, limit: 10, }, }, @@ -141,6 +144,7 @@ describe('AddToKql Component', () => { expect(store.getState().network.page).toEqual({ queries: { topNFlow: { + activePage: 0, limit: 10, flowDirection: 'uniDirectional', flowTarget: 'source', @@ -150,6 +154,7 @@ describe('AddToKql Component', () => { }, }, dns: { + activePage: 0, limit: 10, dnsSortField: { field: 'queryCount', diff --git a/x-pack/legacy/plugins/siem/public/components/page/hosts/authentications_table/index.test.tsx b/x-pack/legacy/plugins/siem/public/components/page/hosts/authentications_table/index.test.tsx index 360f6b9c6dfd7..0e37ebaacf0ce 100644 --- a/x-pack/legacy/plugins/siem/public/components/page/hosts/authentications_table/index.test.tsx +++ b/x-pack/legacy/plugins/siem/public/components/page/hosts/authentications_table/index.test.tsx @@ -33,7 +33,7 @@ describe('Authentication Table Component', () => { ; updateTableActivePage: ActionCreator<{ activePage: number; hostsType: hostsModel.HostsType; @@ -57,7 +56,7 @@ interface AuthenticationTableDispatchProps { }>; } -export declare type AuthTableColumns = [ +export type AuthTableColumns = [ Columns, Columns, Columns, @@ -86,8 +85,8 @@ const rowItems: ItemsPerRow[] = [ const AuthenticationTableComponent = pure( ({ - fakeTotalCount, data, + fakeTotalCount, id, limit, loading, @@ -141,7 +140,6 @@ const makeMapStateToProps = () => { export const AuthenticationTable = connect( makeMapStateToProps, { - updateLimitPagination: hostsActions.updateAuthenticationsLimit, updateTableActivePage: hostsActions.updateTableActivePage, updateTableLimit: hostsActions.updateTableLimit, } diff --git a/x-pack/legacy/plugins/siem/public/components/page/hosts/authentications_table/translations.ts b/x-pack/legacy/plugins/siem/public/components/page/hosts/authentications_table/translations.ts index 7fc30b06d4757..43a2565841c8f 100644 --- a/x-pack/legacy/plugins/siem/public/components/page/hosts/authentications_table/translations.ts +++ b/x-pack/legacy/plugins/siem/public/components/page/hosts/authentications_table/translations.ts @@ -79,13 +79,3 @@ export const ROWS_10 = i18n.translate('xpack.siem.authenticationsTable.rows', { values: { numRows: 10 }, defaultMessage: '{numRows} {numRows, plural, =0 {rows} =1 {row} other {rows}}', }); - -export const ROWS_20 = i18n.translate('xpack.siem.authenticationsTable.rows', { - values: { numRows: 20 }, - defaultMessage: '{numRows} {numRows, plural, =0 {rows} =1 {row} other {rows}}', -}); - -export const ROWS_50 = i18n.translate('xpack.siem.authenticationsTable.rows', { - values: { numRows: 50 }, - defaultMessage: '{numRows} {numRows, plural, =0 {rows} =1 {row} other {rows}}', -}); diff --git a/x-pack/legacy/plugins/siem/public/components/page/hosts/events_table/__snapshots__/index.test.tsx.snap b/x-pack/legacy/plugins/siem/public/components/page/hosts/events_table/__snapshots__/index.test.tsx.snap index 3bdc7c23a890a..d7fd4e05887bc 100644 --- a/x-pack/legacy/plugins/siem/public/components/page/hosts/events_table/__snapshots__/index.test.tsx.snap +++ b/x-pack/legacy/plugins/siem/public/components/page/hosts/events_table/__snapshots__/index.test.tsx.snap @@ -136,12 +136,11 @@ exports[`Load More Events Table Component rendering it renders the events table }, ] } - hasNextPage={true} + fakeTotalCount={50} id="events" - loadMore={[MockFunction]} + loadPage={[MockFunction]} loading={false} - nextCursor="1546878704036" - tiebreaker="10624" + showMorePagesIndicator={true} totalCount={15546} type="page" /> diff --git a/x-pack/legacy/plugins/siem/public/components/page/hosts/events_table/index.test.tsx b/x-pack/legacy/plugins/siem/public/components/page/hosts/events_table/index.test.tsx index 51fd59ee7d451..5acad330680b7 100644 --- a/x-pack/legacy/plugins/siem/public/components/page/hosts/events_table/index.test.tsx +++ b/x-pack/legacy/plugins/siem/public/components/page/hosts/events_table/index.test.tsx @@ -18,7 +18,7 @@ import { mockData } from './mock'; import * as i18n from './translations'; describe('Load More Events Table Component', () => { - const loadMore = jest.fn(); + const loadPage = jest.fn(); const state: State = mockGlobalState; let store = createStore(state, apolloClientObservable); @@ -33,12 +33,15 @@ describe('Load More Events Table Component', () => { i.node)} - hasNextPage={getOr(false, 'hasNextPage', mockData.Events.pageInfo)!} + fakeTotalCount={getOr(50, 'fakeTotalCount', mockData.Events.pageInfo)} id="events" loading={false} - loadMore={loadMore} - nextCursor={getOr(null, 'endCursor.value', mockData.Events.pageInfo)} - tiebreaker={getOr(null, 'endCursor.tiebreaker', mockData.Events.pageInfo)!} + loadPage={loadPage} + showMorePagesIndicator={getOr( + false, + 'showMorePagesIndicator', + mockData.Events.pageInfo + )} totalCount={mockData.Events.totalCount} type={hostsModel.HostsType.page} /> diff --git a/x-pack/legacy/plugins/siem/public/components/page/hosts/events_table/index.tsx b/x-pack/legacy/plugins/siem/public/components/page/hosts/events_table/index.tsx index f2bf704c6dcb2..8ccc434a8a849 100644 --- a/x-pack/legacy/plugins/siem/public/components/page/hosts/events_table/index.tsx +++ b/x-pack/legacy/plugins/siem/public/components/page/hosts/events_table/index.tsx @@ -16,33 +16,53 @@ import { Ecs } from '../../../../graphql/types'; import { hostsModel, hostsSelectors, State } from '../../../../store'; import { getEmptyTagValue, getOrEmptyTag } from '../../../empty_value'; import { HostDetailsLink, IPDetailsLink } from '../../../links'; -import { Columns, ItemsPerRow, LoadMoreTable } from '../../../load_more_table'; +import { Columns, ItemsPerRow, PaginatedTable } from '../../../paginated_table'; import { getRowItemDraggable, getRowItemDraggables, OverflowField } from '../../../tables/helpers'; import { PreferenceFormattedDate } from '../../../formatted_date'; import { LocalizedDateTooltip } from '../../../localized_date_tooltip'; import * as i18n from './translations'; - +const tableType = hostsModel.HostsTableType.events; interface OwnProps { data: Ecs[]; - loading: boolean; - hasNextPage: boolean; + fakeTotalCount: number; id: string; - nextCursor: string; - tiebreaker: string; + loading: boolean; + loadPage: (newActivePage: number) => void; + showMorePagesIndicator: boolean; totalCount: number; - loadMore: (cursor: string, tiebreaker: string) => void; type: hostsModel.HostsType; } interface EventsTableReduxProps { + activePage: number; limit: number; } interface EventsTableDispatchProps { - updateLimitPagination: ActionCreator<{ limit: number; hostsType: hostsModel.HostsType }>; + updateTableActivePage: ActionCreator<{ + activePage: number; + hostsType: hostsModel.HostsType; + tableType: hostsModel.HostsTableType; + }>; + updateTableLimit: ActionCreator<{ + limit: number; + hostsType: hostsModel.HostsType; + tableType: hostsModel.HostsTableType; + }>; } +export type EventsTableColumns = [ + Columns, + Columns, + Columns, + Columns, + Columns, + Columns, + Columns, + Columns +]; + type EventsTableProps = OwnProps & EventsTableReduxProps & EventsTableDispatchProps; const rowItems: ItemsPerRow[] = [ @@ -54,33 +74,24 @@ const rowItems: ItemsPerRow[] = [ text: i18n.ROWS_10, numberOfRow: 10, }, - { - text: i18n.ROWS_20, - numberOfRow: 20, - }, - { - text: i18n.ROWS_50, - numberOfRow: 50, - }, ]; const EventsTableComponent = pure( ({ + fakeTotalCount, + showMorePagesIndicator, data, - hasNextPage, id, limit, loading, - loadMore, - tiebreaker, + loadPage, totalCount, - nextCursor, - updateLimitPagination, type, + updateTableActivePage, + updateTableLimit, }) => ( - ( limit={limit} loading={loading} loadingTitle={i18n.EVENTS} - loadMore={() => loadMore(nextCursor, tiebreaker)} + loadPage={newActivePage => loadPage(newActivePage)} pageOfItems={data} + showMorePagesIndicator={showMorePagesIndicator} + totalCount={fakeTotalCount} updateLimitPagination={newLimit => - updateLimitPagination({ limit: newLimit, hostsType: type }) + updateTableLimit({ + hostsType: type, + limit: newLimit, + tableType, + }) } + updateActivePage={newPage => + updateTableActivePage({ + activePage: newPage, + hostsType: type, + tableType, + }) + } + updateProps={{ totalCount }} /> ) ); @@ -109,22 +134,12 @@ const makeMapStateToProps = () => { export const EventsTable = connect( makeMapStateToProps, { - updateLimitPagination: hostsActions.updateEventsLimit, + updateTableActivePage: hostsActions.updateTableActivePage, + updateTableLimit: hostsActions.updateTableLimit, } )(EventsTableComponent); -const getEventsColumns = ( - pageType: hostsModel.HostsType -): [ - Columns, - Columns, - Columns, - Columns, - Columns, - Columns, - Columns, - Columns -] => [ +const getEventsColumns = (pageType: hostsModel.HostsType): EventsTableColumns => [ { field: 'node', name: i18n.TIMESTAMP, diff --git a/x-pack/legacy/plugins/siem/public/components/page/hosts/events_table/mock.ts b/x-pack/legacy/plugins/siem/public/components/page/hosts/events_table/mock.ts index 41b717fbea85c..a1997912f2b95 100644 --- a/x-pack/legacy/plugins/siem/public/components/page/hosts/events_table/mock.ts +++ b/x-pack/legacy/plugins/siem/public/components/page/hosts/events_table/mock.ts @@ -10,11 +10,9 @@ export const mockData: { Events: EventsData } = { Events: { totalCount: 15546, pageInfo: { - hasNextPage: true, - endCursor: { - value: '1546878704036', - tiebreaker: '10624', - }, + activePage: 1, + fakeTotalCount: 50, + showMorePagesIndicator: true, }, edges: [ { diff --git a/x-pack/legacy/plugins/siem/public/components/page/hosts/events_table/translations.ts b/x-pack/legacy/plugins/siem/public/components/page/hosts/events_table/translations.ts index 783955a7b4cb8..e4999f079a661 100644 --- a/x-pack/legacy/plugins/siem/public/components/page/hosts/events_table/translations.ts +++ b/x-pack/legacy/plugins/siem/public/components/page/hosts/events_table/translations.ts @@ -57,13 +57,3 @@ export const ROWS_10 = i18n.translate('xpack.siem.eventsTable.rows', { values: { numRows: 10 }, defaultMessage: '{numRows} {numRows, plural, =0 {rows} =1 {row} other {rows}}', }); - -export const ROWS_20 = i18n.translate('xpack.siem.eventsTable.rows', { - values: { numRows: 20 }, - defaultMessage: '{numRows} {numRows, plural, =0 {rows} =1 {row} other {rows}}', -}); - -export const ROWS_50 = i18n.translate('xpack.siem.eventsTable.rows', { - values: { numRows: 50 }, - defaultMessage: '{numRows} {numRows, plural, =0 {rows} =1 {row} other {rows}}', -}); diff --git a/x-pack/legacy/plugins/siem/public/components/page/hosts/host_overview/mock.ts b/x-pack/legacy/plugins/siem/public/components/page/hosts/host_overview/mock.ts index eaa5b983702fd..d9a93272c0986 100644 --- a/x-pack/legacy/plugins/siem/public/components/page/hosts/host_overview/mock.ts +++ b/x-pack/legacy/plugins/siem/public/components/page/hosts/host_overview/mock.ts @@ -43,10 +43,9 @@ export const mockData: { Hosts: HostsData; DateFields: string[] } = { }, ], pageInfo: { - endCursor: { - value: 'aa7ca589f1b8220002f2fc61c64cfbf1', - }, - hasNextPage: false, + activePage: 1, + fakeTotalCount: 50, + showMorePagesIndicator: true, }, }, DateFields: ['lastBeat'], diff --git a/x-pack/legacy/plugins/siem/public/components/page/hosts/hosts_table/__snapshots__/index.test.tsx.snap b/x-pack/legacy/plugins/siem/public/components/page/hosts/hosts_table/__snapshots__/index.test.tsx.snap index cc6a6db773aa6..6a790220f7c81 100644 --- a/x-pack/legacy/plugins/siem/public/components/page/hosts/hosts_table/__snapshots__/index.test.tsx.snap +++ b/x-pack/legacy/plugins/siem/public/components/page/hosts/hosts_table/__snapshots__/index.test.tsx.snap @@ -1,6 +1,6 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`Load More Table Component rendering it renders the default Hosts table 1`] = ` +exports[`Hosts Table rendering it renders the default Hosts table 1`] = ` diff --git a/x-pack/legacy/plugins/siem/public/components/page/hosts/hosts_table/columns.tsx b/x-pack/legacy/plugins/siem/public/components/page/hosts/hosts_table/columns.tsx index b553f5eb90d91..76e1e64122c6e 100644 --- a/x-pack/legacy/plugins/siem/public/components/page/hosts/hosts_table/columns.tsx +++ b/x-pack/legacy/plugins/siem/public/components/page/hosts/hosts_table/columns.tsx @@ -9,7 +9,6 @@ import moment from 'moment'; import React from 'react'; import { StaticIndexPattern } from 'ui/index_patterns'; -import { HostItem, HostFields, OsFields } from '../../../../graphql/types'; import { escapeQueryValue } from '../../../../lib/keury'; import { hostsModel } from '../../../../store'; import { DragEffects, DraggableWrapper } from '../../../drag_and_drop/draggable_wrapper'; @@ -17,23 +16,18 @@ import { escapeDataProviderId } from '../../../drag_and_drop/helpers'; import { getEmptyTagValue } from '../../../empty_value'; import { PreferenceFormattedDate } from '../../../formatted_date'; import { HostDetailsLink } from '../../../links'; -import { Columns } from '../../../load_more_table'; import { LocalizedDateTooltip } from '../../../localized_date_tooltip'; import { IS_OPERATOR } from '../../../timeline/data_providers/data_provider'; import { Provider } from '../../../timeline/data_providers/provider'; import { AddToKql } from '../../add_to_kql'; +import { HostsTableColumns } from './'; import * as i18n from './translations'; export const getHostsColumns = ( type: hostsModel.HostsType, indexPattern: StaticIndexPattern -): [ - Columns, - Columns, - Columns, - Columns -] => [ +): HostsTableColumns => [ { field: 'node.host.name', name: i18n.NAME, diff --git a/x-pack/legacy/plugins/siem/public/components/page/hosts/hosts_table/index.test.tsx b/x-pack/legacy/plugins/siem/public/components/page/hosts/hosts_table/index.test.tsx index 7fbcd22118876..de79f73a33d2d 100644 --- a/x-pack/legacy/plugins/siem/public/components/page/hosts/hosts_table/index.test.tsx +++ b/x-pack/legacy/plugins/siem/public/components/page/hosts/hosts_table/index.test.tsx @@ -24,8 +24,8 @@ import { HostsTable } from './index'; import { mockData } from './mock'; import { KibanaConfigContext } from '../../../../lib/adapters/framework/kibana_framework_adapter'; -describe('Load More Table Component', () => { - const loadMore = jest.fn(); +describe('Hosts Table', () => { + const loadPage = jest.fn(); const state: State = mockGlobalState; let store = createStore(state, apolloClientObservable); @@ -43,10 +43,14 @@ describe('Load More Table Component', () => { data={mockData.Hosts.edges} id="hostsQuery" indexPattern={mockIndexPattern} - hasNextPage={getOr(false, 'hasNextPage', mockData.Hosts.pageInfo)!} + fakeTotalCount={getOr(50, 'fakeTotalCount', mockData.Hosts.pageInfo)} loading={false} - loadMore={loadMore} - nextCursor={getOr(null, 'endCursor.value', mockData.Hosts.pageInfo)} + loadPage={loadPage} + showMorePagesIndicator={getOr( + false, + 'showMorePagesIndicator', + mockData.Hosts.pageInfo + )} totalCount={mockData.Hosts.totalCount} type={hostsModel.HostsType.page} /> @@ -67,9 +71,13 @@ describe('Load More Table Component', () => { loading={false} data={mockData.Hosts.edges} totalCount={mockData.Hosts.totalCount} - hasNextPage={getOr(false, 'hasNextPage', mockData.Hosts.pageInfo)!} - nextCursor={getOr(null, 'endCursor.value', mockData.Hosts.pageInfo)} - loadMore={loadMore} + fakeTotalCount={getOr(50, 'fakeTotalCount', mockData.Hosts.pageInfo)} + showMorePagesIndicator={getOr( + false, + 'showMorePagesIndicator', + mockData.Hosts.pageInfo + )} + loadPage={loadPage} type={hostsModel.HostsType.page} /> @@ -86,9 +94,13 @@ describe('Load More Table Component', () => { loading={false} data={mockData.Hosts.edges} totalCount={mockData.Hosts.totalCount} - hasNextPage={getOr(false, 'hasNextPage', mockData.Hosts.pageInfo)!} - nextCursor={getOr(null, 'endCursor.value', mockData.Hosts.pageInfo)} - loadMore={loadMore} + fakeTotalCount={getOr(50, 'fakeTotalCount', mockData.Hosts.pageInfo)} + showMorePagesIndicator={getOr( + false, + 'showMorePagesIndicator', + mockData.Hosts.pageInfo + )} + loadPage={loadPage} type={hostsModel.HostsType.page} /> @@ -97,6 +109,7 @@ describe('Load More Table Component', () => { }); test('Initial value of the store', () => { expect(store.getState().hosts.page.queries.hosts).toEqual({ + activePage: 0, direction: 'desc', sortField: 'lastSeen', limit: 10, @@ -124,6 +137,7 @@ describe('Load More Table Component', () => { wrapper.update(); expect(store.getState().hosts.page.queries.hosts).toEqual({ + activePage: 0, direction: 'asc', sortField: 'hostName', limit: 10, diff --git a/x-pack/legacy/plugins/siem/public/components/page/hosts/hosts_table/index.tsx b/x-pack/legacy/plugins/siem/public/components/page/hosts/hosts_table/index.tsx index 2d773b22722d6..6045f6487c601 100644 --- a/x-pack/legacy/plugins/siem/public/components/page/hosts/hosts_table/index.tsx +++ b/x-pack/legacy/plugins/siem/public/components/page/hosts/hosts_table/index.tsx @@ -25,22 +25,24 @@ import { Columns, Criteria, ItemsPerRow, - LoadMoreTable, + PaginatedTable, SortingBasicTable, -} from '../../../load_more_table'; +} from '../../../paginated_table'; import { getHostsColumns } from './columns'; import * as i18n from './translations'; +const tableType = hostsModel.HostsTableType.hosts; + interface OwnProps { data: HostsEdges[]; - loading: boolean; + fakeTotalCount: number; id: string; indexPattern: StaticIndexPattern; - hasNextPage: boolean; - nextCursor: string; + loading: boolean; + loadPage: (newActivePage: number) => void; + showMorePagesIndicator: boolean; totalCount: number; - loadMore: (cursor: string) => void; type: hostsModel.HostsType; } @@ -51,13 +53,29 @@ interface HostsTableReduxProps { } interface HostsTableDispatchProps { - updateLimitPagination: ActionCreator<{ limit: number; hostsType: hostsModel.HostsType }>; updateHostsSort: ActionCreator<{ sort: HostsSortField; hostsType: hostsModel.HostsType; }>; + updateTableActivePage: ActionCreator<{ + activePage: number; + hostsType: hostsModel.HostsType; + tableType: hostsModel.HostsTableType; + }>; + updateTableLimit: ActionCreator<{ + limit: number; + hostsType: hostsModel.HostsType; + tableType: hostsModel.HostsTableType; + }>; } +export type HostsTableColumns = [ + Columns, + Columns, + Columns, + Columns +]; + type HostsTableProps = OwnProps & HostsTableReduxProps & HostsTableDispatchProps; const rowItems: ItemsPerRow[] = [ @@ -69,26 +87,13 @@ const rowItems: ItemsPerRow[] = [ text: i18n.ROWS_10, numberOfRow: 10, }, - { - text: i18n.ROWS_20, - numberOfRow: 20, - }, - { - text: i18n.ROWS_50, - numberOfRow: 50, - }, ]; class HostsTableComponent extends React.PureComponent { private memoizedColumns: ( type: hostsModel.HostsType, indexPattern: StaticIndexPattern - ) => [ - Columns, - Columns, - Columns, - Columns - ]; + ) => HostsTableColumns; private memoizedSorting: ( trigger: string, sortField: HostsFields, @@ -105,20 +110,23 @@ class HostsTableComponent extends React.PureComponent { const { data, direction, - hasNextPage, + fakeTotalCount, id, indexPattern, limit, loading, + loadPage, + showMorePagesIndicator, totalCount, sortField, type, + updateTableActivePage, + updateTableLimit, } = this.props; return ( - { limit={limit} loading={loading} loadingTitle={i18n.HOSTS} - loadMore={this.wrappedLoadMore} + loadPage={newActivePage => loadPage(newActivePage)} onChange={this.onChange} pageOfItems={data} + showMorePagesIndicator={showMorePagesIndicator} sorting={this.memoizedSorting(`${sortField}-${direction}`, sortField, direction)} - updateLimitPagination={this.wrappedUpdateLimitPagination} + totalCount={fakeTotalCount} + updateLimitPagination={newLimit => + updateTableLimit({ + hostsType: type, + limit: newLimit, + tableType, + }) + } + updateActivePage={newPage => + updateTableActivePage({ + activePage: newPage, + hostsType: type, + tableType, + }) + } + updateProps={{ direction, sortField, totalCount }} /> ); } @@ -142,20 +166,10 @@ class HostsTableComponent extends React.PureComponent { direction: Direction ): SortingBasicTable => ({ field: getNodeField(sortField), direction }); - private wrappedUpdateLimitPagination = (newLimit: number) => - this.props.updateLimitPagination({ limit: newLimit, hostsType: this.props.type }); - - private wrappedLoadMore = () => this.props.loadMore(this.props.nextCursor); - private getMemoizeHostsColumns = ( type: hostsModel.HostsType, indexPattern: StaticIndexPattern - ): [ - Columns, - Columns, - Columns, - Columns - ] => getHostsColumns(type, indexPattern); + ): HostsTableColumns => getHostsColumns(type, indexPattern); private onChange = (criteria: Criteria) => { if (criteria.sort != null) { @@ -205,7 +219,8 @@ const makeMapStateToProps = () => { export const HostsTable = connect( makeMapStateToProps, { - updateLimitPagination: hostsActions.updateHostsLimit, updateHostsSort: hostsActions.updateHostsSort, + updateTableActivePage: hostsActions.updateTableActivePage, + updateTableLimit: hostsActions.updateTableLimit, } )(HostsTableComponent); diff --git a/x-pack/legacy/plugins/siem/public/components/page/hosts/hosts_table/mock.ts b/x-pack/legacy/plugins/siem/public/components/page/hosts/hosts_table/mock.ts index c0c32544acd9d..b5a9c925c599a 100644 --- a/x-pack/legacy/plugins/siem/public/components/page/hosts/hosts_table/mock.ts +++ b/x-pack/legacy/plugins/siem/public/components/page/hosts/hosts_table/mock.ts @@ -52,10 +52,9 @@ export const mockData: { Hosts: HostsData } = { }, ], pageInfo: { - endCursor: { - value: 'aa7ca589f1b8220002f2fc61c64cfbf1', - }, - hasNextPage: true, + activePage: 1, + fakeTotalCount: 50, + showMorePagesIndicator: true, }, }, }; diff --git a/x-pack/legacy/plugins/siem/public/components/page/hosts/hosts_table/translations.ts b/x-pack/legacy/plugins/siem/public/components/page/hosts/hosts_table/translations.ts index 7126914b34fed..2f4ea82018743 100644 --- a/x-pack/legacy/plugins/siem/public/components/page/hosts/hosts_table/translations.ts +++ b/x-pack/legacy/plugins/siem/public/components/page/hosts/hosts_table/translations.ts @@ -57,13 +57,3 @@ export const ROWS_10 = i18n.translate('xpack.siem.hostsTable.rows', { values: { numRows: 10 }, defaultMessage: '{numRows} {numRows, plural, =0 {rows} =1 {row} other {rows}}', }); - -export const ROWS_20 = i18n.translate('xpack.siem.hostsTable.rows', { - values: { numRows: 20 }, - defaultMessage: '{numRows} {numRows, plural, =0 {rows} =1 {row} other {rows}}', -}); - -export const ROWS_50 = i18n.translate('xpack.siem.hostsTable.rows', { - values: { numRows: 50 }, - defaultMessage: '{numRows} {numRows, plural, =0 {rows} =1 {row} other {rows}}', -}); diff --git a/x-pack/legacy/plugins/siem/public/components/page/hosts/uncommon_process_table/__snapshots__/index.test.tsx.snap b/x-pack/legacy/plugins/siem/public/components/page/hosts/uncommon_process_table/__snapshots__/index.test.tsx.snap index 2b7e0ca54dbee..4fc36c860ae62 100644 --- a/x-pack/legacy/plugins/siem/public/components/page/hosts/uncommon_process_table/__snapshots__/index.test.tsx.snap +++ b/x-pack/legacy/plugins/siem/public/components/page/hosts/uncommon_process_table/__snapshots__/index.test.tsx.snap @@ -1,6 +1,6 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`UncommonProcess Table Component rendering it renders the default Uncommon process table 1`] = ` +exports[`Uncommon Process Table Component rendering it renders the default Uncommon process table 1`] = ` diff --git a/x-pack/legacy/plugins/siem/public/components/page/hosts/uncommon_process_table/index.test.tsx b/x-pack/legacy/plugins/siem/public/components/page/hosts/uncommon_process_table/index.test.tsx index 1bcc6bcffb670..bccd032488421 100644 --- a/x-pack/legacy/plugins/siem/public/components/page/hosts/uncommon_process_table/index.test.tsx +++ b/x-pack/legacy/plugins/siem/public/components/page/hosts/uncommon_process_table/index.test.tsx @@ -16,8 +16,8 @@ import { getEmptyValue } from '../../../empty_value'; import { getArgs, UncommonProcessTable } from '.'; import { mockData } from './mock'; -describe('UncommonProcess Table Component', () => { - const loadMore = jest.fn(); +describe('Uncommon Process Table Component', () => { + const loadPage = jest.fn(); describe('rendering', () => { test('it renders the default Uncommon process table', () => { @@ -25,11 +25,15 @@ describe('UncommonProcess Table Component', () => { @@ -44,11 +48,15 @@ describe('UncommonProcess Table Component', () => { @@ -69,11 +77,15 @@ describe('UncommonProcess Table Component', () => { @@ -95,11 +107,15 @@ describe('UncommonProcess Table Component', () => { @@ -121,11 +137,15 @@ describe('UncommonProcess Table Component', () => { @@ -147,11 +167,15 @@ describe('UncommonProcess Table Component', () => { @@ -173,11 +197,15 @@ describe('UncommonProcess Table Component', () => { @@ -198,11 +226,15 @@ describe('UncommonProcess Table Component', () => { @@ -223,11 +255,15 @@ describe('UncommonProcess Table Component', () => { diff --git a/x-pack/legacy/plugins/siem/public/components/page/hosts/uncommon_process_table/index.tsx b/x-pack/legacy/plugins/siem/public/components/page/hosts/uncommon_process_table/index.tsx index 7d4804585b81a..858fb032c033b 100644 --- a/x-pack/legacy/plugins/siem/public/components/page/hosts/uncommon_process_table/index.tsx +++ b/x-pack/legacy/plugins/siem/public/components/page/hosts/uncommon_process_table/index.tsx @@ -14,19 +14,19 @@ import { UncommonProcessesEdges, UncommonProcessItem } from '../../../../graphql import { hostsModel, hostsSelectors, State } from '../../../../store'; import { defaultToEmptyTag, getEmptyValue } from '../../../empty_value'; import { HostDetailsLink } from '../../../links'; -import { Columns, ItemsPerRow, LoadMoreTable } from '../../../load_more_table'; +import { Columns, ItemsPerRow, PaginatedTable } from '../../../paginated_table'; import * as i18n from './translations'; import { getRowItemDraggables } from '../../../tables/helpers'; - +const tableType = hostsModel.HostsTableType.uncommonProcesses; interface OwnProps { data: UncommonProcessesEdges[]; - loading: boolean; - hasNextPage: boolean; + fakeTotalCount: number; id: string; - nextCursor: string; + loading: boolean; + loadPage: (newActivePage: number) => void; + showMorePagesIndicator: boolean; totalCount: number; - loadMore: (cursor: string) => void; type: hostsModel.HostsType; } @@ -35,9 +35,27 @@ interface UncommonProcessTableReduxProps { } interface UncommonProcessTableDispatchProps { - updateLimitPagination: ActionCreator<{ limit: number; hostsType: hostsModel.HostsType }>; + updateTableActivePage: ActionCreator<{ + activePage: number; + hostsType: hostsModel.HostsType; + tableType: hostsModel.HostsTableType; + }>; + updateTableLimit: ActionCreator<{ + limit: number; + hostsType: hostsModel.HostsType; + tableType: hostsModel.HostsTableType; + }>; } +export type UncommonProcessTableColumns = [ + Columns, + Columns, + Columns, + Columns, + Columns, + Columns +]; + type UncommonProcessTableProps = OwnProps & UncommonProcessTableReduxProps & UncommonProcessTableDispatchProps; @@ -51,14 +69,6 @@ const rowItems: ItemsPerRow[] = [ text: i18n.ROWS_10, numberOfRow: 10, }, - { - text: i18n.ROWS_20, - numberOfRow: 20, - }, - { - text: i18n.ROWS_50, - numberOfRow: 50, - }, ]; export const getArgs = (args: string[] | null | undefined): string | null => { @@ -72,19 +82,19 @@ export const getArgs = (args: string[] | null | undefined): string | null => { const UncommonProcessTableComponent = pure( ({ data, - hasNextPage, + fakeTotalCount, id, limit, loading, - loadMore, + loadPage, totalCount, - nextCursor, - updateLimitPagination, + showMorePagesIndicator, + updateTableActivePage, + updateTableLimit, type, }) => ( - ( limit={limit} loading={loading} loadingTitle={i18n.UNCOMMON_PROCESSES} - loadMore={() => loadMore(nextCursor)} + loadPage={newActivePage => loadPage(newActivePage)} pageOfItems={data} + showMorePagesIndicator={showMorePagesIndicator} + totalCount={fakeTotalCount} updateLimitPagination={newLimit => - updateLimitPagination({ limit: newLimit, hostsType: type }) + updateTableLimit({ + hostsType: type, + limit: newLimit, + tableType, + }) + } + updateActivePage={newPage => + updateTableActivePage({ + activePage: newPage, + hostsType: type, + tableType, + }) } + updateProps={{ totalCount }} /> ) ); @@ -110,18 +134,12 @@ const makeMapStateToProps = () => { export const UncommonProcessTable = connect( makeMapStateToProps, { - updateLimitPagination: hostsActions.updateUncommonProcessesLimit, + updateTableActivePage: hostsActions.updateTableActivePage, + updateTableLimit: hostsActions.updateTableLimit, } )(UncommonProcessTableComponent); -const getUncommonColumns = (): [ - Columns, - Columns, - Columns, - Columns, - Columns, - Columns -] => [ +const getUncommonColumns = (): UncommonProcessTableColumns => [ { name: i18n.NAME, truncateText: false, diff --git a/x-pack/legacy/plugins/siem/public/components/page/hosts/uncommon_process_table/mock.ts b/x-pack/legacy/plugins/siem/public/components/page/hosts/uncommon_process_table/mock.ts index 08dd571cff882..bcd76706e3035 100644 --- a/x-pack/legacy/plugins/siem/public/components/page/hosts/uncommon_process_table/mock.ts +++ b/x-pack/legacy/plugins/siem/public/components/page/hosts/uncommon_process_table/mock.ts @@ -111,10 +111,9 @@ export const mockData: { UncommonProcess: UncommonProcessesData } = { }, ], pageInfo: { - endCursor: { - value: 'aa7ca589f1b8220002f2fc61c64cfbf1', - }, - hasNextPage: true, + activePage: 1, + fakeTotalCount: 50, + showMorePagesIndicator: true, }, }, }; diff --git a/x-pack/legacy/plugins/siem/public/components/page/hosts/uncommon_process_table/translations.ts b/x-pack/legacy/plugins/siem/public/components/page/hosts/uncommon_process_table/translations.ts index 215946c6d177c..23e9e3c9790e2 100644 --- a/x-pack/legacy/plugins/siem/public/components/page/hosts/uncommon_process_table/translations.ts +++ b/x-pack/legacy/plugins/siem/public/components/page/hosts/uncommon_process_table/translations.ts @@ -58,13 +58,3 @@ export const ROWS_10 = i18n.translate('xpack.siem.uncommonProcessTable.rows', { values: { numRows: 10 }, defaultMessage: '{numRows} {numRows, plural, =0 {rows} =1 {row} other {rows}}', }); - -export const ROWS_20 = i18n.translate('xpack.siem.uncommonProcessTable.rows', { - values: { numRows: 20 }, - defaultMessage: '{numRows} {numRows, plural, =0 {rows} =1 {row} other {rows}}', -}); - -export const ROWS_50 = i18n.translate('xpack.siem.uncommonProcessTable.rows', { - values: { numRows: 50 }, - defaultMessage: '{numRows} {numRows, plural, =0 {rows} =1 {row} other {rows}}', -}); diff --git a/x-pack/legacy/plugins/siem/public/components/page/network/domains_table/__snapshots__/index.test.tsx.snap b/x-pack/legacy/plugins/siem/public/components/page/network/domains_table/__snapshots__/index.test.tsx.snap index 3741dfa4e6fd5..db98d8e6c3703 100644 --- a/x-pack/legacy/plugins/siem/public/components/page/network/domains_table/__snapshots__/index.test.tsx.snap +++ b/x-pack/legacy/plugins/siem/public/components/page/network/domains_table/__snapshots__/index.test.tsx.snap @@ -63,8 +63,8 @@ exports[`Domains Table Component Rendering it renders the default Domains table }, ] } + fakeTotalCount={50} flowTarget="source" - hasNextPage={false} id="domains" indexPattern={ Object { @@ -152,9 +152,9 @@ exports[`Domains Table Component Rendering it renders the default Domains table } } ip="10.10.10.10" - loadMore={[MockFunction]} + loadPage={[MockFunction]} loading={false} - nextCursor="10" + showMorePagesIndicator={true} totalCount={1} type="details" /> diff --git a/x-pack/legacy/plugins/siem/public/components/page/network/domains_table/columns.tsx b/x-pack/legacy/plugins/siem/public/components/page/network/domains_table/columns.tsx index 63dc9140b22d7..d539d1121a014 100644 --- a/x-pack/legacy/plugins/siem/public/components/page/network/domains_table/columns.tsx +++ b/x-pack/legacy/plugins/siem/public/components/page/network/domains_table/columns.tsx @@ -34,6 +34,15 @@ import { AddToKql } from '../../add_to_kql'; import * as i18n from './translations'; +export type DomainsColumns = [ + Columns, + Columns, + Columns, + Columns, + Columns, + Columns +]; + export const getDomainsColumns = ( indexPattern: StaticIndexPattern, ip: string, @@ -41,14 +50,7 @@ export const getDomainsColumns = ( flowTarget: FlowTarget, type: networkModel.NetworkType, tableId: string -): [ - Columns, - Columns, - Columns, - Columns, - Columns, - Columns -] => [ +): DomainsColumns => [ { field: `node.${flowTarget}.domainName`, name: i18n.DOMAIN_NAME, diff --git a/x-pack/legacy/plugins/siem/public/components/page/network/domains_table/index.test.tsx b/x-pack/legacy/plugins/siem/public/components/page/network/domains_table/index.test.tsx index c1e0c8483cbcc..ee100aa24dd4d 100644 --- a/x-pack/legacy/plugins/siem/public/components/page/network/domains_table/index.test.tsx +++ b/x-pack/legacy/plugins/siem/public/components/page/network/domains_table/index.test.tsx @@ -24,7 +24,7 @@ import { DomainsTable } from '.'; import { mockDomainsData } from './mock'; describe('Domains Table Component', () => { - const loadMore = jest.fn(); + const loadPage = jest.fn(); const ip = '10.10.10.10'; const state: State = mockGlobalState; @@ -40,14 +40,18 @@ describe('Domains Table Component', () => { @@ -65,14 +69,18 @@ describe('Domains Table Component', () => { diff --git a/x-pack/legacy/plugins/siem/public/components/page/network/domains_table/index.tsx b/x-pack/legacy/plugins/siem/public/components/page/network/domains_table/index.tsx index c38ba5a29aa7a..c50bfb75e6272 100644 --- a/x-pack/legacy/plugins/siem/public/components/page/network/domains_table/index.tsx +++ b/x-pack/legacy/plugins/siem/public/components/page/network/domains_table/index.tsx @@ -21,22 +21,23 @@ import { } from '../../../../graphql/types'; import { networkModel, networkSelectors, State } from '../../../../store'; import { FlowDirectionSelect } from '../../../flow_controls/flow_direction_select'; -import { Criteria, ItemsPerRow, LoadMoreTable, SortingBasicTable } from '../../../load_more_table'; +import { Criteria, ItemsPerRow, PaginatedTable, SortingBasicTable } from '../../../paginated_table'; import { getDomainsColumns } from './columns'; import * as i18n from './translations'; +const tableType = networkModel.IpDetailsTableType.domains; interface OwnProps { data: DomainsEdges[]; flowTarget: FlowTarget; - loading: boolean; - hasNextPage: boolean; + fakeTotalCount: number; id: string; indexPattern: StaticIndexPattern; ip: string; - nextCursor: string; + loading: boolean; + loadPage: (newActivePage: number) => void; + showMorePagesIndicator: boolean; totalCount: number; - loadMore: (cursor: string) => void; type: networkModel.NetworkType; } @@ -59,6 +60,10 @@ interface DomainsTableDispatchProps { domainsSort: DomainsSortField; networkType: networkModel.NetworkType; }>; + updateTableActivePage: ActionCreator<{ + activePage: number; + tableType: networkModel.IpDetailsTableType; + }>; } type DomainsTableProps = OwnProps & DomainsTableReduxProps & DomainsTableDispatchProps; @@ -72,14 +77,6 @@ const rowItems: ItemsPerRow[] = [ text: i18n.ROWS_10, numberOfRow: 10, }, - { - text: i18n.ROWS_20, - numberOfRow: 20, - }, - { - text: i18n.ROWS_50, - numberOfRow: 50, - }, ]; export const DomainsTableId = 'domains-table'; @@ -89,23 +86,24 @@ class DomainsTableComponent extends React.PureComponent { const { data, domainsSortField, - hasNextPage, + fakeTotalCount, + flowDirection, + flowTarget, id, indexPattern, ip, limit, loading, - loadMore, + loadPage, + showMorePagesIndicator, totalCount, - nextCursor, - updateDomainsLimit, - flowDirection, - flowTarget, type, + updateDomainsLimit, + updateTableActivePage, } = this.props; return ( - { type, DomainsTableId )} - hasNextPage={hasNextPage} + showMorePagesIndicator={showMorePagesIndicator} headerCount={totalCount} headerSupplement={ { limit={limit} loading={loading} loadingTitle={i18n.DOMAINS} - loadMore={() => loadMore(nextCursor)} + loadPage={newActivePage => loadPage(newActivePage)} onChange={this.onChange} pageOfItems={data} sorting={getSortField(domainsSortField, flowTarget)} + totalCount={fakeTotalCount} + updateActivePage={newPage => + updateTableActivePage({ + activePage: newPage, + tableType, + }) + } updateLimitPagination={newLimit => updateDomainsLimit({ limit: newLimit, networkType: type }) } + updateProps={{ domainsSortField, flowDirection, flowTarget, totalCount }} /> ); } @@ -174,6 +180,7 @@ export const DomainsTable = connect( updateDomainsLimit: networkActions.updateDomainsLimit, updateDomainsDirection: networkActions.updateDomainsFlowDirection, updateDomainsSort: networkActions.updateDomainsSort, + updateTableActivePage: networkActions.updateIpDetailsTableActivePage, } )(DomainsTableComponent); diff --git a/x-pack/legacy/plugins/siem/public/components/page/network/domains_table/mock.ts b/x-pack/legacy/plugins/siem/public/components/page/network/domains_table/mock.ts index cec6aba436b09..624db09f03943 100644 --- a/x-pack/legacy/plugins/siem/public/components/page/network/domains_table/mock.ts +++ b/x-pack/legacy/plugins/siem/public/components/page/network/domains_table/mock.ts @@ -68,9 +68,8 @@ export const mockDomainsData: DomainsData = { }, ], pageInfo: { - endCursor: { - value: '10', - }, - hasNextPage: false, + activePage: 1, + fakeTotalCount: 50, + showMorePagesIndicator: true, }, }; diff --git a/x-pack/legacy/plugins/siem/public/components/page/network/domains_table/translations.ts b/x-pack/legacy/plugins/siem/public/components/page/network/domains_table/translations.ts index 44e068b7589f3..c5b02c6a2331c 100644 --- a/x-pack/legacy/plugins/siem/public/components/page/network/domains_table/translations.ts +++ b/x-pack/legacy/plugins/siem/public/components/page/network/domains_table/translations.ts @@ -120,16 +120,6 @@ export const ROWS_10 = i18n.translate('xpack.siem.network.ipDetails.domainsTable defaultMessage: '{numRows} {numRows, plural, =0 {rows} =1 {row} other {rows}}', }); -export const ROWS_20 = i18n.translate('xpack.siem.network.ipDetails.domainsTable.rows', { - values: { numRows: 20 }, - defaultMessage: '{numRows} {numRows, plural, =0 {rows} =1 {row} other {rows}}', -}); - -export const ROWS_50 = i18n.translate('xpack.siem.network.ipDetails.domainsTable.rows', { - values: { numRows: 50 }, - defaultMessage: '{numRows} {numRows, plural, =0 {rows} =1 {row} other {rows}}', -}); - export const MORE = i18n.translate('xpack.siem.network.ipDetails.domainsTable.moreDescription', { defaultMessage: 'More ...', }); diff --git a/x-pack/legacy/plugins/siem/public/components/page/network/network_dns_table/__snapshots__/index.test.tsx.snap b/x-pack/legacy/plugins/siem/public/components/page/network/network_dns_table/__snapshots__/index.test.tsx.snap index 65d227ffc2fe8..0b45139e24cb1 100644 --- a/x-pack/legacy/plugins/siem/public/components/page/network/network_dns_table/__snapshots__/index.test.tsx.snap +++ b/x-pack/legacy/plugins/siem/public/components/page/network/network_dns_table/__snapshots__/index.test.tsx.snap @@ -136,11 +136,11 @@ exports[`NetworkTopNFlow Table Component rendering it renders the default Networ }, ] } - hasNextPage={true} + fakeTotalCount={50} id="dns" - loadMore={[MockFunction]} + loadPage={[MockFunction]} loading={false} - nextCursor="10" + showMorePagesIndicator={true} totalCount={80} type="page" /> diff --git a/x-pack/legacy/plugins/siem/public/components/page/network/network_dns_table/columns.tsx b/x-pack/legacy/plugins/siem/public/components/page/network/network_dns_table/columns.tsx index a63c8b13b9791..1d8be96b1264b 100644 --- a/x-pack/legacy/plugins/siem/public/components/page/network/network_dns_table/columns.tsx +++ b/x-pack/legacy/plugins/siem/public/components/page/network/network_dns_table/columns.tsx @@ -18,16 +18,15 @@ import { PreferenceFormattedBytes } from '../../../formatted_bytes'; import { Provider } from '../../../timeline/data_providers/provider'; import * as i18n from './translations'; - -export const getNetworkDnsColumns = ( - type: networkModel.NetworkType -): [ +export type NetworkDnsColumns = [ Columns, Columns, Columns, Columns, Columns -] => [ +]; + +export const getNetworkDnsColumns = (type: networkModel.NetworkType): NetworkDnsColumns => [ { field: `node.${NetworkDnsFields.dnsName}`, name: i18n.REGISTERED_DOMAIN, diff --git a/x-pack/legacy/plugins/siem/public/components/page/network/network_dns_table/index.test.tsx b/x-pack/legacy/plugins/siem/public/components/page/network/network_dns_table/index.test.tsx index ca7b859a0c092..5e2525dce2e9c 100644 --- a/x-pack/legacy/plugins/siem/public/components/page/network/network_dns_table/index.test.tsx +++ b/x-pack/legacy/plugins/siem/public/components/page/network/network_dns_table/index.test.tsx @@ -18,7 +18,7 @@ import { NetworkDnsTable } from '.'; import { mockData } from './mock'; describe('NetworkTopNFlow Table Component', () => { - const loadMore = jest.fn(); + const loadPage = jest.fn(); const state: State = mockGlobalState; let store = createStore(state, apolloClientObservable); @@ -33,11 +33,15 @@ describe('NetworkTopNFlow Table Component', () => { @@ -55,11 +59,15 @@ describe('NetworkTopNFlow Table Component', () => { diff --git a/x-pack/legacy/plugins/siem/public/components/page/network/network_dns_table/index.tsx b/x-pack/legacy/plugins/siem/public/components/page/network/network_dns_table/index.tsx index ddff55552b505..4cf86165c9c67 100644 --- a/x-pack/legacy/plugins/siem/public/components/page/network/network_dns_table/index.tsx +++ b/x-pack/legacy/plugins/siem/public/components/page/network/network_dns_table/index.tsx @@ -12,19 +12,21 @@ import { ActionCreator } from 'typescript-fsa'; import { networkActions } from '../../../../store/actions'; import { NetworkDnsEdges, NetworkDnsFields, NetworkDnsSortField } from '../../../../graphql/types'; import { networkModel, networkSelectors, State } from '../../../../store'; -import { Criteria, ItemsPerRow, LoadMoreTable } from '../../../load_more_table'; +import { Criteria, ItemsPerRow, PaginatedTable } from '../../../paginated_table'; import { getNetworkDnsColumns } from './columns'; import { IsPtrIncluded } from './is_ptr_included'; import * as i18n from './translations'; +const tableType = networkModel.NetworkTableType.dns; + interface OwnProps { data: NetworkDnsEdges[]; - loading: boolean; - hasNextPage: boolean; + fakeTotalCount: number; id: string; - nextCursor: string; - loadMore: (cursor: string) => void; + loading: boolean; + loadPage: (newActivePage: number) => void; + showMorePagesIndicator: boolean; totalCount: number; type: networkModel.NetworkType; } @@ -48,6 +50,10 @@ interface NetworkDnsTableDispatchProps { isPtrIncluded: boolean; networkType: networkModel.NetworkType; }>; + updateTableActivePage: ActionCreator<{ + activePage: number; + tableType: networkModel.NetworkTableType; + }>; } type NetworkDnsTableProps = OwnProps & NetworkDnsTableReduxProps & NetworkDnsTableDispatchProps; @@ -61,14 +67,6 @@ const rowItems: ItemsPerRow[] = [ text: i18n.ROWS_10, numberOfRow: 10, }, - { - text: i18n.ROWS_20, - numberOfRow: 20, - }, - { - text: i18n.ROWS_50, - numberOfRow: 50, - }, ]; class NetworkDnsTableComponent extends React.PureComponent { @@ -76,21 +74,21 @@ class NetworkDnsTableComponent extends React.PureComponent const { data, dnsSortField, - hasNextPage, + fakeTotalCount, + id, isPtrIncluded, limit, loading, - loadMore, - id, - nextCursor, + loadPage, + showMorePagesIndicator, totalCount, type, updateDnsLimit, + updateTableActivePage, } = this.props; return ( - @@ -103,14 +101,23 @@ class NetworkDnsTableComponent extends React.PureComponent limit={limit} loading={loading} loadingTitle={i18n.TOP_DNS_DOMAINS} - loadMore={() => loadMore(nextCursor)} + loadPage={newActivePage => loadPage(newActivePage)} onChange={this.onChange} pageOfItems={data} + showMorePagesIndicator={showMorePagesIndicator} sorting={{ field: `node.${dnsSortField.field}`, direction: dnsSortField.direction, }} + totalCount={fakeTotalCount} + updateActivePage={newPage => + updateTableActivePage({ + activePage: newPage, + tableType, + }) + } updateLimitPagination={newLimit => updateDnsLimit({ limit: newLimit, networkType: type })} + updateProps={{ isPtrIncluded, totalCount, dnsSortField }} /> ); } @@ -143,6 +150,7 @@ const makeMapStateToProps = () => { export const NetworkDnsTable = connect( makeMapStateToProps, { + updateTableActivePage: networkActions.updateNetworkPageTableActivePage, updateDnsLimit: networkActions.updateDnsLimit, updateDnsSort: networkActions.updateDnsSort, updateIsPtrIncluded: networkActions.updateIsPtrIncluded, diff --git a/x-pack/legacy/plugins/siem/public/components/page/network/network_dns_table/mock.ts b/x-pack/legacy/plugins/siem/public/components/page/network/network_dns_table/mock.ts index 7846afb3f00fb..29ea5f9d12588 100644 --- a/x-pack/legacy/plugins/siem/public/components/page/network/network_dns_table/mock.ts +++ b/x-pack/legacy/plugins/siem/public/components/page/network/network_dns_table/mock.ts @@ -122,8 +122,9 @@ export const mockData: { NetworkDns: NetworkDnsData } = { }, ], pageInfo: { - endCursor: { value: '10' }, - hasNextPage: true, + activePage: 1, + fakeTotalCount: 50, + showMorePagesIndicator: true, }, }, }; diff --git a/x-pack/legacy/plugins/siem/public/components/page/network/network_dns_table/translations.ts b/x-pack/legacy/plugins/siem/public/components/page/network/network_dns_table/translations.ts index 65bcf0410686a..c641e899f1db1 100644 --- a/x-pack/legacy/plugins/siem/public/components/page/network/network_dns_table/translations.ts +++ b/x-pack/legacy/plugins/siem/public/components/page/network/network_dns_table/translations.ts @@ -63,13 +63,3 @@ export const ROWS_10 = i18n.translate('xpack.siem.networkDnsTable.rows', { values: { numRows: 10 }, defaultMessage: '{numRows} {numRows, plural, =0 {rows} =1 {row} other {rows}}', }); - -export const ROWS_20 = i18n.translate('xpack.siem.networkDnsTable.rows', { - values: { numRows: 20 }, - defaultMessage: '{numRows} {numRows, plural, =0 {rows} =1 {row} other {rows}}', -}); - -export const ROWS_50 = i18n.translate('xpack.siem.networkDnsTable.rows', { - values: { numRows: 50 }, - defaultMessage: '{numRows} {numRows, plural, =0 {rows} =1 {row} other {rows}}', -}); diff --git a/x-pack/legacy/plugins/siem/public/components/page/network/network_top_n_flow_table/__snapshots__/index.test.tsx.snap b/x-pack/legacy/plugins/siem/public/components/page/network/network_top_n_flow_table/__snapshots__/index.test.tsx.snap index 2a24a6499326f..01921a8c255d9 100644 --- a/x-pack/legacy/plugins/siem/public/components/page/network/network_top_n_flow_table/__snapshots__/index.test.tsx.snap +++ b/x-pack/legacy/plugins/siem/public/components/page/network/network_top_n_flow_table/__snapshots__/index.test.tsx.snap @@ -51,7 +51,7 @@ exports[`NetworkTopNFlow Table Component rendering it renders the default Networ }, ] } - hasNextPage={true} + fakeTotalCount={50} id="topNFlow" indexPattern={ Object { @@ -138,9 +138,9 @@ exports[`NetworkTopNFlow Table Component rendering it renders the default Networ "title": "filebeat-*,auditbeat-*,packetbeat-*", } } - loadMore={[MockFunction]} + loadPage={[MockFunction]} loading={false} - nextCursor="10" + showMorePagesIndicator={true} totalCount={524} type="page" /> diff --git a/x-pack/legacy/plugins/siem/public/components/page/network/network_top_n_flow_table/columns.tsx b/x-pack/legacy/plugins/siem/public/components/page/network/network_top_n_flow_table/columns.tsx index c884fc78d51c4..f087835ea7618 100644 --- a/x-pack/legacy/plugins/siem/public/components/page/network/network_top_n_flow_table/columns.tsx +++ b/x-pack/legacy/plugins/siem/public/components/page/network/network_top_n_flow_table/columns.tsx @@ -32,20 +32,22 @@ import * as i18n from './translations'; import { getRowItemDraggables } from '../../../tables/helpers'; import { PreferenceFormattedBytes } from '../../../formatted_bytes'; -export const getNetworkTopNFlowColumns = ( - indexPattern: StaticIndexPattern, - flowDirection: FlowDirection, - flowTarget: FlowTarget, - type: networkModel.NetworkType, - tableId: string -): [ +export type NetworkTopNFlowColumns = [ Columns, Columns, Columns, Columns, Columns, Columns -] => [ +]; + +export const getNetworkTopNFlowColumns = ( + indexPattern: StaticIndexPattern, + flowDirection: FlowDirection, + flowTarget: FlowTarget, + type: networkModel.NetworkType, + tableId: string +): NetworkTopNFlowColumns => [ { name: getIpTitle(flowTarget), truncateText: false, diff --git a/x-pack/legacy/plugins/siem/public/components/page/network/network_top_n_flow_table/index.test.tsx b/x-pack/legacy/plugins/siem/public/components/page/network/network_top_n_flow_table/index.test.tsx index b293cee22dcb1..34c35f5a476b8 100644 --- a/x-pack/legacy/plugins/siem/public/components/page/network/network_top_n_flow_table/index.test.tsx +++ b/x-pack/legacy/plugins/siem/public/components/page/network/network_top_n_flow_table/index.test.tsx @@ -24,7 +24,7 @@ import { NetworkTopNFlowTable, NetworkTopNFlowTableId } from '.'; import { mockData } from './mock'; describe('NetworkTopNFlow Table Component', () => { - const loadMore = jest.fn(); + const loadPage = jest.fn(); const state: State = mockGlobalState; let store = createStore(state, apolloClientObservable); @@ -39,12 +39,16 @@ describe('NetworkTopNFlow Table Component', () => { @@ -66,12 +70,16 @@ describe('NetworkTopNFlow Table Component', () => { @@ -103,12 +111,16 @@ describe('NetworkTopNFlow Table Component', () => { @@ -145,12 +157,16 @@ describe('NetworkTopNFlow Table Component', () => { diff --git a/x-pack/legacy/plugins/siem/public/components/page/network/network_top_n_flow_table/index.tsx b/x-pack/legacy/plugins/siem/public/components/page/network/network_top_n_flow_table/index.tsx index 7772deac6dff6..b0d7865dae3f9 100644 --- a/x-pack/legacy/plugins/siem/public/components/page/network/network_top_n_flow_table/index.tsx +++ b/x-pack/legacy/plugins/siem/public/components/page/network/network_top_n_flow_table/index.tsx @@ -22,20 +22,22 @@ import { import { networkModel, networkSelectors, State } from '../../../../store'; import { FlowDirectionSelect } from '../../../flow_controls/flow_direction_select'; import { FlowTargetSelect } from '../../../flow_controls/flow_target_select'; -import { Criteria, ItemsPerRow, LoadMoreTable } from '../../../load_more_table'; +import { Criteria, ItemsPerRow, PaginatedTable } from '../../../paginated_table'; import { getNetworkTopNFlowColumns } from './columns'; import * as i18n from './translations'; +const tableType = networkModel.NetworkTableType.topNFlow; + interface OwnProps { data: NetworkTopNFlowEdges[]; + fakeTotalCount: number; id: string; indexPattern: StaticIndexPattern; loading: boolean; - hasNextPage: boolean; - nextCursor: string; + loadPage: (newActivePage: number) => void; + showMorePagesIndicator: boolean; totalCount: number; - loadMore: (cursor: string) => void; type: networkModel.NetworkType; } @@ -47,6 +49,10 @@ interface NetworkTopNFlowTableReduxProps { } interface NetworkTopNFlowTableDispatchProps { + updateTableActivePage: ActionCreator<{ + activePage: number; + tableType: networkModel.NetworkTableType; + }>; updateTopNFlowDirection: ActionCreator<{ flowDirection: FlowDirection; networkType: networkModel.NetworkType; @@ -77,14 +83,6 @@ const rowItems: ItemsPerRow[] = [ text: i18n.ROWS_10, numberOfRow: 10, }, - { - text: i18n.ROWS_20, - numberOfRow: 20, - }, - { - text: i18n.ROWS_50, - numberOfRow: 50, - }, ]; export const NetworkTopNFlowTableId = 'networkTopNFlow-top-talkers'; @@ -93,20 +91,21 @@ class NetworkTopNFlowTableComponent extends React.PureComponent @@ -163,13 +161,22 @@ class NetworkTopNFlowTableComponent extends React.PureComponent loadMore(nextCursor)} + loadPage={newActivePage => loadPage(newActivePage)} onChange={this.onChange} pageOfItems={data} + showMorePagesIndicator={showMorePagesIndicator} sorting={{ field, direction: topNFlowSort.direction }} + totalCount={fakeTotalCount} + updateActivePage={newPage => + updateTableActivePage({ + activePage: newPage, + tableType, + }) + } updateLimitPagination={newLimit => updateTopNFlowLimit({ limit: newLimit, networkType: type }) } + updateProps={{ flowDirection, flowTarget, totalCount, topNFlowSort, field }} /> ); } @@ -208,6 +215,7 @@ export const NetworkTopNFlowTable = connect( updateTopNFlowSort: networkActions.updateTopNFlowSort, updateTopNFlowTarget: networkActions.updateTopNFlowTarget, updateTopNFlowDirection: networkActions.updateTopNFlowDirection, + updateTableActivePage: networkActions.updateNetworkPageTableActivePage, } )(NetworkTopNFlowTableComponent); diff --git a/x-pack/legacy/plugins/siem/public/components/page/network/network_top_n_flow_table/mock.ts b/x-pack/legacy/plugins/siem/public/components/page/network/network_top_n_flow_table/mock.ts index dbb7ca6d212ff..ee8b99cf9f5ed 100644 --- a/x-pack/legacy/plugins/siem/public/components/page/network/network_top_n_flow_table/mock.ts +++ b/x-pack/legacy/plugins/siem/public/components/page/network/network_top_n_flow_table/mock.ts @@ -47,10 +47,9 @@ export const mockData: { NetworkTopNFlow: NetworkTopNFlowData } = { }, ], pageInfo: { - endCursor: { - value: '10', - }, - hasNextPage: true, + activePage: 1, + fakeTotalCount: 50, + showMorePagesIndicator: true, }, }, }; diff --git a/x-pack/legacy/plugins/siem/public/components/page/network/network_top_n_flow_table/translations.ts b/x-pack/legacy/plugins/siem/public/components/page/network/network_top_n_flow_table/translations.ts index bd8155cb02f93..44b61603c043b 100644 --- a/x-pack/legacy/plugins/siem/public/components/page/network/network_top_n_flow_table/translations.ts +++ b/x-pack/legacy/plugins/siem/public/components/page/network/network_top_n_flow_table/translations.ts @@ -120,13 +120,3 @@ export const ROWS_10 = i18n.translate('xpack.siem.networkTopNFlowTable.rows', { values: { numRows: 10 }, defaultMessage: '{numRows} {numRows, plural, =0 {rows} =1 {row} other {rows}}', }); - -export const ROWS_20 = i18n.translate('xpack.siem.networkTopNFlowTable.rows', { - values: { numRows: 20 }, - defaultMessage: '{numRows} {numRows, plural, =0 {rows} =1 {row} other {rows}}', -}); - -export const ROWS_50 = i18n.translate('xpack.siem.networkTopNFlowTable.rows', { - values: { numRows: 50 }, - defaultMessage: '{numRows} {numRows, plural, =0 {rows} =1 {row} other {rows}}', -}); diff --git a/x-pack/legacy/plugins/siem/public/components/page/network/tls_table/__snapshots__/index.test.tsx.snap b/x-pack/legacy/plugins/siem/public/components/page/network/tls_table/__snapshots__/index.test.tsx.snap index a06919e2b7679..4d7294e390ac6 100644 --- a/x-pack/legacy/plugins/siem/public/components/page/network/tls_table/__snapshots__/index.test.tsx.snap +++ b/x-pack/legacy/plugins/siem/public/components/page/network/tls_table/__snapshots__/index.test.tsx.snap @@ -78,11 +78,11 @@ exports[`Tls Table Component Rendering it renders the default Domains table 1`] }, ] } - hasNextPage={false} + fakeTotalCount={50} id="tls" - loadMore={[MockFunction]} + loadPage={[MockFunction]} loading={false} - nextCursor="10" + showMorePagesIndicator={true} totalCount={1} type="details" /> diff --git a/x-pack/legacy/plugins/siem/public/components/page/network/tls_table/columns.tsx b/x-pack/legacy/plugins/siem/public/components/page/network/tls_table/columns.tsx index d67fd5c3a959a..7578c5decc851 100644 --- a/x-pack/legacy/plugins/siem/public/components/page/network/tls_table/columns.tsx +++ b/x-pack/legacy/plugins/siem/public/components/page/network/tls_table/columns.tsx @@ -15,15 +15,15 @@ import { PreferenceFormattedDate } from '../../../formatted_date'; import * as i18n from './translations'; -export const getTlsColumns = ( - tableId: string -): [ +export type TlsColumns = [ Columns, Columns, Columns, Columns, Columns -] => [ +]; + +export const getTlsColumns = (tableId: string): TlsColumns => [ { field: 'node', name: i18n.ISSUER, diff --git a/x-pack/legacy/plugins/siem/public/components/page/network/tls_table/index.test.tsx b/x-pack/legacy/plugins/siem/public/components/page/network/tls_table/index.test.tsx index d2c47b4da54fc..9e16d313e2b50 100644 --- a/x-pack/legacy/plugins/siem/public/components/page/network/tls_table/index.test.tsx +++ b/x-pack/legacy/plugins/siem/public/components/page/network/tls_table/index.test.tsx @@ -18,7 +18,7 @@ import { TlsTable } from '.'; import { mockTlsData } from './mock'; describe('Tls Table Component', () => { - const loadMore = jest.fn(); + const loadPage = jest.fn(); const state: State = mockGlobalState; let store = createStore(state, apolloClientObservable); @@ -33,11 +33,11 @@ describe('Tls Table Component', () => { @@ -55,11 +55,11 @@ describe('Tls Table Component', () => { diff --git a/x-pack/legacy/plugins/siem/public/components/page/network/tls_table/index.tsx b/x-pack/legacy/plugins/siem/public/components/page/network/tls_table/index.tsx index 971a7d0bdec46..6b57e13c7791d 100644 --- a/x-pack/legacy/plugins/siem/public/components/page/network/tls_table/index.tsx +++ b/x-pack/legacy/plugins/siem/public/components/page/network/tls_table/index.tsx @@ -12,18 +12,19 @@ import { ActionCreator } from 'redux'; import { networkActions } from '../../../../store/network'; import { TlsEdges, TlsSortField, TlsFields } from '../../../../graphql/types'; import { networkModel, networkSelectors, State } from '../../../../store'; -import { Criteria, ItemsPerRow, LoadMoreTable, SortingBasicTable } from '../../../load_more_table'; +import { Criteria, ItemsPerRow, PaginatedTable, SortingBasicTable } from '../../../paginated_table'; import { getTlsColumns } from './columns'; import * as i18n from './translations'; +const tableType = networkModel.IpDetailsTableType.tls; interface OwnProps { data: TlsEdges[]; - loading: boolean; - hasNextPage: boolean; + fakeTotalCount: number; id: string; - nextCursor: string; + loading: boolean; + loadPage: (newActivePage: number) => void; + showMorePagesIndicator: boolean; totalCount: number; - loadMore: (cursor: string) => void; type: networkModel.NetworkType; } @@ -33,6 +34,10 @@ interface TlsTableReduxProps { } interface TlsTableDispatchProps { + updateTableActivePage: ActionCreator<{ + activePage: number; + tableType: networkModel.IpDetailsTableType; + }>; updateTlsLimit: ActionCreator<{ limit: number; networkType: networkModel.NetworkType; @@ -54,14 +59,6 @@ const rowItems: ItemsPerRow[] = [ text: i18n.ROWS_10, numberOfRow: 10, }, - { - text: i18n.ROWS_20, - numberOfRow: 20, - }, - { - text: i18n.ROWS_50, - numberOfRow: 50, - }, ]; export const tlsTableId = 'tls-table'; @@ -70,21 +67,22 @@ class TlsTableComponent extends React.PureComponent { public render() { const { data, - tlsSortField, - hasNextPage, + fakeTotalCount, + id, limit, loading, - loadMore, - id, + loadPage, + showMorePagesIndicator, + tlsSortField, totalCount, - nextCursor, - updateTlsLimit, type, + updateTableActivePage, + updateTlsLimit, } = this.props; return ( - { limit={limit} loading={loading} loadingTitle={i18n.TRANSPORT_LAYER_SECURITY} - loadMore={() => loadMore(nextCursor)} + loadPage={newActivePage => loadPage(newActivePage)} onChange={this.onChange} pageOfItems={data} sorting={getSortField(tlsSortField)} + totalCount={fakeTotalCount} + updateActivePage={newPage => + updateTableActivePage({ + activePage: newPage, + tableType, + }) + } updateLimitPagination={newLimit => updateTlsLimit({ limit: newLimit, networkType: type })} + updateProps={{ tlsSortField, totalCount }} /> ); } @@ -129,6 +135,7 @@ const makeMapStateToProps = () => { export const TlsTable = connect( makeMapStateToProps, { + updateTableActivePage: networkActions.updateIpDetailsTableActivePage, updateTlsLimit: networkActions.updateTlsLimit, updateTlsSort: networkActions.updateTlsSort, } diff --git a/x-pack/legacy/plugins/siem/public/components/page/network/tls_table/mock.ts b/x-pack/legacy/plugins/siem/public/components/page/network/tls_table/mock.ts index c30aaa3a590e4..77148bf50c038 100644 --- a/x-pack/legacy/plugins/siem/public/components/page/network/tls_table/mock.ts +++ b/x-pack/legacy/plugins/siem/public/components/page/network/tls_table/mock.ts @@ -50,9 +50,8 @@ export const mockTlsData: TlsData = { }, ], pageInfo: { - endCursor: { - value: '10', - }, - hasNextPage: false, + activePage: 1, + fakeTotalCount: 50, + showMorePagesIndicator: true, }, }; diff --git a/x-pack/legacy/plugins/siem/public/components/page/network/tls_table/translations.ts b/x-pack/legacy/plugins/siem/public/components/page/network/tls_table/translations.ts index 47e8607c38dac..eaed9485385b2 100644 --- a/x-pack/legacy/plugins/siem/public/components/page/network/tls_table/translations.ts +++ b/x-pack/legacy/plugins/siem/public/components/page/network/tls_table/translations.ts @@ -63,16 +63,6 @@ export const ROWS_10 = i18n.translate('xpack.siem.network.ipDetails.tlsTable.row defaultMessage: '{numRows} {numRows, plural, =0 {rows} =1 {row} other {rows}}', }); -export const ROWS_20 = i18n.translate('xpack.siem.network.ipDetails.tlsTable.rows', { - values: { numRows: 20 }, - defaultMessage: '{numRows} {numRows, plural, =0 {rows} =1 {row} other {rows}}', -}); - -export const ROWS_50 = i18n.translate('xpack.siem.network.ipDetails.tlsTable.rows', { - values: { numRows: 50 }, - defaultMessage: '{numRows} {numRows, plural, =0 {rows} =1 {row} other {rows}}', -}); - export const MORE = i18n.translate('xpack.siem.network.ipDetails.tlsTable.moreDescription', { defaultMessage: 'More ...', }); diff --git a/x-pack/legacy/plugins/siem/public/components/page/network/users_table/__snapshots__/index.test.tsx.snap b/x-pack/legacy/plugins/siem/public/components/page/network/users_table/__snapshots__/index.test.tsx.snap index 031234c552dbc..9e731d8b05eb8 100644 --- a/x-pack/legacy/plugins/siem/public/components/page/network/users_table/__snapshots__/index.test.tsx.snap +++ b/x-pack/legacy/plugins/siem/public/components/page/network/users_table/__snapshots__/index.test.tsx.snap @@ -70,12 +70,12 @@ exports[`Users Table Component Rendering it renders the default Users table 1`] }, ] } + fakeTotalCount={3} flowTarget="source" - hasNextPage={false} id="user" - loadMore={[MockFunction]} + loadPage={[MockFunction]} loading={false} - nextCursor="10" + showMorePagesIndicator={true} totalCount={1} type="details" /> diff --git a/x-pack/legacy/plugins/siem/public/components/page/network/users_table/columns.tsx b/x-pack/legacy/plugins/siem/public/components/page/network/users_table/columns.tsx index 497f10eb209c5..b17ec74fa0540 100644 --- a/x-pack/legacy/plugins/siem/public/components/page/network/users_table/columns.tsx +++ b/x-pack/legacy/plugins/siem/public/components/page/network/users_table/columns.tsx @@ -11,16 +11,15 @@ import { Columns } from '../../../load_more_table'; import * as i18n from './translations'; import { getRowItemDraggables, getRowItemDraggable } from '../../../tables/helpers'; -export const getUsersColumns = ( - flowTarget: FlowTarget, - tableId: string -): [ +export type UsersColumns = [ Columns, Columns, Columns, Columns, Columns -] => [ +]; + +export const getUsersColumns = (flowTarget: FlowTarget, tableId: string): UsersColumns => [ { field: 'node.user.name', name: i18n.USER_NAME, diff --git a/x-pack/legacy/plugins/siem/public/components/page/network/users_table/index.test.tsx b/x-pack/legacy/plugins/siem/public/components/page/network/users_table/index.test.tsx index 56ee4ac3e1501..75aa472f4a9e6 100644 --- a/x-pack/legacy/plugins/siem/public/components/page/network/users_table/index.test.tsx +++ b/x-pack/legacy/plugins/siem/public/components/page/network/users_table/index.test.tsx @@ -19,7 +19,7 @@ import { UsersTable } from '.'; import { mockUsersData } from './mock'; describe('Users Table Component', () => { - const loadMore = jest.fn(); + const loadPage = jest.fn(); const state: State = mockGlobalState; let store = createStore(state, apolloClientObservable); @@ -35,11 +35,11 @@ describe('Users Table Component', () => { @@ -58,11 +58,15 @@ describe('Users Table Component', () => { diff --git a/x-pack/legacy/plugins/siem/public/components/page/network/users_table/index.tsx b/x-pack/legacy/plugins/siem/public/components/page/network/users_table/index.tsx index 8d9e8baedf0bc..d8a5007e6e647 100644 --- a/x-pack/legacy/plugins/siem/public/components/page/network/users_table/index.tsx +++ b/x-pack/legacy/plugins/siem/public/components/page/network/users_table/index.tsx @@ -12,21 +12,22 @@ import { ActionCreator } from 'redux'; import { networkActions } from '../../../../store/network'; import { FlowTarget, UsersEdges, UsersFields, UsersSortField } from '../../../../graphql/types'; import { networkModel, networkSelectors, State } from '../../../../store'; -import { Criteria, ItemsPerRow, LoadMoreTable, SortingBasicTable } from '../../../load_more_table'; +import { Criteria, ItemsPerRow, PaginatedTable, SortingBasicTable } from '../../../paginated_table'; import { getUsersColumns } from './columns'; import * as i18n from './translations'; import { assertUnreachable } from '../../../../lib/helpers'; +const tableType = networkModel.IpDetailsTableType.users; interface OwnProps { data: UsersEdges[]; flowTarget: FlowTarget; - loading: boolean; - hasNextPage: boolean; + fakeTotalCount: number; id: string; - nextCursor: string; + loading: boolean; + loadPage: (newActivePage: number) => void; + showMorePagesIndicator: boolean; totalCount: number; - loadMore: (cursor: string) => void; type: networkModel.NetworkType; } @@ -36,6 +37,10 @@ interface UsersTableReduxProps { } interface UsersTableDispatchProps { + updateTableActivePage: ActionCreator<{ + activePage: number; + tableType: networkModel.IpDetailsTableType; + }>; updateUsersLimit: ActionCreator<{ limit: number; networkType: networkModel.NetworkType; @@ -57,14 +62,6 @@ const rowItems: ItemsPerRow[] = [ text: i18n.ROWS_10, numberOfRow: 10, }, - { - text: i18n.ROWS_20, - numberOfRow: 20, - }, - { - text: i18n.ROWS_50, - numberOfRow: 50, - }, ]; export const usersTableId = 'users-table'; @@ -73,23 +70,24 @@ class UsersTableComponent extends React.PureComponent { public render() { const { data, - usersSortField, - hasNextPage, + fakeTotalCount, + flowTarget, + id, limit, loading, - loadMore, - id, + loadPage, + showMorePagesIndicator, totalCount, - nextCursor, - updateUsersLimit, - flowTarget, type, + updateTableActivePage, + updateUsersLimit, + usersSortField, } = this.props; return ( - { limit={limit} loading={loading} loadingTitle={i18n.USERS} - loadMore={() => loadMore(nextCursor)} + loadPage={newActivePage => loadPage(newActivePage)} onChange={this.onChange} pageOfItems={data} sorting={getSortField(usersSortField)} + totalCount={fakeTotalCount} + updateActivePage={newPage => + updateTableActivePage({ + activePage: newPage, + tableType, + }) + } updateLimitPagination={newLimit => updateUsersLimit({ limit: newLimit, networkType: type })} + updateProps={{ flowTarget, totalCount, usersSortField }} /> ); } @@ -134,6 +140,7 @@ const makeMapStateToProps = () => { export const UsersTable = connect( makeMapStateToProps, { + updateTableActivePage: networkActions.updateIpDetailsTableActivePage, updateUsersLimit: networkActions.updateUsersLimit, updateUsersSort: networkActions.updateUsersSort, } diff --git a/x-pack/legacy/plugins/siem/public/components/page/network/users_table/mock.ts b/x-pack/legacy/plugins/siem/public/components/page/network/users_table/mock.ts index d9e12b6d7da36..9a5de66a91a3e 100644 --- a/x-pack/legacy/plugins/siem/public/components/page/network/users_table/mock.ts +++ b/x-pack/legacy/plugins/siem/public/components/page/network/users_table/mock.ts @@ -59,10 +59,8 @@ export const mockUsersData: UsersData = { ], totalCount: 3, pageInfo: { - endCursor: { - value: '10', - tiebreaker: null, - }, - hasNextPage: false, + activePage: 1, + fakeTotalCount: 3, + showMorePagesIndicator: true, }, }; diff --git a/x-pack/legacy/plugins/siem/public/components/page/network/users_table/translations.ts b/x-pack/legacy/plugins/siem/public/components/page/network/users_table/translations.ts index dffd3b90e31f3..f7fe07510f6ba 100644 --- a/x-pack/legacy/plugins/siem/public/components/page/network/users_table/translations.ts +++ b/x-pack/legacy/plugins/siem/public/components/page/network/users_table/translations.ts @@ -63,16 +63,6 @@ export const ROWS_10 = i18n.translate('xpack.siem.network.ipDetails.usersTable.r defaultMessage: '{numRows} {numRows, plural, =0 {rows} =1 {row} other {rows}}', }); -export const ROWS_20 = i18n.translate('xpack.siem.network.ipDetails.usersTable.rows', { - values: { numRows: 20 }, - defaultMessage: '{numRows} {numRows, plural, =0 {rows} =1 {row} other {rows}}', -}); - -export const ROWS_50 = i18n.translate('xpack.siem.network.ipDetails.usersTable.rows', { - values: { numRows: 50 }, - defaultMessage: '{numRows} {numRows, plural, =0 {rows} =1 {row} other {rows}}', -}); - export const MORE = i18n.translate('xpack.siem.network.ipDetails.usersTable.moreDescription', { defaultMessage: 'More ...', }); diff --git a/x-pack/legacy/plugins/siem/public/components/paginated_table/index.tsx b/x-pack/legacy/plugins/siem/public/components/paginated_table/index.tsx index 0ad5f6daa8157..126025d1a7cbc 100644 --- a/x-pack/legacy/plugins/siem/public/components/paginated_table/index.tsx +++ b/x-pack/legacy/plugins/siem/public/components/paginated_table/index.tsx @@ -21,6 +21,14 @@ import styled from 'styled-components'; import { Direction } from '../../graphql/types'; import { AuthTableColumns } from '../page/hosts/authentications_table'; +import { DomainsColumns } from '../page/network/domains_table/columns'; +import { EventsTableColumns } from '../page/hosts/events_table'; +import { HostsTableColumns } from '../page/hosts/hosts_table'; +import { NetworkDnsColumns } from '../page/network/network_dns_table/columns'; +import { NetworkTopNFlowColumns } from '../page/network/network_top_n_flow_table/columns'; +import { TlsColumns } from '../page/network/tls_table/columns'; +import { UncommonProcessTableColumns } from '../page/hosts/uncommon_process_table'; +import { UsersColumns } from '../page/network/users_table/columns'; import { HeaderPanel } from '../header_panel'; import { LoadingPanel } from '../loading'; import { useStateToaster } from '../toasters'; @@ -46,14 +54,25 @@ export interface Criteria { sort?: SortingBasicTable; } -declare type HostsTableColumns = [ +declare type HostsTableColumnsTest = [ Columns, Columns, Columns, Columns ]; -declare type BasicTableColumns = AuthTableColumns | HostsTableColumns; +declare type BasicTableColumns = + | AuthTableColumns + | DomainsColumns + | DomainsColumns + | EventsTableColumns + | HostsTableColumns + | HostsTableColumnsTest + | NetworkDnsColumns + | NetworkTopNFlowColumns + | TlsColumns + | UncommonProcessTableColumns + | UsersColumns; declare type SiemTables = BasicTableProps; @@ -133,6 +152,12 @@ export const PaginatedTable = memo( } }, effectDeps); + useEffect(() => { + if (!isEmpty(pageOfItems) && isEmptyTable) { + setEmptyTable(false); + } + }, [pageOfItems]); + const onButtonClick = () => { setPopoverOpen(!isPopoverOpen); }; @@ -160,9 +185,7 @@ export const PaginatedTable = memo( loadPage(newActivePage); updateActivePage(newActivePage); }; - if (!isEmpty(pageOfItems) && isEmptyTable) { - setEmptyTable(false); - } + if (loading && isEmptyTable) { return ( diff --git a/x-pack/legacy/plugins/siem/public/components/timeline/footer/mock.ts b/x-pack/legacy/plugins/siem/public/components/timeline/footer/mock.ts index e0f210c692a1f..f6aaf9475f2c4 100644 --- a/x-pack/legacy/plugins/siem/public/components/timeline/footer/mock.ts +++ b/x-pack/legacy/plugins/siem/public/components/timeline/footer/mock.ts @@ -4,9 +4,9 @@ * you may not use this file except in compliance with the Elastic License. */ -import { EventsData } from '../../../graphql/types'; +import { EventsTimelineData } from '../../../graphql/types'; -export const mockData: { Events: EventsData } = { +export const mockData: { Events: EventsTimelineData } = { Events: { totalCount: 15546, pageInfo: { diff --git a/x-pack/legacy/plugins/siem/public/containers/authentications/index.tsx b/x-pack/legacy/plugins/siem/public/containers/authentications/index.tsx index c18eaf7942b10..35b6bca987bec 100644 --- a/x-pack/legacy/plugins/siem/public/containers/authentications/index.tsx +++ b/x-pack/legacy/plugins/siem/public/containers/authentications/index.tsx @@ -26,14 +26,14 @@ import { authenticationsQuery } from './index.gql_query'; const ID = 'authenticationQuery'; export interface AuthenticationArgs { + authentications: AuthenticationsEdges[]; id: string; inspect: inputsModel.InspectQuery; - authentications: AuthenticationsEdges[]; - totalCount: number; - pageInfo: PageInfoPaginated; loading: boolean; loadPage: (newActivePage: number) => void; + pageInfo: PageInfoPaginated; refetch: inputsModel.Refetch; + totalCount: number; } export interface OwnProps extends QueryTemplatePaginatedProps { diff --git a/x-pack/legacy/plugins/siem/public/containers/domains/index.gql_query.ts b/x-pack/legacy/plugins/siem/public/containers/domains/index.gql_query.ts index bfca7fe1d7877..8266a83bcad5e 100644 --- a/x-pack/legacy/plugins/siem/public/containers/domains/index.gql_query.ts +++ b/x-pack/legacy/plugins/siem/public/containers/domains/index.gql_query.ts @@ -13,7 +13,7 @@ export const domainsQuery = gql` $flowDirection: FlowDirection! $flowTarget: FlowTarget! $ip: String! - $pagination: PaginationInput! + $pagination: PaginationInputPaginated! $sort: DomainsSortField! $timerange: TimerangeInput! $defaultIndex: [String!]! @@ -57,10 +57,9 @@ export const domainsQuery = gql` } } pageInfo { - endCursor { - value - } - hasNextPage + activePage + fakeTotalCount + showMorePagesIndicator } inspect @include(if: $inspect) { dsl diff --git a/x-pack/legacy/plugins/siem/public/containers/domains/index.tsx b/x-pack/legacy/plugins/siem/public/containers/domains/index.tsx index 586a795cd2a90..7f71a4356b078 100644 --- a/x-pack/legacy/plugins/siem/public/containers/domains/index.tsx +++ b/x-pack/legacy/plugins/siem/public/containers/domains/index.tsx @@ -17,28 +17,28 @@ import { GetDomainsQuery, FlowDirection, FlowTarget, - PageInfo, + PageInfoPaginated, } from '../../graphql/types'; import { inputsModel, networkModel, networkSelectors, State, inputsSelectors } from '../../store'; import { createFilter } from '../helpers'; -import { QueryTemplate, QueryTemplateProps } from '../query_template'; - +import { generateTablePaginationOptions } from '../../components/paginated_table/helpers'; +import { QueryTemplatePaginated, QueryTemplatePaginatedProps } from '../query_template_paginated'; import { domainsQuery } from './index.gql_query'; const ID = 'domainsQuery'; export interface DomainsArgs { + domains: DomainsEdges[]; id: string; inspect: inputsModel.InspectQuery; - domains: DomainsEdges[]; - totalCount: number; - pageInfo: PageInfo; loading: boolean; - loadMore: (cursor: string) => void; + loadPage: (newActivePage: number) => void; + pageInfo: PageInfoPaginated; refetch: inputsModel.Refetch; + totalCount: number; } -export interface OwnProps extends QueryTemplateProps { +export interface OwnProps extends QueryTemplatePaginatedProps { children: (args: DomainsArgs) => React.ReactNode; flowTarget: FlowTarget; ip: string; @@ -46,34 +46,36 @@ export interface OwnProps extends QueryTemplateProps { } export interface DomainsComponentReduxProps { - isInspected: boolean; - limit: number; + activePage: number; domainsSortField: DomainsSortField; flowDirection: FlowDirection; + isInspected: boolean; + limit: number; } type DomainsProps = OwnProps & DomainsComponentReduxProps; -class DomainsComponentQuery extends QueryTemplate< +class DomainsComponentQuery extends QueryTemplatePaginated< DomainsProps, GetDomainsQuery.Query, GetDomainsQuery.Variables > { public render() { const { - id = ID, - isInspected, + activePage, children, domainsSortField, + endDate, filterQuery, + flowDirection, + flowTarget, + id = ID, ip, + isInspected, + limit, skip, sourceId, startDate, - endDate, - limit, - flowTarget, - flowDirection, } = this.props; return ( @@ -82,35 +84,28 @@ class DomainsComponentQuery extends QueryTemplate< notifyOnNetworkStatusChange skip={skip} variables={{ + defaultIndex: chrome.getUiSettingsClient().get(DEFAULT_INDEX_KEY), + filterQuery: createFilter(filterQuery), + flowDirection, + flowTarget, + inspect: isInspected, + ip, + pagination: generateTablePaginationOptions(activePage, limit), + sort: domainsSortField, sourceId, timerange: { interval: '12h', from: startDate!, to: endDate!, }, - ip, - flowDirection, - flowTarget, - sort: domainsSortField, - pagination: { - limit, - cursor: null, - tiebreaker: null, - }, - filterQuery: createFilter(filterQuery), - defaultIndex: chrome.getUiSettingsClient().get(DEFAULT_INDEX_KEY), - inspect: isInspected, }} > {({ data, loading, fetchMore, refetch }) => { const domains = getOr([], `source.Domains.edges`, data); this.setFetchMore(fetchMore); - this.setFetchMoreOptions((newCursor: string) => ({ + this.setFetchMoreOptions((newActivePage: number) => ({ variables: { - pagination: { - cursor: newCursor, - limit: limit + parseInt(newCursor, 10), - }, + pagination: generateTablePaginationOptions(newActivePage, limit), }, updateQuery: (prev, { fetchMoreResult }) => { if (!fetchMoreResult) { @@ -122,21 +117,21 @@ class DomainsComponentQuery extends QueryTemplate< ...fetchMoreResult.source, Domains: { ...fetchMoreResult.source.Domains, - edges: [...prev.source.Domains.edges, ...fetchMoreResult.source.Domains.edges], + edges: [...fetchMoreResult.source.Domains.edges], }, }, }; }, })); return children({ + domains, id, inspect: getOr(null, 'source.Domains.inspect', data), - refetch, loading, - totalCount: getOr(0, 'source.Domains.totalCount', data), - domains, + loadPage: this.wrappedLoadMore, pageInfo: getOr({}, 'source.Domains.pageInfo', data), - loadMore: this.wrappedLoadMore, + refetch, + totalCount: getOr(0, 'source.Domains.totalCount', data), }); }} diff --git a/x-pack/legacy/plugins/siem/public/containers/events/index.gql_query.ts b/x-pack/legacy/plugins/siem/public/containers/events/index.gql_query.ts index 1b2e0cf69cc1e..c8610dcd39add 100644 --- a/x-pack/legacy/plugins/siem/public/containers/events/index.gql_query.ts +++ b/x-pack/legacy/plugins/siem/public/containers/events/index.gql_query.ts @@ -10,7 +10,7 @@ export const eventsQuery = gql` query GetEventsQuery( $sourceId: ID! $timerange: TimerangeInput! - $pagination: PaginationInput! + $pagination: PaginationInputPaginated! $sortField: SortField! $filterQuery: String $defaultIndex: [String!]! @@ -27,11 +27,9 @@ export const eventsQuery = gql` ) { totalCount pageInfo { - endCursor { - value - tiebreaker - } - hasNextPage + activePage + fakeTotalCount + showMorePagesIndicator } inspect @include(if: $inspect) { dsl diff --git a/x-pack/legacy/plugins/siem/public/containers/events/index.tsx b/x-pack/legacy/plugins/siem/public/containers/events/index.tsx index 3a1bc685b5a21..6bdf9cece4a89 100644 --- a/x-pack/legacy/plugins/siem/public/containers/events/index.tsx +++ b/x-pack/legacy/plugins/siem/public/containers/events/index.tsx @@ -11,46 +11,49 @@ import { connect } from 'react-redux'; import chrome from 'ui/chrome'; import { DEFAULT_INDEX_KEY } from '../../../common/constants'; -import { Direction, Ecs, GetEventsQuery, PageInfo } from '../../graphql/types'; +import { Direction, Ecs, GetEventsQuery, PageInfoPaginated } from '../../graphql/types'; import { hostsModel, hostsSelectors, inputsModel, State, inputsSelectors } from '../../store'; import { createFilter, getDefaultFetchPolicy } from '../helpers'; -import { QueryTemplate, QueryTemplateProps } from '../query_template'; - +import { QueryTemplatePaginated, QueryTemplatePaginatedProps } from '../query_template_paginated'; +import { generateTablePaginationOptions } from '../../components/paginated_table/helpers'; import { eventsQuery } from './index.gql_query'; const ID = 'eventsQuery'; export interface EventsArgs { + events: Ecs[]; id: string; inspect: inputsModel.InspectQuery; - events: Ecs[]; loading: boolean; - loadMore: (cursor: string, tiebreaker: string) => void; - pageInfo: PageInfo; + loadPage: (newActivePage: number) => void; + pageInfo: PageInfoPaginated; refetch: inputsModel.Refetch; totalCount: number; } -export interface OwnProps extends QueryTemplateProps { +export interface OwnProps extends QueryTemplatePaginatedProps { children?: (args: EventsArgs) => React.ReactNode; type: hostsModel.HostsType; } export interface EventsComponentReduxProps { + activePage: number; isInspected: boolean; limit: number; } type EventsProps = OwnProps & EventsComponentReduxProps; -class EventsComponentQuery extends QueryTemplate< +class EventsComponentQuery extends QueryTemplatePaginated< EventsProps, GetEventsQuery.Query, GetEventsQuery.Variables > { public render() { const { + activePage, children, + endDate, filterQuery, id = ID, isInspected, @@ -58,7 +61,6 @@ class EventsComponentQuery extends QueryTemplate< skip, sourceId, startDate, - endDate, } = this.props; return ( @@ -67,36 +69,28 @@ class EventsComponentQuery extends QueryTemplate< notifyOnNetworkStatusChange skip={skip} variables={{ + defaultIndex: chrome.getUiSettingsClient().get(DEFAULT_INDEX_KEY), filterQuery: createFilter(filterQuery), - sourceId, - pagination: { - limit, - cursor: null, - tiebreaker: null, - }, + inspect: isInspected, + pagination: generateTablePaginationOptions(activePage, limit), sortField: { sortFieldId: 'timestamp', direction: Direction.desc, }, + sourceId, timerange: { interval: '12h', from: startDate!, to: endDate!, }, - defaultIndex: chrome.getUiSettingsClient().get(DEFAULT_INDEX_KEY), - inspect: isInspected, }} > {({ data, loading, fetchMore, refetch }) => { const events = getOr([], 'source.Events.edges', data); this.setFetchMore(fetchMore); - this.setFetchMoreOptions((newCursor: string, tiebreaker?: string) => ({ + this.setFetchMoreOptions((newActivePage: number) => ({ variables: { - pagination: { - cursor: newCursor, - tiebreaker, - limit, - }, + pagination: generateTablePaginationOptions(newActivePage, limit), }, updateQuery: (prev, { fetchMoreResult }) => { if (!fetchMoreResult) { @@ -108,21 +102,21 @@ class EventsComponentQuery extends QueryTemplate< ...fetchMoreResult.source, Events: { ...fetchMoreResult.source.Events, - edges: [...prev.source.Events.edges, ...fetchMoreResult.source.Events.edges], + edges: [...fetchMoreResult.source.Events.edges], }, }, }; }, })); return children!({ + events, id, inspect: getOr(null, 'source.Events.inspect', data), - refetch, loading, - totalCount: getOr(0, 'source.Events.totalCount', data), + loadPage: this.wrappedLoadMore, pageInfo: getOr({}, 'source.Events.pageInfo', data), - events, - loadMore: this.wrappedLoadMore, + refetch, + totalCount: getOr(0, 'source.Events.totalCount', data), }); }} diff --git a/x-pack/legacy/plugins/siem/public/containers/hosts/hosts_table.gql_query.ts b/x-pack/legacy/plugins/siem/public/containers/hosts/hosts_table.gql_query.ts index e5c8fe35fdfa6..672ea70b09ad2 100644 --- a/x-pack/legacy/plugins/siem/public/containers/hosts/hosts_table.gql_query.ts +++ b/x-pack/legacy/plugins/siem/public/containers/hosts/hosts_table.gql_query.ts @@ -10,7 +10,7 @@ export const HostsTableQuery = gql` query GetHostsTableQuery( $sourceId: ID! $timerange: TimerangeInput! - $pagination: PaginationInput! + $pagination: PaginationInputPaginated! $sort: HostsSortField! $filterQuery: String $defaultIndex: [String!]! @@ -44,10 +44,9 @@ export const HostsTableQuery = gql` } } pageInfo { - endCursor { - value - } - hasNextPage + activePage + fakeTotalCount + showMorePagesIndicator } inspect @include(if: $inspect) { dsl diff --git a/x-pack/legacy/plugins/siem/public/containers/hosts/index.tsx b/x-pack/legacy/plugins/siem/public/containers/hosts/index.tsx index 269c73260658b..9dd9d8b8a0e62 100644 --- a/x-pack/legacy/plugins/siem/public/containers/hosts/index.tsx +++ b/x-pack/legacy/plugins/siem/public/containers/hosts/index.tsx @@ -17,32 +17,33 @@ import { GetHostsTableQuery, HostsEdges, HostsFields, - PageInfo, + PageInfoPaginated, } from '../../graphql/types'; import { hostsModel, hostsSelectors, inputsModel, State, inputsSelectors } from '../../store'; import { createFilter } from '../helpers'; -import { QueryTemplate, QueryTemplateProps } from '../query_template'; +import { QueryTemplatePaginated, QueryTemplatePaginatedProps } from '../query_template_paginated'; import { HostsTableQuery } from './hosts_table.gql_query'; +import { generateTablePaginationOptions } from '../../components/paginated_table/helpers'; export { HostsFilter } from './filter'; const ID = 'hostsQuery'; export interface HostsArgs { + endDate: number; + hosts: HostsEdges[]; id: string; inspect: inputsModel.InspectQuery; - hosts: HostsEdges[]; - totalCount: number; - pageInfo: PageInfo; loading: boolean; - loadMore: (cursor: string) => void; + loadPage: (newActivePage: number) => void; + pageInfo: PageInfoPaginated; refetch: inputsModel.Refetch; startDate: number; - endDate: number; + totalCount: number; } -export interface OwnProps extends QueryTemplateProps { +export interface OwnProps extends QueryTemplatePaginatedProps { children: (args: HostsArgs) => React.ReactNode; type: hostsModel.HostsType; startDate: number; @@ -50,6 +51,7 @@ export interface OwnProps extends QueryTemplateProps { } export interface HostsComponentReduxProps { + activePage: number; isInspected: boolean; limit: number; sortField: HostsFields; @@ -58,7 +60,7 @@ export interface HostsComponentReduxProps { type HostsProps = OwnProps & HostsComponentReduxProps; -class HostsComponentQuery extends QueryTemplate< +class HostsComponentQuery extends QueryTemplatePaginated< HostsProps, GetHostsTableQuery.Query, GetHostsTableQuery.Variables @@ -75,6 +77,7 @@ class HostsComponentQuery extends QueryTemplate< public render() { const { + activePage, id = ID, isInspected, children, @@ -99,11 +102,7 @@ class HostsComponentQuery extends QueryTemplate< direction, field: sortField, }, - pagination: { - limit, - cursor: null, - tiebreaker: null, - }, + pagination: generateTablePaginationOptions(activePage, limit), filterQuery: createFilter(filterQuery), defaultIndex: chrome.getUiSettingsClient().get(DEFAULT_INDEX_KEY), inspect: isInspected, @@ -118,12 +117,9 @@ class HostsComponentQuery extends QueryTemplate< > {({ data, loading, fetchMore, refetch }) => { this.setFetchMore(fetchMore); - this.setFetchMoreOptions((newCursor: string) => ({ + this.setFetchMoreOptions((newActivePage: number) => ({ variables: { - pagination: { - cursor: newCursor, - limit: limit + parseInt(newCursor, 10), - }, + pagination: generateTablePaginationOptions(newActivePage, limit), }, updateQuery: (prev, { fetchMoreResult }) => { if (!fetchMoreResult) { @@ -135,23 +131,23 @@ class HostsComponentQuery extends QueryTemplate< ...fetchMoreResult.source, Hosts: { ...fetchMoreResult.source.Hosts, - edges: [...prev.source.Hosts.edges, ...fetchMoreResult.source.Hosts.edges], + edges: [...fetchMoreResult.source.Hosts.edges], }, }, }; }, })); return children({ + endDate, + hosts: this.memoizedHosts(JSON.stringify(variables), get('source', data)), id, inspect: getOr(null, 'source.Hosts.inspect', data), - refetch, loading, - totalCount: getOr(0, 'source.Hosts.totalCount', data), - hosts: this.memoizedHosts(JSON.stringify(variables), get('source', data)), - startDate, - endDate, + loadPage: this.wrappedLoadMore, pageInfo: getOr({}, 'source.Hosts.pageInfo', data), - loadMore: this.wrappedLoadMore, + refetch, + startDate, + totalCount: getOr(0, 'source.Hosts.totalCount', data), }); }} diff --git a/x-pack/legacy/plugins/siem/public/containers/network_dns/index.gql_query.ts b/x-pack/legacy/plugins/siem/public/containers/network_dns/index.gql_query.ts index 03c547257634f..365d93ee7e756 100644 --- a/x-pack/legacy/plugins/siem/public/containers/network_dns/index.gql_query.ts +++ b/x-pack/legacy/plugins/siem/public/containers/network_dns/index.gql_query.ts @@ -12,7 +12,7 @@ export const networkDnsQuery = gql` $sort: NetworkDnsSortField! $isPtrIncluded: Boolean! $timerange: TimerangeInput! - $pagination: PaginationInput! + $pagination: PaginationInputPaginated! $filterQuery: String $defaultIndex: [String!]! $inspect: Boolean! @@ -42,10 +42,9 @@ export const networkDnsQuery = gql` } } pageInfo { - endCursor { - value - } - hasNextPage + activePage + fakeTotalCount + showMorePagesIndicator } inspect @include(if: $inspect) { dsl diff --git a/x-pack/legacy/plugins/siem/public/containers/network_dns/index.tsx b/x-pack/legacy/plugins/siem/public/containers/network_dns/index.tsx index 1c9b7beaa3dfb..3eca8ee08d07a 100644 --- a/x-pack/legacy/plugins/siem/public/containers/network_dns/index.tsx +++ b/x-pack/legacy/plugins/siem/public/containers/network_dns/index.tsx @@ -15,12 +15,12 @@ import { GetNetworkDnsQuery, NetworkDnsEdges, NetworkDnsSortField, - PageInfo, + PageInfoPaginated, } from '../../graphql/types'; import { inputsModel, networkModel, networkSelectors, State, inputsSelectors } from '../../store'; +import { generateTablePaginationOptions } from '../../components/paginated_table/helpers'; import { createFilter } from '../helpers'; -import { QueryTemplate, QueryTemplateProps } from '../query_template'; - +import { QueryTemplatePaginated, QueryTemplatePaginatedProps } from '../query_template_paginated'; import { networkDnsQuery } from './index.gql_query'; const ID = 'networkDnsQuery'; @@ -28,81 +28,76 @@ const ID = 'networkDnsQuery'; export interface NetworkDnsArgs { id: string; inspect: inputsModel.InspectQuery; - networkDns: NetworkDnsEdges[]; - totalCount: number; - pageInfo: PageInfo; loading: boolean; - loadMore: (cursor: string) => void; + loadPage: (newActivePage: number) => void; + networkDns: NetworkDnsEdges[]; + pageInfo: PageInfoPaginated; refetch: inputsModel.Refetch; + totalCount: number; } -export interface OwnProps extends QueryTemplateProps { +export interface OwnProps extends QueryTemplatePaginatedProps { children: (args: NetworkDnsArgs) => React.ReactNode; type: networkModel.NetworkType; } export interface NetworkDnsComponentReduxProps { - isInspected: boolean; - limit: number; + activePage: number; dnsSortField: NetworkDnsSortField; + isInspected: boolean; isPtrIncluded: boolean; + limit: number; } type NetworkDnsProps = OwnProps & NetworkDnsComponentReduxProps; -class NetworkDnsComponentQuery extends QueryTemplate< +class NetworkDnsComponentQuery extends QueryTemplatePaginated< NetworkDnsProps, GetNetworkDnsQuery.Query, GetNetworkDnsQuery.Variables > { public render() { const { - id = ID, - isInspected, + activePage, children, dnsSortField, + endDate, filterQuery, + id = ID, + isInspected, isPtrIncluded, + limit, skip, sourceId, startDate, - endDate, - limit, } = this.props; return ( - query={networkDnsQuery} fetchPolicy="cache-and-network" notifyOnNetworkStatusChange + query={networkDnsQuery} skip={skip} variables={{ + defaultIndex: chrome.getUiSettingsClient().get(DEFAULT_INDEX_KEY), + filterQuery: createFilter(filterQuery), + inspect: isInspected, + isPtrIncluded, + pagination: generateTablePaginationOptions(activePage, limit), + sort: dnsSortField, sourceId, timerange: { interval: '12h', from: startDate!, to: endDate!, }, - sort: dnsSortField, - isPtrIncluded, - pagination: { - limit, - cursor: null, - tiebreaker: null, - }, - filterQuery: createFilter(filterQuery), - defaultIndex: chrome.getUiSettingsClient().get(DEFAULT_INDEX_KEY), - inspect: isInspected, }} > {({ data, loading, fetchMore, refetch }) => { const networkDns = getOr([], `source.NetworkDns.edges`, data); this.setFetchMore(fetchMore); - this.setFetchMoreOptions((newCursor: string) => ({ + this.setFetchMoreOptions((newActivePage: number) => ({ variables: { - pagination: { - cursor: newCursor, - limit: limit + parseInt(newCursor, 10), - }, + pagination: generateTablePaginationOptions(newActivePage, limit), }, updateQuery: (prev, { fetchMoreResult }) => { if (!fetchMoreResult) { @@ -114,10 +109,7 @@ class NetworkDnsComponentQuery extends QueryTemplate< ...fetchMoreResult.source, NetworkDns: { ...fetchMoreResult.source.NetworkDns, - edges: [ - ...prev.source.NetworkDns.edges, - ...fetchMoreResult.source.NetworkDns.edges, - ], + edges: [...fetchMoreResult.source.NetworkDns.edges], }, }, }; @@ -126,12 +118,12 @@ class NetworkDnsComponentQuery extends QueryTemplate< return children({ id, inspect: getOr(null, 'source.NetworkDns.inspect', data), - refetch, loading, - totalCount: getOr(0, 'source.NetworkDns.totalCount', data), + loadPage: this.wrappedLoadMore, networkDns, pageInfo: getOr({}, 'source.NetworkDns.pageInfo', data), - loadMore: this.wrappedLoadMore, + refetch, + totalCount: getOr(0, 'source.NetworkDns.totalCount', data), }); }} diff --git a/x-pack/legacy/plugins/siem/public/containers/network_top_n_flow/index.gql_query.ts b/x-pack/legacy/plugins/siem/public/containers/network_top_n_flow/index.gql_query.ts index 299e1bb5926d1..3e3f3ef306e3b 100644 --- a/x-pack/legacy/plugins/siem/public/containers/network_top_n_flow/index.gql_query.ts +++ b/x-pack/legacy/plugins/siem/public/containers/network_top_n_flow/index.gql_query.ts @@ -11,7 +11,7 @@ export const networkTopNFlowQuery = gql` $sourceId: ID! $flowDirection: FlowDirection! $filterQuery: String - $pagination: PaginationInput! + $pagination: PaginationInputPaginated! $sort: NetworkTopNFlowSortField! $flowTarget: FlowTarget! $timerange: TimerangeInput! @@ -63,10 +63,9 @@ export const networkTopNFlowQuery = gql` } } pageInfo { - endCursor { - value - } - hasNextPage + activePage + fakeTotalCount + showMorePagesIndicator } inspect @include(if: $inspect) { dsl diff --git a/x-pack/legacy/plugins/siem/public/containers/network_top_n_flow/index.tsx b/x-pack/legacy/plugins/siem/public/containers/network_top_n_flow/index.tsx index d496734f7b116..27c90721a6c1e 100644 --- a/x-pack/legacy/plugins/siem/public/containers/network_top_n_flow/index.tsx +++ b/x-pack/legacy/plugins/siem/public/containers/network_top_n_flow/index.tsx @@ -17,12 +17,12 @@ import { GetNetworkTopNFlowQuery, NetworkTopNFlowEdges, NetworkTopNFlowSortField, - PageInfo, + PageInfoPaginated, } from '../../graphql/types'; import { inputsModel, networkModel, networkSelectors, State, inputsSelectors } from '../../store'; +import { generateTablePaginationOptions } from '../../components/paginated_table/helpers'; import { createFilter } from '../helpers'; -import { QueryTemplate, QueryTemplateProps } from '../query_template'; - +import { QueryTemplatePaginated, QueryTemplatePaginatedProps } from '../query_template_paginated'; import { networkTopNFlowQuery } from './index.gql_query'; const ID = 'networkTopNFlowQuery'; @@ -30,84 +30,79 @@ const ID = 'networkTopNFlowQuery'; export interface NetworkTopNFlowArgs { id: string; inspect: inputsModel.InspectQuery; - networkTopNFlow: NetworkTopNFlowEdges[]; - totalCount: number; - pageInfo: PageInfo; loading: boolean; - loadMore: (cursor: string) => void; + loadPage: (newActivePage: number) => void; + networkTopNFlow: NetworkTopNFlowEdges[]; + pageInfo: PageInfoPaginated; refetch: inputsModel.Refetch; + totalCount: number; } -export interface OwnProps extends QueryTemplateProps { +export interface OwnProps extends QueryTemplatePaginatedProps { children: (args: NetworkTopNFlowArgs) => React.ReactNode; type: networkModel.NetworkType; } export interface NetworkTopNFlowComponentReduxProps { + activePage: number; + flowDirection: FlowDirection; + flowTarget: FlowTarget; isInspected: boolean; limit: number; - flowDirection: FlowDirection; topNFlowSort: NetworkTopNFlowSortField; - flowTarget: FlowTarget; } type NetworkTopNFlowProps = OwnProps & NetworkTopNFlowComponentReduxProps; -class NetworkTopNFlowComponentQuery extends QueryTemplate< +class NetworkTopNFlowComponentQuery extends QueryTemplatePaginated< NetworkTopNFlowProps, GetNetworkTopNFlowQuery.Query, GetNetworkTopNFlowQuery.Variables > { public render() { const { - id = ID, - isInspected, + activePage, children, + endDate, filterQuery, + flowDirection, + flowTarget, + id = ID, + isInspected, + limit, skip, sourceId, startDate, - endDate, - limit, - flowDirection, topNFlowSort, - flowTarget, } = this.props; return ( - query={networkTopNFlowQuery} fetchPolicy="cache-and-network" notifyOnNetworkStatusChange + query={networkTopNFlowQuery} skip={skip} variables={{ + defaultIndex: chrome.getUiSettingsClient().get(DEFAULT_INDEX_KEY), + filterQuery: createFilter(filterQuery), + flowDirection, + flowTarget, + inspect: isInspected, + pagination: generateTablePaginationOptions(activePage, limit), + sort: topNFlowSort, sourceId, timerange: { interval: '12h', from: startDate!, to: endDate!, }, - sort: topNFlowSort, - flowDirection, - flowTarget, - pagination: { - limit, - cursor: null, - tiebreaker: null, - }, - filterQuery: createFilter(filterQuery), - defaultIndex: chrome.getUiSettingsClient().get(DEFAULT_INDEX_KEY), - inspect: isInspected, }} > {({ data, loading, fetchMore, refetch }) => { const networkTopNFlow = getOr([], `source.NetworkTopNFlow.edges`, data); this.setFetchMore(fetchMore); - this.setFetchMoreOptions((newCursor: string) => ({ + this.setFetchMoreOptions((newActivePage: number) => ({ variables: { - pagination: { - cursor: newCursor, - limit: limit + parseInt(newCursor, 10), - }, + pagination: generateTablePaginationOptions(newActivePage, limit), }, updateQuery: (prev, { fetchMoreResult }) => { if (!fetchMoreResult) { @@ -119,10 +114,7 @@ class NetworkTopNFlowComponentQuery extends QueryTemplate< ...fetchMoreResult.source, NetworkTopNFlow: { ...fetchMoreResult.source.NetworkTopNFlow, - edges: [ - ...prev.source.NetworkTopNFlow.edges, - ...fetchMoreResult.source.NetworkTopNFlow.edges, - ], + edges: [...fetchMoreResult.source.NetworkTopNFlow.edges], }, }, }; @@ -131,12 +123,12 @@ class NetworkTopNFlowComponentQuery extends QueryTemplate< return children({ id, inspect: getOr(null, 'source.NetworkTopNFlow.inspect', data), - refetch, loading, - totalCount: getOr(0, 'source.NetworkTopNFlow.totalCount', data), + loadPage: this.wrappedLoadMore, networkTopNFlow, pageInfo: getOr({}, 'source.NetworkTopNFlow.pageInfo', data), - loadMore: this.wrappedLoadMore, + refetch, + totalCount: getOr(0, 'source.NetworkTopNFlow.totalCount', data), }); }} diff --git a/x-pack/legacy/plugins/siem/public/containers/tls/index.gql_query.ts b/x-pack/legacy/plugins/siem/public/containers/tls/index.gql_query.ts index 87570b0422364..15d5a8eb8a483 100644 --- a/x-pack/legacy/plugins/siem/public/containers/tls/index.gql_query.ts +++ b/x-pack/legacy/plugins/siem/public/containers/tls/index.gql_query.ts @@ -12,7 +12,7 @@ export const tlsQuery = gql` $filterQuery: String $flowTarget: FlowTarget! $ip: String! - $pagination: PaginationInput! + $pagination: PaginationInputPaginated! $sort: TlsSortField! $timerange: TimerangeInput! $defaultIndex: [String!]! @@ -44,10 +44,9 @@ export const tlsQuery = gql` } } pageInfo { - endCursor { - value - } - hasNextPage + activePage + fakeTotalCount + showMorePagesIndicator } inspect @include(if: $inspect) { dsl diff --git a/x-pack/legacy/plugins/siem/public/containers/tls/index.tsx b/x-pack/legacy/plugins/siem/public/containers/tls/index.tsx index 606ae3f70849f..4030af726d91a 100644 --- a/x-pack/legacy/plugins/siem/public/containers/tls/index.tsx +++ b/x-pack/legacy/plugins/siem/public/containers/tls/index.tsx @@ -11,11 +11,17 @@ import { connect } from 'react-redux'; import chrome from 'ui/chrome'; import { DEFAULT_INDEX_KEY } from '../../../common/constants'; -import { FlowTarget, PageInfo, TlsEdges, TlsSortField, GetTlsQuery } from '../../graphql/types'; +import { + FlowTarget, + PageInfoPaginated, + TlsEdges, + TlsSortField, + GetTlsQuery, +} from '../../graphql/types'; import { inputsModel, networkModel, networkSelectors, State, inputsSelectors } from '../../store'; import { createFilter } from '../helpers'; -import { QueryTemplate, QueryTemplateProps } from '../query_template'; - +import { generateTablePaginationOptions } from '../../components/paginated_table/helpers'; +import { QueryTemplatePaginated, QueryTemplatePaginatedProps } from '../query_template_paginated'; import { tlsQuery } from './index.gql_query'; const ID = 'tlsQuery'; @@ -23,15 +29,15 @@ const ID = 'tlsQuery'; export interface TlsArgs { id: string; inspect: inputsModel.InspectQuery; - tls: TlsEdges[]; - totalCount: number; - pageInfo: PageInfo; loading: boolean; - loadMore: (cursor: string) => void; + loadPage: (newActivePage: number) => void; + pageInfo: PageInfoPaginated; refetch: inputsModel.Refetch; + tls: TlsEdges[]; + totalCount: number; } -export interface OwnProps extends QueryTemplateProps { +export interface OwnProps extends QueryTemplatePaginatedProps { children: (args: TlsArgs) => React.ReactNode; flowTarget: FlowTarget; ip: string; @@ -39,6 +45,7 @@ export interface OwnProps extends QueryTemplateProps { } export interface TlsComponentReduxProps { + activePage: number; isInspected: boolean; limit: number; tlsSortField: TlsSortField; @@ -46,21 +53,26 @@ export interface TlsComponentReduxProps { type TlsProps = OwnProps & TlsComponentReduxProps; -class TlsComponentQuery extends QueryTemplate { +class TlsComponentQuery extends QueryTemplatePaginated< + TlsProps, + GetTlsQuery.Query, + GetTlsQuery.Variables +> { public render() { const { - id = ID, - isInspected, + activePage, children, - tlsSortField, + endDate, filterQuery, + flowTarget, + id = ID, ip, + isInspected, + limit, skip, sourceId, startDate, - endDate, - limit, - flowTarget, + tlsSortField, } = this.props; return ( @@ -69,34 +81,27 @@ class TlsComponentQuery extends QueryTemplate {({ data, loading, fetchMore, refetch }) => { const tls = getOr([], 'source.Tls.edges', data); this.setFetchMore(fetchMore); - this.setFetchMoreOptions((newCursor: string) => ({ + this.setFetchMoreOptions((newActivePage: number) => ({ variables: { - pagination: { - cursor: newCursor, - limit: limit + parseInt(newCursor, 10), - }, + pagination: generateTablePaginationOptions(newActivePage, limit), }, updateQuery: (prev, { fetchMoreResult }) => { if (!fetchMoreResult) { @@ -108,7 +113,7 @@ class TlsComponentQuery extends QueryTemplate diff --git a/x-pack/legacy/plugins/siem/public/containers/uncommon_processes/index.gql_query.ts b/x-pack/legacy/plugins/siem/public/containers/uncommon_processes/index.gql_query.ts index 5aa4cd4d75bba..d984de020faa1 100644 --- a/x-pack/legacy/plugins/siem/public/containers/uncommon_processes/index.gql_query.ts +++ b/x-pack/legacy/plugins/siem/public/containers/uncommon_processes/index.gql_query.ts @@ -10,7 +10,7 @@ export const uncommonProcessesQuery = gql` query GetUncommonProcessesQuery( $sourceId: ID! $timerange: TimerangeInput! - $pagination: PaginationInput! + $pagination: PaginationInputPaginated! $filterQuery: String $defaultIndex: [String!]! $inspect: Boolean! @@ -45,10 +45,9 @@ export const uncommonProcessesQuery = gql` } } pageInfo { - endCursor { - value - } - hasNextPage + activePage + fakeTotalCount + showMorePagesIndicator } inspect @include(if: $inspect) { dsl diff --git a/x-pack/legacy/plugins/siem/public/containers/uncommon_processes/index.tsx b/x-pack/legacy/plugins/siem/public/containers/uncommon_processes/index.tsx index a83139f61f805..2054a3b9a4414 100644 --- a/x-pack/legacy/plugins/siem/public/containers/uncommon_processes/index.tsx +++ b/x-pack/legacy/plugins/siem/public/containers/uncommon_processes/index.tsx @@ -11,10 +11,15 @@ import { connect } from 'react-redux'; import chrome from 'ui/chrome'; import { DEFAULT_INDEX_KEY } from '../../../common/constants'; -import { GetUncommonProcessesQuery, PageInfo, UncommonProcessesEdges } from '../../graphql/types'; +import { + GetUncommonProcessesQuery, + PageInfoPaginated, + UncommonProcessesEdges, +} from '../../graphql/types'; import { hostsModel, hostsSelectors, inputsModel, State, inputsSelectors } from '../../store'; +import { generateTablePaginationOptions } from '../../components/paginated_table/helpers'; import { createFilter, getDefaultFetchPolicy } from '../helpers'; -import { QueryTemplate, QueryTemplateProps } from '../query_template'; +import { QueryTemplatePaginated, QueryTemplatePaginatedProps } from '../query_template_paginated'; import { uncommonProcessesQuery } from './index.gql_query'; @@ -22,43 +27,45 @@ const ID = 'uncommonProcessesQuery'; export interface UncommonProcessesArgs { id: string; - uncommonProcesses: UncommonProcessesEdges[]; - totalCount: number; - pageInfo: PageInfo; + inspect: inputsModel.InspectQuery; loading: boolean; - loadMore: (cursor: string) => void; + loadPage: (newActivePage: number) => void; + pageInfo: PageInfoPaginated; refetch: inputsModel.Refetch; - inspect: inputsModel.InspectQuery; + totalCount: number; + uncommonProcesses: UncommonProcessesEdges[]; } -export interface OwnProps extends QueryTemplateProps { +export interface OwnProps extends QueryTemplatePaginatedProps { children: (args: UncommonProcessesArgs) => React.ReactNode; type: hostsModel.HostsType; } export interface UncommonProcessesComponentReduxProps { + activePage: number; isInspected: boolean; limit: number; } type UncommonProcessesProps = OwnProps & UncommonProcessesComponentReduxProps; -class UncommonProcessesComponentQuery extends QueryTemplate< +class UncommonProcessesComponentQuery extends QueryTemplatePaginated< UncommonProcessesProps, GetUncommonProcessesQuery.Query, GetUncommonProcessesQuery.Variables > { public render() { const { - id = ID, + activePage, children, + endDate, filterQuery, + id = ID, isInspected, + limit, skip, sourceId, startDate, - endDate, - limit, } = this.props; return ( @@ -67,31 +74,24 @@ class UncommonProcessesComponentQuery extends QueryTemplate< notifyOnNetworkStatusChange skip={skip} variables={{ + defaultIndex: chrome.getUiSettingsClient().get(DEFAULT_INDEX_KEY), + filterQuery: createFilter(filterQuery), + inspect: isInspected, + pagination: generateTablePaginationOptions(activePage, limit), sourceId, timerange: { interval: '12h', from: startDate!, to: endDate!, }, - pagination: { - limit, - cursor: null, - tiebreaker: null, - }, - filterQuery: createFilter(filterQuery), - defaultIndex: chrome.getUiSettingsClient().get(DEFAULT_INDEX_KEY), - inspect: isInspected, }} > {({ data, loading, fetchMore, refetch }) => { const uncommonProcesses = getOr([], 'source.UncommonProcesses.edges', data); this.setFetchMore(fetchMore); - this.setFetchMoreOptions((newCursor: string) => ({ + this.setFetchMoreOptions((newActivePage: number) => ({ variables: { - pagination: { - cursor: newCursor, - limit: limit + parseInt(newCursor, 10), - }, + pagination: generateTablePaginationOptions(newActivePage, limit), }, updateQuery: (prev, { fetchMoreResult }) => { if (!fetchMoreResult) { @@ -103,10 +103,7 @@ class UncommonProcessesComponentQuery extends QueryTemplate< ...fetchMoreResult.source, UncommonProcesses: { ...fetchMoreResult.source.UncommonProcesses, - edges: [ - ...prev.source.UncommonProcesses.edges, - ...fetchMoreResult.source.UncommonProcesses.edges, - ], + edges: [...fetchMoreResult.source.UncommonProcesses.edges], }, }, }; @@ -116,11 +113,11 @@ class UncommonProcessesComponentQuery extends QueryTemplate< id, inspect: getOr(null, 'source.UncommonProcesses.inspect', data), loading, + loadPage: this.wrappedLoadMore, + pageInfo: getOr({}, 'source.UncommonProcesses.pageInfo', data), refetch, totalCount: getOr(0, 'source.UncommonProcesses.totalCount', data), uncommonProcesses, - pageInfo: getOr({}, 'source.UncommonProcesses.pageInfo', data), - loadMore: this.wrappedLoadMore, }); }} diff --git a/x-pack/legacy/plugins/siem/public/containers/users/index.gql_query.ts b/x-pack/legacy/plugins/siem/public/containers/users/index.gql_query.ts index abdfa96ba7e0a..3fc1cdfd160db 100644 --- a/x-pack/legacy/plugins/siem/public/containers/users/index.gql_query.ts +++ b/x-pack/legacy/plugins/siem/public/containers/users/index.gql_query.ts @@ -12,7 +12,7 @@ export const usersQuery = gql` $filterQuery: String $flowTarget: FlowTarget! $ip: String! - $pagination: PaginationInput! + $pagination: PaginationInputPaginated! $sort: UsersSortField! $timerange: TimerangeInput! $defaultIndex: [String!]! @@ -45,10 +45,9 @@ export const usersQuery = gql` } } pageInfo { - endCursor { - value - } - hasNextPage + activePage + fakeTotalCount + showMorePagesIndicator } inspect @include(if: $inspect) { dsl diff --git a/x-pack/legacy/plugins/siem/public/containers/users/index.tsx b/x-pack/legacy/plugins/siem/public/containers/users/index.tsx index c59acf5e18761..12c561c482ef3 100644 --- a/x-pack/legacy/plugins/siem/public/containers/users/index.tsx +++ b/x-pack/legacy/plugins/siem/public/containers/users/index.tsx @@ -14,13 +14,14 @@ import { DEFAULT_INDEX_KEY } from '../../../common/constants'; import { GetUsersQuery, FlowTarget, - PageInfo, + PageInfoPaginated, UsersEdges, UsersSortField, } from '../../graphql/types'; import { inputsModel, networkModel, networkSelectors, State, inputsSelectors } from '../../store'; import { createFilter } from '../helpers'; -import { QueryTemplate, QueryTemplateProps } from '../query_template'; +import { generateTablePaginationOptions } from '../../components/paginated_table/helpers'; +import { QueryTemplatePaginated, QueryTemplatePaginatedProps } from '../query_template_paginated'; import { usersQuery } from './index.gql_query'; @@ -29,15 +30,15 @@ const ID = 'usersQuery'; export interface UsersArgs { id: string; inspect: inputsModel.InspectQuery; - users: UsersEdges[]; - totalCount: number; - pageInfo: PageInfo; loading: boolean; - loadMore: (cursor: string) => void; + loadPage: (newActivePage: number) => void; + pageInfo: PageInfoPaginated; refetch: inputsModel.Refetch; + totalCount: number; + users: UsersEdges[]; } -export interface OwnProps extends QueryTemplateProps { +export interface OwnProps extends QueryTemplatePaginatedProps { children: (args: UsersArgs) => React.ReactNode; flowTarget: FlowTarget; ip: string; @@ -45,6 +46,7 @@ export interface OwnProps extends QueryTemplateProps { } export interface UsersComponentReduxProps { + activePage: number; isInspected: boolean; limit: number; usersSortField: UsersSortField; @@ -52,25 +54,26 @@ export interface UsersComponentReduxProps { type UsersProps = OwnProps & UsersComponentReduxProps; -class UsersComponentQuery extends QueryTemplate< +class UsersComponentQuery extends QueryTemplatePaginated< UsersProps, GetUsersQuery.Query, GetUsersQuery.Variables > { public render() { const { - id = ID, - isInspected, + activePage, children, - usersSortField, + endDate, filterQuery, + flowTarget, + id = ID, ip, + isInspected, + limit, skip, sourceId, startDate, - endDate, - limit, - flowTarget, + usersSortField, } = this.props; return ( @@ -79,34 +82,27 @@ class UsersComponentQuery extends QueryTemplate< notifyOnNetworkStatusChange skip={skip} variables={{ + defaultIndex: chrome.getUiSettingsClient().get(DEFAULT_INDEX_KEY), + filterQuery: createFilter(filterQuery), + flowTarget, + inspect: isInspected, + ip, + pagination: generateTablePaginationOptions(activePage, limit), + sort: usersSortField, sourceId, timerange: { interval: '12h', from: startDate!, to: endDate!, }, - ip, - flowTarget, - sort: usersSortField, - pagination: { - limit, - cursor: null, - tiebreaker: null, - }, - filterQuery: createFilter(filterQuery), - defaultIndex: chrome.getUiSettingsClient().get(DEFAULT_INDEX_KEY), - inspect: isInspected, }} > {({ data, loading, fetchMore, refetch }) => { const users = getOr([], `source.Users.edges`, data); this.setFetchMore(fetchMore); - this.setFetchMoreOptions((newCursor: string) => ({ + this.setFetchMoreOptions((newActivePage: number) => ({ variables: { - pagination: { - cursor: newCursor, - limit: limit + parseInt(newCursor, 10), - }, + pagination: generateTablePaginationOptions(newActivePage, limit), }, updateQuery: (prev, { fetchMoreResult }) => { if (!fetchMoreResult) { @@ -118,7 +114,7 @@ class UsersComponentQuery extends QueryTemplate< ...fetchMoreResult.source, Users: { ...fetchMoreResult.source.Users, - edges: [...prev.source.Users.edges, ...fetchMoreResult.source.Users.edges], + edges: [...fetchMoreResult.source.Users.edges], }, }, }; @@ -127,12 +123,12 @@ class UsersComponentQuery extends QueryTemplate< return children({ id, inspect: getOr(null, 'source.Users.inspect', data), - refetch, loading, + loadPage: this.wrappedLoadMore, + pageInfo: getOr({}, 'source.Users.pageInfo', data), + refetch, totalCount: getOr(0, 'source.Users.totalCount', data), users, - pageInfo: getOr({}, 'source.Users.pageInfo', data), - loadMore: this.wrappedLoadMore, }); }} diff --git a/x-pack/legacy/plugins/siem/public/graphql/introspection.json b/x-pack/legacy/plugins/siem/public/graphql/introspection.json index baeba2e3415a7..fe0187f93d2a5 100644 --- a/x-pack/legacy/plugins/siem/public/graphql/introspection.json +++ b/x-pack/legacy/plugins/siem/public/graphql/introspection.json @@ -737,7 +737,11 @@ "type": { "kind": "NON_NULL", "name": null, - "ofType": { "kind": "INPUT_OBJECT", "name": "PaginationInput", "ofType": null } + "ofType": { + "kind": "INPUT_OBJECT", + "name": "PaginationInputPaginated", + "ofType": null + } }, "defaultValue": null }, @@ -1005,7 +1009,11 @@ "type": { "kind": "NON_NULL", "name": null, - "ofType": { "kind": "INPUT_OBJECT", "name": "PaginationInput", "ofType": null } + "ofType": { + "kind": "INPUT_OBJECT", + "name": "PaginationInputPaginated", + "ofType": null + } }, "defaultValue": null }, @@ -1237,7 +1245,11 @@ "type": { "kind": "NON_NULL", "name": null, - "ofType": { "kind": "INPUT_OBJECT", "name": "PaginationInput", "ofType": null } + "ofType": { + "kind": "INPUT_OBJECT", + "name": "PaginationInputPaginated", + "ofType": null + } }, "defaultValue": null }, @@ -1340,7 +1352,11 @@ "type": { "kind": "NON_NULL", "name": null, - "ofType": { "kind": "INPUT_OBJECT", "name": "PaginationInput", "ofType": null } + "ofType": { + "kind": "INPUT_OBJECT", + "name": "PaginationInputPaginated", + "ofType": null + } }, "defaultValue": null }, @@ -1433,7 +1449,11 @@ "type": { "kind": "NON_NULL", "name": null, - "ofType": { "kind": "INPUT_OBJECT", "name": "PaginationInput", "ofType": null } + "ofType": { + "kind": "INPUT_OBJECT", + "name": "PaginationInputPaginated", + "ofType": null + } }, "defaultValue": null }, @@ -1691,7 +1711,11 @@ "type": { "kind": "NON_NULL", "name": null, - "ofType": { "kind": "INPUT_OBJECT", "name": "PaginationInput", "ofType": null } + "ofType": { + "kind": "INPUT_OBJECT", + "name": "PaginationInputPaginated", + "ofType": null + } }, "defaultValue": null }, @@ -1778,7 +1802,11 @@ "type": { "kind": "NON_NULL", "name": null, - "ofType": { "kind": "INPUT_OBJECT", "name": "PaginationInput", "ofType": null } + "ofType": { + "kind": "INPUT_OBJECT", + "name": "PaginationInputPaginated", + "ofType": null + } }, "defaultValue": null }, @@ -1951,7 +1979,11 @@ "type": { "kind": "NON_NULL", "name": null, - "ofType": { "kind": "INPUT_OBJECT", "name": "PaginationInput", "ofType": null } + "ofType": { + "kind": "INPUT_OBJECT", + "name": "PaginationInputPaginated", + "ofType": null + } }, "defaultValue": null }, @@ -3103,39 +3135,6 @@ "enumValues": null, "possibleTypes": null }, - { - "kind": "INPUT_OBJECT", - "name": "PaginationInput", - "description": "", - "fields": null, - "inputFields": [ - { - "name": "limit", - "description": "The limit parameter allows you to configure the maximum amount of items to be returned", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { "kind": "SCALAR", "name": "Float", "ofType": null } - }, - "defaultValue": null - }, - { - "name": "cursor", - "description": "The cursor parameter defines the next result you want to fetch", - "type": { "kind": "SCALAR", "name": "String", "ofType": null }, - "defaultValue": null - }, - { - "name": "tiebreaker", - "description": "The tiebreaker parameter allow to be more precise to fetch the next item", - "type": { "kind": "SCALAR", "name": "String", "ofType": null }, - "defaultValue": null - } - ], - "interfaces": null, - "enumValues": null, - "possibleTypes": null - }, { "kind": "INPUT_OBJECT", "name": "SortField", @@ -3211,7 +3210,7 @@ "type": { "kind": "NON_NULL", "name": null, - "ofType": { "kind": "OBJECT", "name": "PageInfo", "ofType": null } + "ofType": { "kind": "OBJECT", "name": "PageInfoPaginated", "ofType": null } }, "isDeprecated": false, "deprecationReason": null @@ -5209,29 +5208,35 @@ "possibleTypes": null }, { - "kind": "OBJECT", - "name": "PageInfo", + "kind": "INPUT_OBJECT", + "name": "PaginationInput", "description": "", - "fields": [ + "fields": null, + "inputFields": [ { - "name": "endCursor", - "description": "", - "args": [], - "type": { "kind": "OBJECT", "name": "CursorType", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null + "name": "limit", + "description": "The limit parameter allows you to configure the maximum amount of items to be returned", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { "kind": "SCALAR", "name": "Float", "ofType": null } + }, + "defaultValue": null }, { - "name": "hasNextPage", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "Boolean", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null + "name": "cursor", + "description": "The cursor parameter defines the next result you want to fetch", + "type": { "kind": "SCALAR", "name": "String", "ofType": null }, + "defaultValue": null + }, + { + "name": "tiebreaker", + "description": "The tiebreaker parameter allow to be more precise to fetch the next item", + "type": { "kind": "SCALAR", "name": "String", "ofType": null }, + "defaultValue": null } ], - "inputFields": null, - "interfaces": [], + "interfaces": null, "enumValues": null, "possibleTypes": null }, @@ -5427,6 +5432,33 @@ "enumValues": null, "possibleTypes": null }, + { + "kind": "OBJECT", + "name": "PageInfo", + "description": "", + "fields": [ + { + "name": "endCursor", + "description": "", + "args": [], + "type": { "kind": "OBJECT", "name": "CursorType", "ofType": null }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "hasNextPage", + "description": "", + "args": [], + "type": { "kind": "SCALAR", "name": "Boolean", "ofType": null }, + "isDeprecated": false, + "deprecationReason": null + } + ], + "inputFields": null, + "interfaces": [], + "enumValues": null, + "possibleTypes": null + }, { "kind": "OBJECT", "name": "TimelineDetailsData", @@ -5684,7 +5716,7 @@ "type": { "kind": "NON_NULL", "name": null, - "ofType": { "kind": "OBJECT", "name": "PageInfo", "ofType": null } + "ofType": { "kind": "OBJECT", "name": "PageInfoPaginated", "ofType": null } }, "isDeprecated": false, "deprecationReason": null @@ -6224,7 +6256,7 @@ "type": { "kind": "NON_NULL", "name": null, - "ofType": { "kind": "OBJECT", "name": "PageInfo", "ofType": null } + "ofType": { "kind": "OBJECT", "name": "PageInfoPaginated", "ofType": null } }, "isDeprecated": false, "deprecationReason": null @@ -6580,7 +6612,7 @@ "type": { "kind": "NON_NULL", "name": null, - "ofType": { "kind": "OBJECT", "name": "PageInfo", "ofType": null } + "ofType": { "kind": "OBJECT", "name": "PageInfoPaginated", "ofType": null } }, "isDeprecated": false, "deprecationReason": null @@ -6829,7 +6861,7 @@ "type": { "kind": "NON_NULL", "name": null, - "ofType": { "kind": "OBJECT", "name": "PageInfo", "ofType": null } + "ofType": { "kind": "OBJECT", "name": "PageInfoPaginated", "ofType": null } }, "isDeprecated": false, "deprecationReason": null @@ -7470,7 +7502,7 @@ "type": { "kind": "NON_NULL", "name": null, - "ofType": { "kind": "OBJECT", "name": "PageInfo", "ofType": null } + "ofType": { "kind": "OBJECT", "name": "PageInfoPaginated", "ofType": null } }, "isDeprecated": false, "deprecationReason": null @@ -7793,7 +7825,7 @@ "type": { "kind": "NON_NULL", "name": null, - "ofType": { "kind": "OBJECT", "name": "PageInfo", "ofType": null } + "ofType": { "kind": "OBJECT", "name": "PageInfoPaginated", "ofType": null } }, "isDeprecated": false, "deprecationReason": null @@ -8124,7 +8156,7 @@ "type": { "kind": "NON_NULL", "name": null, - "ofType": { "kind": "OBJECT", "name": "PageInfo", "ofType": null } + "ofType": { "kind": "OBJECT", "name": "PageInfoPaginated", "ofType": null } }, "isDeprecated": false, "deprecationReason": null @@ -10543,6 +10575,69 @@ ], "possibleTypes": null }, + { + "kind": "OBJECT", + "name": "EventsTimelineData", + "description": "", + "fields": [ + { + "name": "edges", + "description": "", + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { "kind": "OBJECT", "name": "EcsEdges", "ofType": null } + } + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "totalCount", + "description": "", + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { "kind": "SCALAR", "name": "Float", "ofType": null } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "pageInfo", + "description": "", + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { "kind": "OBJECT", "name": "PageInfo", "ofType": null } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "inspect", + "description": "", + "args": [], + "type": { "kind": "OBJECT", "name": "Inspect", "ofType": null }, + "isDeprecated": false, + "deprecationReason": null + } + ], + "inputFields": null, + "interfaces": [], + "enumValues": null, + "possibleTypes": null + }, { "kind": "OBJECT", "name": "OsFields", diff --git a/x-pack/legacy/plugins/siem/public/graphql/types.ts b/x-pack/legacy/plugins/siem/public/graphql/types.ts index bad3371bb2eed..49eb6ef8fd68a 100644 --- a/x-pack/legacy/plugins/siem/public/graphql/types.ts +++ b/x-pack/legacy/plugins/siem/public/graphql/types.ts @@ -342,7 +342,7 @@ export interface EventsData { totalCount: number; - pageInfo: PageInfo; + pageInfo: PageInfoPaginated; inspect?: Inspect | null; } @@ -805,12 +805,6 @@ export interface SshEcsFields { signature?: ToStringArray | null; } -export interface PageInfo { - endCursor?: CursorType | null; - - hasNextPage?: boolean | null; -} - export interface TimelineData { edges: TimelineEdges[]; @@ -843,6 +837,12 @@ export interface TimelineNonEcsData { value?: ToStringArray | null; } +export interface PageInfo { + endCursor?: CursorType | null; + + hasNextPage?: boolean | null; +} + export interface TimelineDetailsData { data?: DetailItem[] | null; @@ -868,7 +868,7 @@ export interface HostsData { totalCount: number; - pageInfo: PageInfo; + pageInfo: PageInfoPaginated; inspect?: Inspect | null; } @@ -954,7 +954,7 @@ export interface DomainsData { totalCount: number; - pageInfo: PageInfo; + pageInfo: PageInfoPaginated; inspect?: Inspect | null; } @@ -1006,7 +1006,7 @@ export interface TlsData { totalCount: number; - pageInfo: PageInfo; + pageInfo: PageInfoPaginated; inspect?: Inspect | null; } @@ -1038,7 +1038,7 @@ export interface UsersData { totalCount: number; - pageInfo: PageInfo; + pageInfo: PageInfoPaginated; inspect?: Inspect | null; } @@ -1150,7 +1150,7 @@ export interface NetworkTopNFlowData { totalCount: number; - pageInfo: PageInfo; + pageInfo: PageInfoPaginated; inspect?: Inspect | null; } @@ -1198,7 +1198,7 @@ export interface NetworkDnsData { totalCount: number; - pageInfo: PageInfo; + pageInfo: PageInfoPaginated; inspect?: Inspect | null; } @@ -1270,7 +1270,7 @@ export interface UncommonProcessesData { totalCount: number; - pageInfo: PageInfo; + pageInfo: PageInfoPaginated; inspect?: Inspect | null; } @@ -1483,6 +1483,16 @@ export interface ResponseFavoriteTimeline { favorite?: FavoriteTimelineResult[] | null; } +export interface EventsTimelineData { + edges: EcsEdges[]; + + totalCount: number; + + pageInfo: PageInfo; + + inspect?: Inspect | null; +} + export interface OsFields { platform?: string | null; @@ -1549,6 +1559,12 @@ export interface PaginationInputPaginated { querySize: number; } +export interface SortField { + sortFieldId: string; + + direction: Direction; +} + export interface PaginationInput { /** The limit parameter allows you to configure the maximum amount of items to be returned */ limit: number; @@ -1558,12 +1574,6 @@ export interface PaginationInput { tiebreaker?: string | null; } -export interface SortField { - sortFieldId: string; - - direction: Direction; -} - export interface LastTimeDetails { hostName?: string | null; @@ -1781,7 +1791,7 @@ export interface AuthenticationsSourceArgs { defaultIndex: string[]; } export interface EventsSourceArgs { - pagination: PaginationInput; + pagination: PaginationInputPaginated; sortField: SortField; @@ -1825,7 +1835,7 @@ export interface HostsSourceArgs { timerange: TimerangeInput; - pagination: PaginationInput; + pagination: PaginationInputPaginated; sort: HostsSortField; @@ -1865,7 +1875,7 @@ export interface DomainsSourceArgs { ip: string; - pagination: PaginationInput; + pagination: PaginationInputPaginated; sort: DomainsSortField; @@ -1884,7 +1894,7 @@ export interface TlsSourceArgs { ip: string; - pagination: PaginationInput; + pagination: PaginationInputPaginated; sort: TlsSortField; @@ -1901,7 +1911,7 @@ export interface UsersSourceArgs { ip: string; - pagination: PaginationInput; + pagination: PaginationInputPaginated; sort: UsersSortField; @@ -1947,7 +1957,7 @@ export interface NetworkTopNFlowSourceArgs { flowTarget: FlowTarget; - pagination: PaginationInput; + pagination: PaginationInputPaginated; sort: NetworkTopNFlowSortField; @@ -1962,7 +1972,7 @@ export interface NetworkDnsSourceArgs { isPtrIncluded: boolean; - pagination: PaginationInput; + pagination: PaginationInputPaginated; sort: NetworkDnsSortField; @@ -1991,7 +2001,7 @@ export interface OverviewHostSourceArgs { export interface UncommonProcessesSourceArgs { timerange: TimerangeInput; - pagination: PaginationInput; + pagination: PaginationInputPaginated; filterQuery?: string | null; @@ -2286,7 +2296,7 @@ export namespace GetDomainsQuery { flowDirection: FlowDirection; flowTarget: FlowTarget; ip: string; - pagination: PaginationInput; + pagination: PaginationInputPaginated; sort: DomainsSortField; timerange: TimerangeInput; defaultIndex: string[]; @@ -2378,17 +2388,13 @@ export namespace GetDomainsQuery { }; export type PageInfo = { - __typename?: 'PageInfo'; - - endCursor?: EndCursor | null; + __typename?: 'PageInfoPaginated'; - hasNextPage?: boolean | null; - }; + activePage: number; - export type EndCursor = { - __typename?: 'CursorType'; + fakeTotalCount: number; - value?: string | null; + showMorePagesIndicator: boolean; }; export type Inspect = { @@ -2404,7 +2410,7 @@ export namespace GetEventsQuery { export type Variables = { sourceId: string; timerange: TimerangeInput; - pagination: PaginationInput; + pagination: PaginationInputPaginated; sortField: SortField; filterQuery?: string | null; defaultIndex: string[]; @@ -2438,19 +2444,13 @@ export namespace GetEventsQuery { }; export type PageInfo = { - __typename?: 'PageInfo'; - - endCursor?: EndCursor | null; - - hasNextPage?: boolean | null; - }; + __typename?: 'PageInfoPaginated'; - export type EndCursor = { - __typename?: 'CursorType'; + activePage: number; - value?: string | null; + fakeTotalCount: number; - tiebreaker?: string | null; + showMorePagesIndicator: boolean; }; export type Inspect = { @@ -2635,7 +2635,7 @@ export namespace GetHostsTableQuery { export type Variables = { sourceId: string; timerange: TimerangeInput; - pagination: PaginationInput; + pagination: PaginationInputPaginated; sort: HostsSortField; filterQuery?: string | null; defaultIndex: string[]; @@ -2711,17 +2711,13 @@ export namespace GetHostsTableQuery { }; export type PageInfo = { - __typename?: 'PageInfo'; - - endCursor?: EndCursor | null; + __typename?: 'PageInfoPaginated'; - hasNextPage?: boolean | null; - }; + activePage: number; - export type EndCursor = { - __typename?: 'CursorType'; + fakeTotalCount: number; - value?: string | null; + showMorePagesIndicator: boolean; }; export type Inspect = { @@ -3195,7 +3191,7 @@ export namespace GetNetworkDnsQuery { sort: NetworkDnsSortField; isPtrIncluded: boolean; timerange: TimerangeInput; - pagination: PaginationInput; + pagination: PaginationInputPaginated; filterQuery?: string | null; defaultIndex: string[]; inspect: boolean; @@ -3258,17 +3254,13 @@ export namespace GetNetworkDnsQuery { }; export type PageInfo = { - __typename?: 'PageInfo'; - - endCursor?: EndCursor | null; + __typename?: 'PageInfoPaginated'; - hasNextPage?: boolean | null; - }; + activePage: number; - export type EndCursor = { - __typename?: 'CursorType'; + fakeTotalCount: number; - value?: string | null; + showMorePagesIndicator: boolean; }; export type Inspect = { @@ -3285,7 +3277,7 @@ export namespace GetNetworkTopNFlowQuery { sourceId: string; flowDirection: FlowDirection; filterQuery?: string | null; - pagination: PaginationInput; + pagination: PaginationInputPaginated; sort: NetworkTopNFlowSortField; flowTarget: FlowTarget; timerange: TimerangeInput; @@ -3398,17 +3390,13 @@ export namespace GetNetworkTopNFlowQuery { }; export type PageInfo = { - __typename?: 'PageInfo'; - - endCursor?: EndCursor | null; + __typename?: 'PageInfoPaginated'; - hasNextPage?: boolean | null; - }; + activePage: number; - export type EndCursor = { - __typename?: 'CursorType'; + fakeTotalCount: number; - value?: string | null; + showMorePagesIndicator: boolean; }; export type Inspect = { @@ -5001,7 +4989,7 @@ export namespace GetTlsQuery { filterQuery?: string | null; flowTarget: FlowTarget; ip: string; - pagination: PaginationInput; + pagination: PaginationInputPaginated; sort: TlsSortField; timerange: TimerangeInput; defaultIndex: string[]; @@ -5065,17 +5053,13 @@ export namespace GetTlsQuery { }; export type PageInfo = { - __typename?: 'PageInfo'; - - endCursor?: EndCursor | null; + __typename?: 'PageInfoPaginated'; - hasNextPage?: boolean | null; - }; + activePage: number; - export type EndCursor = { - __typename?: 'CursorType'; + fakeTotalCount: number; - value?: string | null; + showMorePagesIndicator: boolean; }; export type Inspect = { @@ -5091,7 +5075,7 @@ export namespace GetUncommonProcessesQuery { export type Variables = { sourceId: string; timerange: TimerangeInput; - pagination: PaginationInput; + pagination: PaginationInputPaginated; filterQuery?: string | null; defaultIndex: string[]; inspect: boolean; @@ -5174,17 +5158,13 @@ export namespace GetUncommonProcessesQuery { }; export type PageInfo = { - __typename?: 'PageInfo'; - - endCursor?: EndCursor | null; + __typename?: 'PageInfoPaginated'; - hasNextPage?: boolean | null; - }; + activePage: number; - export type EndCursor = { - __typename?: 'CursorType'; + fakeTotalCount: number; - value?: string | null; + showMorePagesIndicator: boolean; }; export type Inspect = { @@ -5202,7 +5182,7 @@ export namespace GetUsersQuery { filterQuery?: string | null; flowTarget: FlowTarget; ip: string; - pagination: PaginationInput; + pagination: PaginationInputPaginated; sort: UsersSortField; timerange: TimerangeInput; defaultIndex: string[]; @@ -5270,17 +5250,13 @@ export namespace GetUsersQuery { }; export type PageInfo = { - __typename?: 'PageInfo'; - - endCursor?: EndCursor | null; + __typename?: 'PageInfoPaginated'; - hasNextPage?: boolean | null; - }; + activePage: number; - export type EndCursor = { - __typename?: 'CursorType'; + fakeTotalCount: number; - value?: string | null; + showMorePagesIndicator: boolean; }; export type Inspect = { diff --git a/x-pack/legacy/plugins/siem/public/mock/global_state.ts b/x-pack/legacy/plugins/siem/public/mock/global_state.ts index b71742f2ad85e..02c4a1bf280e1 100644 --- a/x-pack/legacy/plugins/siem/public/mock/global_state.ts +++ b/x-pack/legacy/plugins/siem/public/mock/global_state.ts @@ -33,12 +33,13 @@ export const mockGlobalState: State = { queries: { authentications: { activePage: 0, limit: 10 }, hosts: { + activePage: 0, limit: 10, direction: Direction.desc, sortField: HostsFields.lastSeen, }, - events: { limit: 10 }, - uncommonProcesses: { limit: 10 }, + events: { activePage: 0, limit: 10 }, + uncommonProcesses: { activePage: 0, limit: 10 }, }, filterQuery: null, filterQueryDraft: null, @@ -47,12 +48,13 @@ export const mockGlobalState: State = { queries: { authentications: { activePage: 0, limit: 10 }, hosts: { + activePage: 0, limit: 10, direction: Direction.desc, sortField: HostsFields.lastSeen, }, - events: { limit: 10 }, - uncommonProcesses: { limit: 10 }, + events: { activePage: 0, limit: 10 }, + uncommonProcesses: { activePage: 0, limit: 10 }, }, filterQuery: null, filterQueryDraft: null, @@ -62,12 +64,14 @@ export const mockGlobalState: State = { page: { queries: { topNFlow: { + activePage: 0, limit: 10, flowTarget: FlowTarget.source, flowDirection: FlowDirection.uniDirectional, topNFlowSort: { field: NetworkTopNFlowFields.bytes, direction: Direction.desc }, }, dns: { + activePage: 0, limit: 10, dnsSortField: { field: NetworkDnsFields.queryCount, direction: Direction.desc }, isPtrIncluded: false, @@ -82,15 +86,18 @@ export const mockGlobalState: State = { flowTarget: FlowTarget.source, queries: { domains: { + activePage: 0, limit: 10, flowDirection: FlowDirection.uniDirectional, domainsSortField: { field: DomainsFields.bytes, direction: Direction.desc }, }, tls: { + activePage: 0, limit: 10, tlsSortField: { field: TlsFields._id, direction: Direction.desc }, }, users: { + activePage: 0, limit: 10, usersSortField: { field: UsersFields.name, direction: Direction.asc }, }, diff --git a/x-pack/legacy/plugins/siem/public/pages/hosts/host_details.tsx b/x-pack/legacy/plugins/siem/public/pages/hosts/host_details.tsx index e3c971436ed1b..f6ad586a83b2b 100644 --- a/x-pack/legacy/plugins/siem/public/pages/hosts/host_details.tsx +++ b/x-pack/legacy/plugins/siem/public/pages/hosts/host_details.tsx @@ -206,26 +206,30 @@ const HostDetailsComponent = pure( type={type} > {({ - uncommonProcesses, - totalCount, - loading, - pageInfo, - loadMore, id, inspect, + loading, + loadPage, + pageInfo, refetch, + totalCount, + uncommonProcesses, }) => ( )} @@ -261,26 +265,29 @@ const HostDetailsComponent = pure( > {({ events, - loading, id, inspect, + loading, + loadPage, + pageInfo, refetch, totalCount, - pageInfo, - loadMore, }) => ( )} diff --git a/x-pack/legacy/plugins/siem/public/pages/hosts/hosts.tsx b/x-pack/legacy/plugins/siem/public/pages/hosts/hosts.tsx index cee1b4bcaa7c2..5511f4cde2195 100644 --- a/x-pack/legacy/plugins/siem/public/pages/hosts/hosts.tsx +++ b/x-pack/legacy/plugins/siem/public/pages/hosts/hosts.tsx @@ -114,23 +114,23 @@ const HostsComponent = pure(({ filterQuery, setAbsoluteRang totalCount, loading, pageInfo, - loadMore, + loadPage, id, inspect, refetch, }) => ( )} @@ -187,22 +187,22 @@ const HostsComponent = pure(({ filterQuery, setAbsoluteRang totalCount, loading, pageInfo, - loadMore, + loadPage, id, inspect, refetch, }) => ( )} @@ -243,20 +243,19 @@ const HostsComponent = pure(({ filterQuery, setAbsoluteRang refetch, totalCount, pageInfo, - loadMore, + loadPage, }) => ( )} diff --git a/x-pack/legacy/plugins/siem/public/pages/network/ip_details.tsx b/x-pack/legacy/plugins/siem/public/pages/network/ip_details.tsx index 19e380be49d54..f290966e4318a 100644 --- a/x-pack/legacy/plugins/siem/public/pages/network/ip_details.tsx +++ b/x-pack/legacy/plugins/siem/public/pages/network/ip_details.tsx @@ -155,7 +155,7 @@ export const IPDetailsComponent = pure( totalCount, pageInfo, loading, - loadMore, + loadPage, refetch, }) => ( ( id={id} inspect={inspect} flowTarget={flowTarget} - hasNextPage={getOr(false, 'hasNextPage', pageInfo)!} + fakeTotalCount={getOr(50, 'fakeTotalCount', pageInfo)} ip={ip} loading={loading} - loadMore={loadMore} - nextCursor={getOr(null, 'endCursor.value', pageInfo)} + loadPage={loadPage} + showMorePagesIndicator={getOr( + false, + 'showMorePagesIndicator', + pageInfo + )} refetch={refetch} setQuery={setQuery} totalCount={totalCount} @@ -196,7 +200,7 @@ export const IPDetailsComponent = pure( totalCount, pageInfo, loading, - loadMore, + loadPage, refetch, }) => ( ( id={id} inspect={inspect} flowTarget={flowTarget} - hasNextPage={getOr(false, 'hasNextPage', pageInfo)!} + fakeTotalCount={getOr(50, 'fakeTotalCount', pageInfo)} loading={loading} - loadMore={loadMore} - nextCursor={getOr(null, 'endCursor.value', pageInfo)!} + loadPage={loadPage} + showMorePagesIndicator={getOr( + false, + 'showMorePagesIndicator', + pageInfo + )} refetch={refetch} setQuery={setQuery} totalCount={totalCount} @@ -235,17 +243,21 @@ export const IPDetailsComponent = pure( totalCount, pageInfo, loading, - loadMore, + loadPage, refetch, }) => ( ( loading, networkTopNFlow, pageInfo, - loadMore, + loadPage, id, inspect, refetch, }) => ( @@ -141,21 +145,25 @@ const NetworkComponent = pure( loading, networkDns, pageInfo, - loadMore, + loadPage, id, inspect, refetch, }) => ( diff --git a/x-pack/legacy/plugins/siem/public/store/hosts/actions.ts b/x-pack/legacy/plugins/siem/public/store/hosts/actions.ts index 2d1d5bd35e1b7..39240a15ba230 100644 --- a/x-pack/legacy/plugins/siem/public/store/hosts/actions.ts +++ b/x-pack/legacy/plugins/siem/public/store/hosts/actions.ts @@ -24,27 +24,11 @@ export const updateTableLimit = actionCreator<{ tableType: HostsTableType; }>('UPDATE_HOST_TABLE_LIMIT'); -export const updateAuthenticationsLimit = actionCreator<{ limit: number; hostsType: HostsType }>( - 'UPDATE_AUTHENTICATIONS_LIMIT' -); - -export const updateHostsLimit = actionCreator<{ limit: number; hostsType: HostsType }>( - 'UPDATE_HOSTS_LIMIT' -); - export const updateHostsSort = actionCreator<{ sort: HostsSortField; hostsType: HostsType; }>('UPDATE_HOSTS_SORT'); -export const updateEventsLimit = actionCreator<{ limit: number; hostsType: HostsType }>( - 'UPDATE_EVENTS_LIMIT' -); - -export const updateUncommonProcessesLimit = actionCreator<{ limit: number; hostsType: HostsType }>( - 'UPDATE_UNCOMMONPROCESSES_LIMIT' -); - export const setHostsFilterQueryDraft = actionCreator<{ filterQueryDraft: KueryFilterQuery; hostsType: HostsType; diff --git a/x-pack/legacy/plugins/siem/public/store/hosts/model.ts b/x-pack/legacy/plugins/siem/public/store/hosts/model.ts index e9a587727d207..0acacb506d49c 100644 --- a/x-pack/legacy/plugins/siem/public/store/hosts/model.ts +++ b/x-pack/legacy/plugins/siem/public/store/hosts/model.ts @@ -19,16 +19,12 @@ export enum HostsTableType { uncommonProcesses = 'uncommonProcesses', } -export interface BasicQuery { - limit: number; -} - export interface BasicQueryPaginated { activePage: number; limit: number; } -export interface HostsQuery extends BasicQuery { +export interface HostsQuery extends BasicQueryPaginated { direction: Direction; sortField: HostsFields; } @@ -36,8 +32,8 @@ export interface HostsQuery extends BasicQuery { interface Queries { authentications: BasicQueryPaginated; hosts: HostsQuery; - events: BasicQuery; - uncommonProcesses: BasicQuery; + events: BasicQueryPaginated; + uncommonProcesses: BasicQueryPaginated; } export interface GenericHostsModel { diff --git a/x-pack/legacy/plugins/siem/public/store/hosts/reducer.ts b/x-pack/legacy/plugins/siem/public/store/hosts/reducer.ts index 99df07758a4a1..7c40bac28da0b 100644 --- a/x-pack/legacy/plugins/siem/public/store/hosts/reducer.ts +++ b/x-pack/legacy/plugins/siem/public/store/hosts/reducer.ts @@ -12,43 +12,59 @@ import { DEFAULT_TABLE_ACTIVE_PAGE, DEFAULT_TABLE_LIMIT } from '../constants'; import { applyHostsFilterQuery, setHostsFilterQueryDraft, - updateAuthenticationsLimit, - updateEventsLimit, - updateHostsLimit, updateHostsSort, - updateUncommonProcessesLimit, updateTableActivePage, updateTableLimit, } from './actions'; -import { HostsModel } from './model'; +import { HostsModel, HostsTableType } from './model'; export type HostsState = HostsModel; export const initialHostsState: HostsState = { page: { queries: { - authentications: { limit: DEFAULT_TABLE_LIMIT, activePage: DEFAULT_TABLE_ACTIVE_PAGE }, - hosts: { + [HostsTableType.authentications]: { + activePage: DEFAULT_TABLE_ACTIVE_PAGE, limit: DEFAULT_TABLE_LIMIT, + }, + [HostsTableType.hosts]: { + activePage: DEFAULT_TABLE_ACTIVE_PAGE, direction: Direction.desc, + limit: DEFAULT_TABLE_LIMIT, sortField: HostsFields.lastSeen, }, - events: { limit: DEFAULT_TABLE_LIMIT }, - uncommonProcesses: { limit: DEFAULT_TABLE_LIMIT }, + [HostsTableType.events]: { + activePage: DEFAULT_TABLE_ACTIVE_PAGE, + limit: DEFAULT_TABLE_LIMIT, + }, + [HostsTableType.uncommonProcesses]: { + activePage: DEFAULT_TABLE_ACTIVE_PAGE, + limit: DEFAULT_TABLE_LIMIT, + }, }, filterQuery: null, filterQueryDraft: null, }, details: { queries: { - authentications: { limit: DEFAULT_TABLE_LIMIT, activePage: DEFAULT_TABLE_ACTIVE_PAGE }, - hosts: { + [HostsTableType.authentications]: { + activePage: DEFAULT_TABLE_ACTIVE_PAGE, limit: DEFAULT_TABLE_LIMIT, + }, + [HostsTableType.hosts]: { + activePage: DEFAULT_TABLE_ACTIVE_PAGE, direction: Direction.desc, + limit: DEFAULT_TABLE_LIMIT, sortField: HostsFields.lastSeen, }, - events: { limit: DEFAULT_TABLE_LIMIT }, - uncommonProcesses: { limit: DEFAULT_TABLE_LIMIT }, + [HostsTableType.events]: { + activePage: DEFAULT_TABLE_ACTIVE_PAGE, + limit: DEFAULT_TABLE_LIMIT, + }, + [HostsTableType.uncommonProcesses]: { + activePage: DEFAULT_TABLE_ACTIVE_PAGE, + limit: DEFAULT_TABLE_LIMIT, + }, }, filterQuery: null, filterQueryDraft: null, @@ -82,31 +98,6 @@ export const hostsReducer = reducerWithInitialState(initialHostsState) }, }, })) - .case(updateAuthenticationsLimit, (state, { limit, hostsType }) => ({ - ...state, - [hostsType]: { - ...state[hostsType], - queries: { - ...state[hostsType].queries, - authentications: { - limit, - }, - }, - }, - })) - .case(updateHostsLimit, (state, { limit, hostsType }) => ({ - ...state, - [hostsType]: { - ...state[hostsType], - queries: { - ...state[hostsType].queries, - hosts: { - ...state[hostsType].queries.hosts, - limit, - }, - }, - }, - })) .case(updateHostsSort, (state, { sort, hostsType }) => ({ ...state, [hostsType]: { @@ -121,30 +112,6 @@ export const hostsReducer = reducerWithInitialState(initialHostsState) }, }, })) - .case(updateEventsLimit, (state, { limit, hostsType }) => ({ - ...state, - [hostsType]: { - ...state[hostsType], - queries: { - ...state[hostsType].queries, - events: { - limit, - }, - }, - }, - })) - .case(updateUncommonProcessesLimit, (state, { limit, hostsType }) => ({ - ...state, - [hostsType]: { - ...state[hostsType], - queries: { - ...state[hostsType].queries, - uncommonProcesses: { - limit, - }, - }, - }, - })) .case(setHostsFilterQueryDraft, (state, { filterQueryDraft, hostsType }) => ({ ...state, [hostsType]: { diff --git a/x-pack/legacy/plugins/siem/public/store/network/actions.ts b/x-pack/legacy/plugins/siem/public/store/network/actions.ts index bb91db7717073..074aaefc8b4fc 100644 --- a/x-pack/legacy/plugins/siem/public/store/network/actions.ts +++ b/x-pack/legacy/plugins/siem/public/store/network/actions.ts @@ -17,10 +17,20 @@ import { } from '../../graphql/types'; import { KueryFilterQuery, SerializedFilterQuery } from '../model'; -import { NetworkType } from './model'; +import { IpDetailsTableType, NetworkTableType, NetworkType } from './model'; const actionCreator = actionCreatorFactory('x-pack/siem/local/network'); +export const updateNetworkPageTableActivePage = actionCreator<{ + activePage: number; + tableType: NetworkTableType; +}>('UPDATE_NETWORK_PAGE_TABLE_ACTIVE_PAGE'); + +export const updateIpDetailsTableActivePage = actionCreator<{ + activePage: number; + tableType: IpDetailsTableType; +}>('UPDATE_NETWORK_DETAILS_TABLE_ACTIVE_PAGE'); + export const updateDnsLimit = actionCreator<{ limit: number; networkType: NetworkType; diff --git a/x-pack/legacy/plugins/siem/public/store/network/model.ts b/x-pack/legacy/plugins/siem/public/store/network/model.ts index dc49d2cbdd753..c0dbc964f479e 100644 --- a/x-pack/legacy/plugins/siem/public/store/network/model.ts +++ b/x-pack/legacy/plugins/siem/public/store/network/model.ts @@ -20,25 +20,37 @@ export enum NetworkType { details = 'details', } -export interface BasicQuery { +export enum NetworkTableType { + dns = 'dns', + topNFlow = 'topNFlow', +} + +export enum IpDetailsTableType { + domains = 'domains', + tls = 'tls', + users = 'users', +} + +export interface BasicQueryPaginated { + activePage: number; limit: number; } // Network Page Models -export interface TopNFlowQuery extends BasicQuery { +export interface TopNFlowQuery extends BasicQueryPaginated { flowTarget: FlowTarget; topNFlowSort: NetworkTopNFlowSortField; flowDirection: FlowDirection; } -export interface DnsQuery extends BasicQuery { +export interface DnsQuery extends BasicQueryPaginated { dnsSortField: NetworkDnsSortField; isPtrIncluded: boolean; } interface NetworkQueries { - topNFlow: TopNFlowQuery; - dns: DnsQuery; + [NetworkTableType.dns]: DnsQuery; + [NetworkTableType.topNFlow]: TopNFlowQuery; } export interface NetworkPageModel { @@ -48,23 +60,23 @@ export interface NetworkPageModel { } // IP Details Models -export interface DomainsQuery extends BasicQuery { +export interface DomainsQuery extends BasicQueryPaginated { flowDirection: FlowDirection; domainsSortField: DomainsSortField; } -export interface TlsQuery extends BasicQuery { +export interface TlsQuery extends BasicQueryPaginated { tlsSortField: TlsSortField; } -export interface UsersQuery extends BasicQuery { +export interface UsersQuery extends BasicQueryPaginated { usersSortField: UsersSortField; } interface IpOverviewQueries { - domains: DomainsQuery; - tls: TlsQuery; - users: UsersQuery; + [IpDetailsTableType.domains]: DomainsQuery; + [IpDetailsTableType.tls]: TlsQuery; + [IpDetailsTableType.users]: UsersQuery; } export interface NetworkDetailsModel { diff --git a/x-pack/legacy/plugins/siem/public/store/network/reducer.ts b/x-pack/legacy/plugins/siem/public/store/network/reducer.ts index 9bc4040eb277c..6482182c65727 100644 --- a/x-pack/legacy/plugins/siem/public/store/network/reducer.ts +++ b/x-pack/legacy/plugins/siem/public/store/network/reducer.ts @@ -16,7 +16,7 @@ import { TlsFields, UsersFields, } from '../../graphql/types'; -import { DEFAULT_TABLE_LIMIT } from '../constants'; +import { DEFAULT_TABLE_ACTIVE_PAGE, DEFAULT_TABLE_LIMIT } from '../constants'; import { applyNetworkFilterQuery, @@ -29,6 +29,8 @@ import { updateDomainsSort, updateIpDetailsFlowTarget, updateIsPtrIncluded, + updateIpDetailsTableActivePage, + updateNetworkPageTableActivePage, updateTopNFlowDirection, updateTopNFlowLimit, updateTopNFlowSort, @@ -38,14 +40,15 @@ import { updateUsersSort, } from './actions'; import { helperUpdateTopNFlowDirection } from './helper'; -import { NetworkModel, NetworkType } from './model'; +import { IpDetailsTableType, NetworkModel, NetworkTableType, NetworkType } from './model'; export type NetworkState = NetworkModel; export const initialNetworkState: NetworkState = { page: { queries: { - topNFlow: { + [NetworkTableType.topNFlow]: { + activePage: DEFAULT_TABLE_ACTIVE_PAGE, limit: DEFAULT_TABLE_LIMIT, topNFlowSort: { field: NetworkTopNFlowFields.bytes, @@ -54,7 +57,8 @@ export const initialNetworkState: NetworkState = { flowTarget: FlowTarget.source, flowDirection: FlowDirection.uniDirectional, }, - dns: { + [NetworkTableType.dns]: { + activePage: DEFAULT_TABLE_ACTIVE_PAGE, limit: DEFAULT_TABLE_LIMIT, dnsSortField: { field: NetworkDnsFields.uniqueDomains, @@ -68,7 +72,8 @@ export const initialNetworkState: NetworkState = { }, details: { queries: { - domains: { + [IpDetailsTableType.domains]: { + activePage: DEFAULT_TABLE_ACTIVE_PAGE, flowDirection: FlowDirection.uniDirectional, limit: DEFAULT_TABLE_LIMIT, domainsSortField: { @@ -76,14 +81,16 @@ export const initialNetworkState: NetworkState = { direction: Direction.desc, }, }, - tls: { + [IpDetailsTableType.tls]: { + activePage: DEFAULT_TABLE_ACTIVE_PAGE, limit: DEFAULT_TABLE_LIMIT, tlsSortField: { field: TlsFields._id, direction: Direction.desc, }, }, - users: { + [IpDetailsTableType.users]: { + activePage: DEFAULT_TABLE_ACTIVE_PAGE, limit: DEFAULT_TABLE_LIMIT, usersSortField: { field: UsersFields.name, @@ -98,13 +105,39 @@ export const initialNetworkState: NetworkState = { }; export const networkReducer = reducerWithInitialState(initialNetworkState) + .case(updateIpDetailsTableActivePage, (state, { activePage, tableType }) => ({ + ...state, + [NetworkType.details]: { + ...state[NetworkType.details], + queries: { + ...state[NetworkType.details].queries, + [tableType]: { + ...state[NetworkType.details].queries[tableType], + activePage, + }, + }, + }, + })) + .case(updateNetworkPageTableActivePage, (state, { activePage, tableType }) => ({ + ...state, + [NetworkType.page]: { + ...state[NetworkType.page], + queries: { + ...state[NetworkType.page].queries, + [tableType]: { + ...state[NetworkType.page].queries[tableType], + activePage, + }, + }, + }, + })) .case(updateDnsLimit, (state, { limit, networkType }) => ({ ...state, [networkType]: { ...state[networkType], queries: { ...state[networkType].queries, - dns: { + [NetworkTableType.dns]: { ...state[NetworkType.page].queries.dns, limit, }, @@ -117,7 +150,7 @@ export const networkReducer = reducerWithInitialState(initialNetworkState) ...state[networkType], queries: { ...state[networkType].queries, - dns: { + [NetworkTableType.dns]: { ...state[NetworkType.page].queries.dns, dnsSortField, }, @@ -130,7 +163,7 @@ export const networkReducer = reducerWithInitialState(initialNetworkState) ...state[networkType], queries: { ...state[networkType].queries, - dns: { + [NetworkTableType.dns]: { ...state[NetworkType.page].queries.dns, isPtrIncluded, }, @@ -143,7 +176,7 @@ export const networkReducer = reducerWithInitialState(initialNetworkState) ...state[networkType], queries: { ...state[networkType].queries, - topNFlow: { + [NetworkTableType.topNFlow]: { ...state[NetworkType.page].queries.topNFlow, limit, }, @@ -156,7 +189,7 @@ export const networkReducer = reducerWithInitialState(initialNetworkState) ...state[networkType], queries: { ...state[networkType].queries, - topNFlow: { + [NetworkTableType.topNFlow]: { ...state[NetworkType.page].queries.topNFlow, ...helperUpdateTopNFlowDirection( state[NetworkType.page].queries.topNFlow.flowTarget, @@ -172,7 +205,7 @@ export const networkReducer = reducerWithInitialState(initialNetworkState) ...state[networkType], queries: { ...state[networkType].queries, - topNFlow: { + [NetworkTableType.topNFlow]: { ...state[NetworkType.page].queries.topNFlow, topNFlowSort, }, @@ -185,7 +218,7 @@ export const networkReducer = reducerWithInitialState(initialNetworkState) ...state[NetworkType.page], queries: { ...state[NetworkType.page].queries, - topNFlow: { + [NetworkTableType.topNFlow]: { ...state[NetworkType.page].queries.topNFlow, flowTarget, topNFlowSort: { @@ -224,7 +257,7 @@ export const networkReducer = reducerWithInitialState(initialNetworkState) ...state[NetworkType.details], queries: { ...state[NetworkType.details].queries, - domains: { + [IpDetailsTableType.domains]: { ...state[NetworkType.details].queries.domains, limit, }, @@ -237,7 +270,7 @@ export const networkReducer = reducerWithInitialState(initialNetworkState) ...state[NetworkType.details], queries: { ...state[NetworkType.details].queries, - tls: { + [IpDetailsTableType.tls]: { ...state[NetworkType.details].queries.tls, limit, }, @@ -250,7 +283,7 @@ export const networkReducer = reducerWithInitialState(initialNetworkState) ...state[NetworkType.details], queries: { ...state[NetworkType.details].queries, - domains: { + [IpDetailsTableType.domains]: { ...state[NetworkType.details].queries.domains, flowDirection, }, @@ -263,7 +296,7 @@ export const networkReducer = reducerWithInitialState(initialNetworkState) ...state[NetworkType.details], queries: { ...state[NetworkType.details].queries, - domains: { + [IpDetailsTableType.domains]: { ...state[NetworkType.details].queries.domains, domainsSortField, }, @@ -276,7 +309,7 @@ export const networkReducer = reducerWithInitialState(initialNetworkState) ...state[NetworkType.details], queries: { ...state[NetworkType.details].queries, - tls: { + [IpDetailsTableType.tls]: { ...state[NetworkType.details].queries.tls, tlsSortField, }, @@ -289,7 +322,7 @@ export const networkReducer = reducerWithInitialState(initialNetworkState) ...state[NetworkType.details], queries: { ...state[NetworkType.details].queries, - users: { + [IpDetailsTableType.users]: { ...state[NetworkType.details].queries.users, limit, }, @@ -302,7 +335,7 @@ export const networkReducer = reducerWithInitialState(initialNetworkState) ...state[NetworkType.details], queries: { ...state[NetworkType.details].queries, - users: { + [IpDetailsTableType.users]: { ...state[NetworkType.details].queries.users, usersSortField, }, diff --git a/x-pack/legacy/plugins/siem/server/graphql/events/resolvers.ts b/x-pack/legacy/plugins/siem/server/graphql/events/resolvers.ts index 720bc9530be27..f2ee5e3028549 100644 --- a/x-pack/legacy/plugins/siem/server/graphql/events/resolvers.ts +++ b/x-pack/legacy/plugins/siem/server/graphql/events/resolvers.ts @@ -8,7 +8,7 @@ import { GraphQLScalarType, Kind } from 'graphql'; import { Events } from '../../lib/events'; import { AppResolverOf, ChildResolverOf } from '../../lib/framework'; -import { createOptions } from '../../utils/build_query/create_options'; +import { createOptions, createOptionsPaginated } from '../../utils/build_query/create_options'; import { QuerySourceResolver } from '../sources/resolvers'; import { SourceResolvers } from '../types'; import { LastEventTimeRequestOptions } from '../../lib/events/types'; @@ -49,7 +49,7 @@ export const createEventsResolvers = ( } => ({ Source: { async Events(source, args, { req }, info) { - const options = createOptions(source, args, info); + const options = createOptionsPaginated(source, args, info); return libs.events.getEvents(req, options); }, async Timeline(source, args, { req }, info) { diff --git a/x-pack/legacy/plugins/siem/server/graphql/events/schema.gql.ts b/x-pack/legacy/plugins/siem/server/graphql/events/schema.gql.ts index cddd8a11f55fb..ab04fcc2192f4 100644 --- a/x-pack/legacy/plugins/siem/server/graphql/events/schema.gql.ts +++ b/x-pack/legacy/plugins/siem/server/graphql/events/schema.gql.ts @@ -10,6 +10,13 @@ export const eventsSchema = gql` scalar EsValue type EventsData { + edges: [EcsEdges!]! + totalCount: Float! + pageInfo: PageInfoPaginated! + inspect: Inspect + } + + type EventsTimelineData { edges: [EcsEdges!]! totalCount: Float! pageInfo: PageInfo! @@ -71,7 +78,7 @@ export const eventsSchema = gql` extend type Source { "Gets events based on timerange and specified criteria, or all events in the timerange if no criteria is specified" Events( - pagination: PaginationInput! + pagination: PaginationInputPaginated! sortField: SortField! timerange: TimerangeInput filterQuery: String diff --git a/x-pack/legacy/plugins/siem/server/graphql/hosts/resolvers.ts b/x-pack/legacy/plugins/siem/server/graphql/hosts/resolvers.ts index 22a744a3cf5b8..65403c4b31261 100644 --- a/x-pack/legacy/plugins/siem/server/graphql/hosts/resolvers.ts +++ b/x-pack/legacy/plugins/siem/server/graphql/hosts/resolvers.ts @@ -15,7 +15,7 @@ import { HostLastFirstSeenRequestOptions, } from '../../lib/hosts'; import { getFields } from '../../utils/build_query'; -import { createOptions } from '../../utils/build_query/create_options'; +import { createOptionsPaginated } from '../../utils/build_query/create_options'; import { QuerySourceResolver } from '../sources/resolvers'; type QueryHostsResolver = ChildResolverOf< @@ -49,7 +49,7 @@ export const createHostsResolvers = ( Source: { async Hosts(source, args, { req }, info) { const options: HostsRequestOptions = { - ...createOptions(source, args, info), + ...createOptionsPaginated(source, args, info), sort: args.sort, defaultIndex: args.defaultIndex, }; diff --git a/x-pack/legacy/plugins/siem/server/graphql/hosts/schema.gql.ts b/x-pack/legacy/plugins/siem/server/graphql/hosts/schema.gql.ts index db9ce410f23a0..d813a08cad6db 100644 --- a/x-pack/legacy/plugins/siem/server/graphql/hosts/schema.gql.ts +++ b/x-pack/legacy/plugins/siem/server/graphql/hosts/schema.gql.ts @@ -57,7 +57,7 @@ export const hostsSchema = gql` type HostsData { edges: [HostsEdges!]! totalCount: Float! - pageInfo: PageInfo! + pageInfo: PageInfoPaginated! inspect: Inspect } @@ -82,7 +82,7 @@ export const hostsSchema = gql` Hosts( id: String timerange: TimerangeInput! - pagination: PaginationInput! + pagination: PaginationInputPaginated! sort: HostsSortField! filterQuery: String defaultIndex: [String!]! diff --git a/x-pack/legacy/plugins/siem/server/graphql/ip_details/resolvers.ts b/x-pack/legacy/plugins/siem/server/graphql/ip_details/resolvers.ts index 3e962f887b962..102cc4d0ae08c 100644 --- a/x-pack/legacy/plugins/siem/server/graphql/ip_details/resolvers.ts +++ b/x-pack/legacy/plugins/siem/server/graphql/ip_details/resolvers.ts @@ -12,7 +12,7 @@ import { TlsRequestOptions, UsersRequestOptions, } from '../../lib/ip_details'; -import { createOptions } from '../../utils/build_query/create_options'; +import { createOptions, createOptionsPaginated } from '../../utils/build_query/create_options'; import { QuerySourceResolver } from '../sources/resolvers'; export type QueryIpOverviewResolver = ChildResolverOf< @@ -56,7 +56,7 @@ export const createIpDetailsResolvers = ( }, async Domains(source, args, { req }, info) { const options: DomainsRequestOptions = { - ...createOptions(source, args, info), + ...createOptionsPaginated(source, args, info), ip: args.ip, domainsSortField: args.sort, flowTarget: args.flowTarget, @@ -66,7 +66,7 @@ export const createIpDetailsResolvers = ( }, async Tls(source, args, { req }, info) { const options: TlsRequestOptions = { - ...createOptions(source, args, info), + ...createOptionsPaginated(source, args, info), ip: args.ip, tlsSortField: args.sort, flowTarget: args.flowTarget, @@ -75,7 +75,7 @@ export const createIpDetailsResolvers = ( }, async Users(source, args, { req }, info) { const options: UsersRequestOptions = { - ...createOptions(source, args, info), + ...createOptionsPaginated(source, args, info), ip: args.ip, usersSortField: args.sort, flowTarget: args.flowTarget, diff --git a/x-pack/legacy/plugins/siem/server/graphql/ip_details/schema.gql.ts b/x-pack/legacy/plugins/siem/server/graphql/ip_details/schema.gql.ts index ee382eba345ec..21cd330c6f4b7 100644 --- a/x-pack/legacy/plugins/siem/server/graphql/ip_details/schema.gql.ts +++ b/x-pack/legacy/plugins/siem/server/graphql/ip_details/schema.gql.ts @@ -85,7 +85,7 @@ const domainsSchema = gql` type DomainsData { edges: [DomainsEdges!]! totalCount: Float! - pageInfo: PageInfo! + pageInfo: PageInfoPaginated! inspect: Inspect } @@ -94,7 +94,7 @@ const domainsSchema = gql` filterQuery: String id: String ip: String! - pagination: PaginationInput! + pagination: PaginationInputPaginated! sort: DomainsSortField! flowDirection: FlowDirection! flowTarget: FlowTarget! @@ -128,7 +128,7 @@ const tlsSchema = gql` type TlsData { edges: [TlsEdges!]! totalCount: Float! - pageInfo: PageInfo! + pageInfo: PageInfoPaginated! inspect: Inspect } extend type Source { @@ -136,7 +136,7 @@ const tlsSchema = gql` filterQuery: String id: String ip: String! - pagination: PaginationInput! + pagination: PaginationInputPaginated! sort: TlsSortField! flowTarget: FlowTarget! timerange: TimerangeInput! @@ -178,7 +178,7 @@ const usersSchema = gql` type UsersData { edges: [UsersEdges!]! totalCount: Float! - pageInfo: PageInfo! + pageInfo: PageInfoPaginated! inspect: Inspect } @@ -187,7 +187,7 @@ const usersSchema = gql` filterQuery: String id: String ip: String! - pagination: PaginationInput! + pagination: PaginationInputPaginated! sort: UsersSortField! flowTarget: FlowTarget! timerange: TimerangeInput! diff --git a/x-pack/legacy/plugins/siem/server/graphql/network/resolvers.ts b/x-pack/legacy/plugins/siem/server/graphql/network/resolvers.ts index eb3b7473fbde3..6d29283b5fe1f 100644 --- a/x-pack/legacy/plugins/siem/server/graphql/network/resolvers.ts +++ b/x-pack/legacy/plugins/siem/server/graphql/network/resolvers.ts @@ -7,7 +7,7 @@ import { SourceResolvers } from '../../graphql/types'; import { AppResolverOf, ChildResolverOf } from '../../lib/framework'; import { Network } from '../../lib/network'; -import { createOptions } from '../../utils/build_query/create_options'; +import { createOptionsPaginated } from '../../utils/build_query/create_options'; import { QuerySourceResolver } from '../sources/resolvers'; type QueryNetworkTopNFlowResolver = ChildResolverOf< @@ -35,7 +35,7 @@ export const createNetworkResolvers = ( Source: { async NetworkTopNFlow(source, args, { req }, info) { const options = { - ...createOptions(source, args, info), + ...createOptionsPaginated(source, args, info), flowTarget: args.flowTarget, networkTopNFlowSort: args.sort, flowDirection: args.flowDirection, @@ -44,7 +44,7 @@ export const createNetworkResolvers = ( }, async NetworkDns(source, args, { req }, info) { const options = { - ...createOptions(source, args, info), + ...createOptionsPaginated(source, args, info), networkDnsSortField: args.sort, isPtrIncluded: args.isPtrIncluded, }; diff --git a/x-pack/legacy/plugins/siem/server/graphql/network/schema.gql.ts b/x-pack/legacy/plugins/siem/server/graphql/network/schema.gql.ts index 70f7380c97f91..3d5f74e9ca46b 100644 --- a/x-pack/legacy/plugins/siem/server/graphql/network/schema.gql.ts +++ b/x-pack/legacy/plugins/siem/server/graphql/network/schema.gql.ts @@ -59,7 +59,7 @@ export const networkSchema = gql` type NetworkTopNFlowData { edges: [NetworkTopNFlowEdges!]! totalCount: Float! - pageInfo: PageInfo! + pageInfo: PageInfoPaginated! inspect: Inspect } @@ -93,7 +93,7 @@ export const networkSchema = gql` type NetworkDnsData { edges: [NetworkDnsEdges!]! totalCount: Float! - pageInfo: PageInfo! + pageInfo: PageInfoPaginated! inspect: Inspect } @@ -104,7 +104,7 @@ export const networkSchema = gql` filterQuery: String flowDirection: FlowDirection! flowTarget: FlowTarget! - pagination: PaginationInput! + pagination: PaginationInputPaginated! sort: NetworkTopNFlowSortField! timerange: TimerangeInput! defaultIndex: [String!]! @@ -113,7 +113,7 @@ export const networkSchema = gql` filterQuery: String id: String isPtrIncluded: Boolean! - pagination: PaginationInput! + pagination: PaginationInputPaginated! sort: NetworkDnsSortField! timerange: TimerangeInput! defaultIndex: [String!]! diff --git a/x-pack/legacy/plugins/siem/server/graphql/types.ts b/x-pack/legacy/plugins/siem/server/graphql/types.ts index 27116af2d20a4..b0c43011b2b21 100644 --- a/x-pack/legacy/plugins/siem/server/graphql/types.ts +++ b/x-pack/legacy/plugins/siem/server/graphql/types.ts @@ -371,7 +371,7 @@ export interface EventsData { totalCount: number; - pageInfo: PageInfo; + pageInfo: PageInfoPaginated; inspect?: Inspect | null; } @@ -834,12 +834,6 @@ export interface SshEcsFields { signature?: ToStringArray | null; } -export interface PageInfo { - endCursor?: CursorType | null; - - hasNextPage?: boolean | null; -} - export interface TimelineData { edges: TimelineEdges[]; @@ -872,6 +866,12 @@ export interface TimelineNonEcsData { value?: ToStringArray | null; } +export interface PageInfo { + endCursor?: CursorType | null; + + hasNextPage?: boolean | null; +} + export interface TimelineDetailsData { data?: DetailItem[] | null; @@ -897,7 +897,7 @@ export interface HostsData { totalCount: number; - pageInfo: PageInfo; + pageInfo: PageInfoPaginated; inspect?: Inspect | null; } @@ -983,7 +983,7 @@ export interface DomainsData { totalCount: number; - pageInfo: PageInfo; + pageInfo: PageInfoPaginated; inspect?: Inspect | null; } @@ -1035,7 +1035,7 @@ export interface TlsData { totalCount: number; - pageInfo: PageInfo; + pageInfo: PageInfoPaginated; inspect?: Inspect | null; } @@ -1067,7 +1067,7 @@ export interface UsersData { totalCount: number; - pageInfo: PageInfo; + pageInfo: PageInfoPaginated; inspect?: Inspect | null; } @@ -1179,7 +1179,7 @@ export interface NetworkTopNFlowData { totalCount: number; - pageInfo: PageInfo; + pageInfo: PageInfoPaginated; inspect?: Inspect | null; } @@ -1227,7 +1227,7 @@ export interface NetworkDnsData { totalCount: number; - pageInfo: PageInfo; + pageInfo: PageInfoPaginated; inspect?: Inspect | null; } @@ -1299,7 +1299,7 @@ export interface UncommonProcessesData { totalCount: number; - pageInfo: PageInfo; + pageInfo: PageInfoPaginated; inspect?: Inspect | null; } @@ -1512,6 +1512,16 @@ export interface ResponseFavoriteTimeline { favorite?: FavoriteTimelineResult[] | null; } +export interface EventsTimelineData { + edges: EcsEdges[]; + + totalCount: number; + + pageInfo: PageInfo; + + inspect?: Inspect | null; +} + export interface OsFields { platform?: string | null; @@ -1578,6 +1588,12 @@ export interface PaginationInputPaginated { querySize: number; } +export interface SortField { + sortFieldId: string; + + direction: Direction; +} + export interface PaginationInput { /** The limit parameter allows you to configure the maximum amount of items to be returned */ limit: number; @@ -1587,12 +1603,6 @@ export interface PaginationInput { tiebreaker?: string | null; } -export interface SortField { - sortFieldId: string; - - direction: Direction; -} - export interface LastTimeDetails { hostName?: string | null; @@ -1810,7 +1820,7 @@ export interface AuthenticationsSourceArgs { defaultIndex: string[]; } export interface EventsSourceArgs { - pagination: PaginationInput; + pagination: PaginationInputPaginated; sortField: SortField; @@ -1854,7 +1864,7 @@ export interface HostsSourceArgs { timerange: TimerangeInput; - pagination: PaginationInput; + pagination: PaginationInputPaginated; sort: HostsSortField; @@ -1894,7 +1904,7 @@ export interface DomainsSourceArgs { ip: string; - pagination: PaginationInput; + pagination: PaginationInputPaginated; sort: DomainsSortField; @@ -1913,7 +1923,7 @@ export interface TlsSourceArgs { ip: string; - pagination: PaginationInput; + pagination: PaginationInputPaginated; sort: TlsSortField; @@ -1930,7 +1940,7 @@ export interface UsersSourceArgs { ip: string; - pagination: PaginationInput; + pagination: PaginationInputPaginated; sort: UsersSortField; @@ -1976,7 +1986,7 @@ export interface NetworkTopNFlowSourceArgs { flowTarget: FlowTarget; - pagination: PaginationInput; + pagination: PaginationInputPaginated; sort: NetworkTopNFlowSortField; @@ -1991,7 +2001,7 @@ export interface NetworkDnsSourceArgs { isPtrIncluded: boolean; - pagination: PaginationInput; + pagination: PaginationInputPaginated; sort: NetworkDnsSortField; @@ -2020,7 +2030,7 @@ export interface OverviewHostSourceArgs { export interface UncommonProcessesSourceArgs { timerange: TimerangeInput; - pagination: PaginationInput; + pagination: PaginationInputPaginated; filterQuery?: string | null; @@ -2550,7 +2560,7 @@ export namespace SourceResolvers { EventsArgs >; export interface EventsArgs { - pagination: PaginationInput; + pagination: PaginationInputPaginated; sortField: SortField; @@ -2620,7 +2630,7 @@ export namespace SourceResolvers { timerange: TimerangeInput; - pagination: PaginationInput; + pagination: PaginationInputPaginated; sort: HostsSortField; @@ -2686,7 +2696,7 @@ export namespace SourceResolvers { ip: string; - pagination: PaginationInput; + pagination: PaginationInputPaginated; sort: DomainsSortField; @@ -2712,7 +2722,7 @@ export namespace SourceResolvers { ip: string; - pagination: PaginationInput; + pagination: PaginationInputPaginated; sort: TlsSortField; @@ -2736,7 +2746,7 @@ export namespace SourceResolvers { ip: string; - pagination: PaginationInput; + pagination: PaginationInputPaginated; sort: UsersSortField; @@ -2807,7 +2817,7 @@ export namespace SourceResolvers { flowTarget: FlowTarget; - pagination: PaginationInput; + pagination: PaginationInputPaginated; sort: NetworkTopNFlowSortField; @@ -2828,7 +2838,7 @@ export namespace SourceResolvers { isPtrIncluded: boolean; - pagination: PaginationInput; + pagination: PaginationInputPaginated; sort: NetworkDnsSortField; @@ -2875,7 +2885,7 @@ export namespace SourceResolvers { export interface UncommonProcessesArgs { timerange: TimerangeInput; - pagination: PaginationInput; + pagination: PaginationInputPaginated; filterQuery?: string | null; @@ -3502,7 +3512,7 @@ export namespace EventsDataResolvers { totalCount?: TotalCountResolver; - pageInfo?: PageInfoResolver; + pageInfo?: PageInfoResolver; inspect?: InspectResolver; } @@ -3517,11 +3527,11 @@ export namespace EventsDataResolvers { Parent, Context >; - export type PageInfoResolver = Resolver< - R, - Parent, - Context - >; + export type PageInfoResolver< + R = PageInfoPaginated, + Parent = EventsData, + Context = SiemContext + > = Resolver; export type InspectResolver< R = Inspect | null, Parent = EventsData, @@ -5064,25 +5074,6 @@ export namespace SshEcsFieldsResolvers { > = Resolver; } -export namespace PageInfoResolvers { - export interface Resolvers { - endCursor?: EndCursorResolver; - - hasNextPage?: HasNextPageResolver; - } - - export type EndCursorResolver< - R = CursorType | null, - Parent = PageInfo, - Context = SiemContext - > = Resolver; - export type HasNextPageResolver< - R = boolean | null, - Parent = PageInfo, - Context = SiemContext - > = Resolver; -} - export namespace TimelineDataResolvers { export interface Resolvers { edges?: EdgesResolver; @@ -5187,6 +5178,25 @@ export namespace TimelineNonEcsDataResolvers { > = Resolver; } +export namespace PageInfoResolvers { + export interface Resolvers { + endCursor?: EndCursorResolver; + + hasNextPage?: HasNextPageResolver; + } + + export type EndCursorResolver< + R = CursorType | null, + Parent = PageInfo, + Context = SiemContext + > = Resolver; + export type HasNextPageResolver< + R = boolean | null, + Parent = PageInfo, + Context = SiemContext + > = Resolver; +} + export namespace TimelineDetailsDataResolvers { export interface Resolvers { data?: DataResolver; @@ -5257,7 +5267,7 @@ export namespace HostsDataResolvers { totalCount?: TotalCountResolver; - pageInfo?: PageInfoResolver; + pageInfo?: PageInfoResolver; inspect?: InspectResolver; } @@ -5272,11 +5282,11 @@ export namespace HostsDataResolvers { Parent, Context >; - export type PageInfoResolver = Resolver< - R, - Parent, - Context - >; + export type PageInfoResolver< + R = PageInfoPaginated, + Parent = HostsData, + Context = SiemContext + > = Resolver; export type InspectResolver< R = Inspect | null, Parent = HostsData, @@ -5538,7 +5548,7 @@ export namespace DomainsDataResolvers { totalCount?: TotalCountResolver; - pageInfo?: PageInfoResolver; + pageInfo?: PageInfoResolver; inspect?: InspectResolver; } @@ -5554,7 +5564,7 @@ export namespace DomainsDataResolvers { Context = SiemContext > = Resolver; export type PageInfoResolver< - R = PageInfo, + R = PageInfoPaginated, Parent = DomainsData, Context = SiemContext > = Resolver; @@ -5710,7 +5720,7 @@ export namespace TlsDataResolvers { totalCount?: TotalCountResolver; - pageInfo?: PageInfoResolver; + pageInfo?: PageInfoResolver; inspect?: InspectResolver; } @@ -5725,11 +5735,11 @@ export namespace TlsDataResolvers { Parent, Context >; - export type PageInfoResolver = Resolver< - R, - Parent, - Context - >; + export type PageInfoResolver< + R = PageInfoPaginated, + Parent = TlsData, + Context = SiemContext + > = Resolver; export type InspectResolver< R = Inspect | null, Parent = TlsData, @@ -5816,7 +5826,7 @@ export namespace UsersDataResolvers { totalCount?: TotalCountResolver; - pageInfo?: PageInfoResolver; + pageInfo?: PageInfoResolver; inspect?: InspectResolver; } @@ -5831,11 +5841,11 @@ export namespace UsersDataResolvers { Parent, Context >; - export type PageInfoResolver = Resolver< - R, - Parent, - Context - >; + export type PageInfoResolver< + R = PageInfoPaginated, + Parent = UsersData, + Context = SiemContext + > = Resolver; export type InspectResolver< R = Inspect | null, Parent = UsersData, @@ -6234,7 +6244,7 @@ export namespace NetworkTopNFlowDataResolvers { totalCount?: TotalCountResolver; - pageInfo?: PageInfoResolver; + pageInfo?: PageInfoResolver; inspect?: InspectResolver; } @@ -6250,7 +6260,7 @@ export namespace NetworkTopNFlowDataResolvers { Context = SiemContext > = Resolver; export type PageInfoResolver< - R = PageInfo, + R = PageInfoPaginated, Parent = NetworkTopNFlowData, Context = SiemContext > = Resolver; @@ -6392,7 +6402,7 @@ export namespace NetworkDnsDataResolvers { totalCount?: TotalCountResolver; - pageInfo?: PageInfoResolver; + pageInfo?: PageInfoResolver; inspect?: InspectResolver; } @@ -6408,7 +6418,7 @@ export namespace NetworkDnsDataResolvers { Context = SiemContext > = Resolver; export type PageInfoResolver< - R = PageInfo, + R = PageInfoPaginated, Parent = NetworkDnsData, Context = SiemContext > = Resolver; @@ -6634,7 +6644,7 @@ export namespace UncommonProcessesDataResolvers { totalCount?: TotalCountResolver; - pageInfo?: PageInfoResolver; + pageInfo?: PageInfoResolver; inspect?: InspectResolver; } @@ -6650,7 +6660,7 @@ export namespace UncommonProcessesDataResolvers { Context = SiemContext > = Resolver; export type PageInfoResolver< - R = PageInfo, + R = PageInfoPaginated, Parent = UncommonProcessesData, Context = SiemContext > = Resolver; @@ -7410,6 +7420,39 @@ export namespace ResponseFavoriteTimelineResolvers { > = Resolver; } +export namespace EventsTimelineDataResolvers { + export interface Resolvers { + edges?: EdgesResolver; + + totalCount?: TotalCountResolver; + + pageInfo?: PageInfoResolver; + + inspect?: InspectResolver; + } + + export type EdgesResolver< + R = EcsEdges[], + Parent = EventsTimelineData, + Context = SiemContext + > = Resolver; + export type TotalCountResolver< + R = number, + Parent = EventsTimelineData, + Context = SiemContext + > = Resolver; + export type PageInfoResolver< + R = PageInfo, + Parent = EventsTimelineData, + Context = SiemContext + > = Resolver; + export type InspectResolver< + R = Inspect | null, + Parent = EventsTimelineData, + Context = SiemContext + > = Resolver; +} + export namespace OsFieldsResolvers { export interface Resolvers { platform?: PlatformResolver; diff --git a/x-pack/legacy/plugins/siem/server/graphql/uncommon_processes/resolvers.ts b/x-pack/legacy/plugins/siem/server/graphql/uncommon_processes/resolvers.ts index 9319d620ccf85..03d3c3d1a1fe4 100644 --- a/x-pack/legacy/plugins/siem/server/graphql/uncommon_processes/resolvers.ts +++ b/x-pack/legacy/plugins/siem/server/graphql/uncommon_processes/resolvers.ts @@ -7,7 +7,7 @@ import { SourceResolvers } from '../../graphql/types'; import { AppResolverOf, ChildResolverOf } from '../../lib/framework'; import { UncommonProcesses } from '../../lib/uncommon_processes'; -import { createOptions } from '../../utils/build_query/create_options'; +import { createOptionsPaginated } from '../../utils/build_query/create_options'; import { QuerySourceResolver } from '../sources/resolvers'; type QueryUncommonProcessesResolver = ChildResolverOf< @@ -28,7 +28,7 @@ export const createUncommonProcessesResolvers = ( } => ({ Source: { async UncommonProcesses(source, args, { req }, info) { - const options = createOptions(source, args, info); + const options = createOptionsPaginated(source, args, info); return libs.uncommonProcesses.getUncommonProcesses(req, options); }, }, diff --git a/x-pack/legacy/plugins/siem/server/graphql/uncommon_processes/schema.gql.ts b/x-pack/legacy/plugins/siem/server/graphql/uncommon_processes/schema.gql.ts index 2a6a0b342251f..36a3da6779172 100644 --- a/x-pack/legacy/plugins/siem/server/graphql/uncommon_processes/schema.gql.ts +++ b/x-pack/legacy/plugins/siem/server/graphql/uncommon_processes/schema.gql.ts @@ -23,7 +23,7 @@ export const uncommonProcessesSchema = gql` type UncommonProcessesData { edges: [UncommonProcessesEdges!]! totalCount: Float! - pageInfo: PageInfo! + pageInfo: PageInfoPaginated! inspect: Inspect } @@ -31,7 +31,7 @@ export const uncommonProcessesSchema = gql` "Gets UncommonProcesses based on a timerange, or all UncommonProcesses if no criteria is specified" UncommonProcesses( timerange: TimerangeInput! - pagination: PaginationInput! + pagination: PaginationInputPaginated! filterQuery: String defaultIndex: [String!]! ): UncommonProcessesData! diff --git a/x-pack/legacy/plugins/siem/server/lib/events/elasticsearch_adapter.ts b/x-pack/legacy/plugins/siem/server/lib/events/elasticsearch_adapter.ts index faf359d75d106..33c5b28393b9f 100644 --- a/x-pack/legacy/plugins/siem/server/lib/events/elasticsearch_adapter.ts +++ b/x-pack/legacy/plugins/siem/server/lib/events/elasticsearch_adapter.ts @@ -31,24 +31,31 @@ import { baseCategoryFields } from '../../utils/beat_schema/8.0.0'; import { reduceFields } from '../../utils/build_query/reduce_fields'; import { mergeFieldsWithHit, inspectStringifyObject } from '../../utils/build_query'; import { eventFieldsMap } from '../ecs_fields'; -import { FrameworkAdapter, FrameworkRequest, RequestOptions } from '../framework'; +import { FrameworkAdapter, FrameworkRequest, RequestOptionsPaginated } from '../framework'; import { TermAggregation } from '../types'; -import { buildDetailsQuery, buildQuery } from './query.dsl'; +import { buildDetailsQuery, buildQuery, buildTimelineQuery } from './query.dsl'; import { buildLastEventTimeQuery } from './query.last_event_time.dsl'; import { EventHit, EventsAdapter, - EventsRequestOptions, LastEventTimeHit, LastEventTimeRequestOptions, RequestDetailsOptions, + TimelineRequestOptions, } from './types'; +import { DEFAULT_MAX_TABLE_QUERY_SIZE } from '../../../common/constants'; export class ElasticsearchEventsAdapter implements EventsAdapter { constructor(private readonly framework: FrameworkAdapter) {} - public async getEvents(request: FrameworkRequest, options: RequestOptions): Promise { + public async getEvents( + request: FrameworkRequest, + options: RequestOptionsPaginated + ): Promise { + if (options.pagination && options.pagination.querySize >= DEFAULT_MAX_TABLE_QUERY_SIZE) { + throw new Error(`No query size above ${DEFAULT_MAX_TABLE_QUERY_SIZE}`); + } const queryOptions = cloneDeep(options); queryOptions.fields = reduceFields(options.fields, eventFieldsMap); @@ -59,31 +66,34 @@ export class ElasticsearchEventsAdapter implements EventsAdapter { dsl ); - const { limit } = options.pagination; + const { activePage, cursorStart, fakePossibleCount, querySize } = options.pagination; const totalCount = getOr(0, 'hits.total.value', response); const hits = response.hits.hits; const eventsEdges: EcsEdges[] = hits.map(hit => formatEventsData(options.fields, hit, eventFieldsMap) ); - const hasNextPage = eventsEdges.length === limit + 1; - const edges = hasNextPage ? eventsEdges.splice(0, limit) : eventsEdges; - const lastCursor = get('cursor', last(edges)); + const fakeTotalCount = fakePossibleCount <= totalCount ? fakePossibleCount : totalCount; + const edges = eventsEdges.splice(cursorStart, querySize - cursorStart); const inspect = { dsl: [inspectStringifyObject(dsl)], response: [inspectStringifyObject(response)], }; - + const showMorePagesIndicator = totalCount > fakeTotalCount; return { inspect, edges, - pageInfo: { hasNextPage, endCursor: lastCursor }, + pageInfo: { + activePage: activePage ? activePage : 0, + fakeTotalCount, + showMorePagesIndicator, + }, totalCount, }; } public async getTimelineData( request: FrameworkRequest, - options: EventsRequestOptions + options: TimelineRequestOptions ): Promise { const queryOptions = cloneDeep(options); queryOptions.fields = uniq([ @@ -92,7 +102,7 @@ export class ElasticsearchEventsAdapter implements EventsAdapter { ]); delete queryOptions.fieldRequested; - const dsl = buildQuery(queryOptions); + const dsl = buildTimelineQuery(queryOptions); const response = await this.framework.callWithRequest( request, 'search', diff --git a/x-pack/legacy/plugins/siem/server/lib/events/index.ts b/x-pack/legacy/plugins/siem/server/lib/events/index.ts index c4fb63029bf49..c51b1ff203321 100644 --- a/x-pack/legacy/plugins/siem/server/lib/events/index.ts +++ b/x-pack/legacy/plugins/siem/server/lib/events/index.ts @@ -10,11 +10,11 @@ import { TimelineData, TimelineDetailsData, } from '../../graphql/types'; -import { FrameworkRequest, RequestOptions } from '../framework'; +import { FrameworkRequest, RequestOptionsPaginated } from '../framework'; export * from './elasticsearch_adapter'; import { EventsAdapter, - EventsRequestOptions, + TimelineRequestOptions, LastEventTimeRequestOptions, RequestDetailsOptions, } from './types'; @@ -22,13 +22,16 @@ import { export class Events { constructor(private readonly adapter: EventsAdapter) {} - public async getEvents(req: FrameworkRequest, options: RequestOptions): Promise { + public async getEvents( + req: FrameworkRequest, + options: RequestOptionsPaginated + ): Promise { return await this.adapter.getEvents(req, options); } public async getTimelineData( req: FrameworkRequest, - options: EventsRequestOptions + options: TimelineRequestOptions ): Promise { return await this.adapter.getTimelineData(req, options); } diff --git a/x-pack/legacy/plugins/siem/server/lib/events/query.dsl.ts b/x-pack/legacy/plugins/siem/server/lib/events/query.dsl.ts index 6755069d45be1..bc95fe5629449 100644 --- a/x-pack/legacy/plugins/siem/server/lib/events/query.dsl.ts +++ b/x-pack/legacy/plugins/siem/server/lib/events/query.dsl.ts @@ -6,12 +6,72 @@ import { SortField, TimerangeInput } from '../../graphql/types'; import { createQueryFilterClauses } from '../../utils/build_query'; -import { RequestOptions } from '../framework'; +import { RequestOptions, RequestOptionsPaginated } from '../framework'; import { SortRequest } from '../types'; import { TimerangeFilter } from './types'; -export const buildQuery = (options: RequestOptions) => { +export const buildQuery = (options: RequestOptionsPaginated) => { + const { querySize } = options.pagination; + const { fields, filterQuery } = options; + const filterClause = [...createQueryFilterClauses(filterQuery)]; + const defaultIndex = options.defaultIndex; + + const getTimerangeFilter = (timerange: TimerangeInput | undefined): TimerangeFilter[] => { + if (timerange) { + const { to, from } = timerange; + return [ + { + range: { + [options.sourceConfiguration.fields.timestamp]: { + gte: from, + lte: to, + }, + }, + }, + ]; + } + return []; + }; + + const filter = [...filterClause, ...getTimerangeFilter(options.timerange), { match_all: {} }]; + + const getSortField = (sortField: SortField) => { + if (sortField.sortFieldId) { + const field: string = + sortField.sortFieldId === 'timestamp' ? '@timestamp' : sortField.sortFieldId; + + return [ + { [field]: sortField.direction }, + { [options.sourceConfiguration.fields.tiebreaker]: sortField.direction }, + ]; + } + return []; + }; + + const sort: SortRequest = getSortField(options.sortField!); + + const dslQuery = { + allowNoIndices: true, + index: defaultIndex, + ignoreUnavailable: true, + body: { + query: { + bool: { + filter, + }, + }, + size: querySize, + track_total_hits: true, + sort, + _source: fields, + }, + }; + + return dslQuery; +}; + +export const buildTimelineQuery = (options: RequestOptions) => { const { limit, cursor, tiebreaker } = options.pagination; const { fields, filterQuery } = options; const filterClause = [...createQueryFilterClauses(filterQuery)]; diff --git a/x-pack/legacy/plugins/siem/server/lib/events/types.ts b/x-pack/legacy/plugins/siem/server/lib/events/types.ts index b88c26921b2f2..bcd62c583cf6d 100644 --- a/x-pack/legacy/plugins/siem/server/lib/events/types.ts +++ b/x-pack/legacy/plugins/siem/server/lib/events/types.ts @@ -13,12 +13,12 @@ import { TimelineData, TimelineDetailsData, } from '../../graphql/types'; -import { FrameworkRequest, RequestOptions } from '../framework'; +import { FrameworkRequest, RequestOptions, RequestOptionsPaginated } from '../framework'; import { SearchHit } from '../types'; export interface EventsAdapter { - getEvents(req: FrameworkRequest, options: RequestOptions): Promise; - getTimelineData(req: FrameworkRequest, options: EventsRequestOptions): Promise; + getEvents(req: FrameworkRequest, options: RequestOptionsPaginated): Promise; + getTimelineData(req: FrameworkRequest, options: TimelineRequestOptions): Promise; getTimelineDetails( req: FrameworkRequest, options: RequestDetailsOptions @@ -29,7 +29,11 @@ export interface EventsAdapter { ): Promise; } -export interface EventsRequestOptions extends RequestOptions { +export interface TimelineRequestOptions extends RequestOptions { + fieldRequested: string[]; +} + +export interface EventsRequestOptions extends RequestOptionsPaginated { fieldRequested: string[]; } diff --git a/x-pack/legacy/plugins/siem/server/lib/hosts/elasticsearch_adapter.ts b/x-pack/legacy/plugins/siem/server/lib/hosts/elasticsearch_adapter.ts index e18fe7452ea84..792a1a4be5307 100644 --- a/x-pack/legacy/plugins/siem/server/lib/hosts/elasticsearch_adapter.ts +++ b/x-pack/legacy/plugins/siem/server/lib/hosts/elasticsearch_adapter.ts @@ -26,6 +26,7 @@ import { HostsRequestOptions, HostValue, } from './types'; +import { DEFAULT_MAX_TABLE_QUERY_SIZE } from '../../../common/constants'; export class ElasticsearchHostsAdapter implements HostsAdapter { constructor(private readonly framework: FrameworkAdapter) {} @@ -35,28 +36,35 @@ export class ElasticsearchHostsAdapter implements HostsAdapter { options: HostsRequestOptions ): Promise { const dsl = buildHostsQuery(options); + if (options.pagination && options.pagination.querySize >= DEFAULT_MAX_TABLE_QUERY_SIZE) { + throw new Error(`No query size above ${DEFAULT_MAX_TABLE_QUERY_SIZE}`); + } const response = await this.framework.callWithRequest( request, 'search', dsl ); - const { cursor, limit } = options.pagination; + const { activePage, cursorStart, fakePossibleCount, querySize } = options.pagination; const totalCount = getOr(0, 'aggregations.host_count.value', response); const buckets: HostAggEsItem[] = getOr([], 'aggregations.host_data.buckets', response); const hostsEdges = buckets.map(bucket => formatHostEdgesData(options.fields, bucket)); - const hasNextPage = hostsEdges.length === limit + 1; - const beginning = cursor != null ? parseInt(cursor, 10) : 0; - const edges = hostsEdges.splice(beginning, limit - beginning); + const fakeTotalCount = fakePossibleCount <= totalCount ? fakePossibleCount : totalCount; + const edges = hostsEdges.splice(cursorStart, querySize - cursorStart); const inspect = { dsl: [inspectStringifyObject(dsl)], response: [inspectStringifyObject(response)], }; + const showMorePagesIndicator = totalCount > fakeTotalCount; return { inspect, edges, totalCount, - pageInfo: { hasNextPage, endCursor: { value: String(limit) } }, + pageInfo: { + activePage: activePage ? activePage : 0, + fakeTotalCount, + showMorePagesIndicator, + }, }; } diff --git a/x-pack/legacy/plugins/siem/server/lib/hosts/mock.ts b/x-pack/legacy/plugins/siem/server/lib/hosts/mock.ts index 59c03560ac810..e8c57be8e2ca5 100644 --- a/x-pack/legacy/plugins/siem/server/lib/hosts/mock.ts +++ b/x-pack/legacy/plugins/siem/server/lib/hosts/mock.ts @@ -26,7 +26,12 @@ export const mockGetHostsOptions: HostsRequestOptions = { }, timerange: { interval: '12h', to: 1554824274610, from: 1554737874610 }, sort: { field: HostsFields.lastSeen, direction: Direction.asc }, - pagination: { limit: 10, cursor: null, tiebreaker: null }, + pagination: { + activePage: 0, + cursorStart: 0, + fakePossibleCount: 10, + querySize: 2, + }, filterQuery: {}, fields: [ 'totalCount', @@ -36,8 +41,9 @@ export const mockGetHostsOptions: HostsRequestOptions = { 'host.os.name', 'host.os.version', 'edges.cursor.value', - 'pageInfo.endCursor.value', - 'pageInfo.hasNextPage', + 'pageInfo.activePage', + 'pageInfo.fakeTotalCount', + 'pageInfo.showMorePagesIndicator', ], }; @@ -48,7 +54,12 @@ export const mockGetHostsRequest = { variables: { sourceId: 'default', timerange: { interval: '12h', from: 1554737729201, to: 1554824129202 }, - pagination: { limit: 10, cursor: null, tiebreaker: null }, + pagination: { + activePage: 0, + cursorStart: 0, + fakePossibleCount: 10, + querySize: 2, + }, sort: { field: HostsFields.lastSeen, direction: Direction.asc }, filterQuery: '', }, @@ -269,10 +280,9 @@ export const mockGetHostsResult = { ], totalCount: 1627, pageInfo: { - hasNextPage: false, - endCursor: { - value: '10', - }, + activePage: 0, + fakeTotalCount: 10, + showMorePagesIndicator: true, }, }; diff --git a/x-pack/legacy/plugins/siem/server/lib/hosts/query.hosts.dsl.ts b/x-pack/legacy/plugins/siem/server/lib/hosts/query.hosts.dsl.ts index 35ed71b9d27b3..7c2e0df535344 100644 --- a/x-pack/legacy/plugins/siem/server/lib/hosts/query.hosts.dsl.ts +++ b/x-pack/legacy/plugins/siem/server/lib/hosts/query.hosts.dsl.ts @@ -13,11 +13,11 @@ import { HostsRequestOptions } from '.'; import { buildFieldsTermAggregation } from './helpers'; export const buildHostsQuery = ({ + defaultIndex, fields, filterQuery, - pagination: { limit, cursor }, + pagination: { querySize }, sort, - defaultIndex, sourceConfiguration: { fields: { timestamp }, }, @@ -47,7 +47,7 @@ export const buildHostsQuery = ({ aggregations: { ...agg, host_data: { - terms: { size: limit + 1, field: 'host.name', order: getQueryOrder(sort) }, + terms: { size: querySize, field: 'host.name', order: getQueryOrder(sort) }, aggs: { lastSeen: { max: { field: '@timestamp' } }, ...buildFieldsTermAggregation( diff --git a/x-pack/legacy/plugins/siem/server/lib/hosts/types.ts b/x-pack/legacy/plugins/siem/server/lib/hosts/types.ts index b63f4db2926e8..63360492c1cf3 100644 --- a/x-pack/legacy/plugins/siem/server/lib/hosts/types.ts +++ b/x-pack/legacy/plugins/siem/server/lib/hosts/types.ts @@ -13,7 +13,7 @@ import { SourceConfiguration, TimerangeInput, } from '../../graphql/types'; -import { FrameworkRequest, RequestOptions } from '../framework'; +import { FrameworkRequest, RequestOptionsPaginated } from '../framework'; import { Hit, Hits, SearchHit } from '../types'; export interface HostsAdapter { @@ -39,7 +39,7 @@ export interface HostHit extends Hit { export type HostHits = Hits; -export interface HostsRequestOptions extends RequestOptions { +export interface HostsRequestOptions extends RequestOptionsPaginated { sort: HostsSortField; defaultIndex: string[]; } diff --git a/x-pack/legacy/plugins/siem/server/lib/ip_details/elasticsearch_adapter.ts b/x-pack/legacy/plugins/siem/server/lib/ip_details/elasticsearch_adapter.ts index c59145f5e25a2..6957b548dcb86 100644 --- a/x-pack/legacy/plugins/siem/server/lib/ip_details/elasticsearch_adapter.ts +++ b/x-pack/legacy/plugins/siem/server/lib/ip_details/elasticsearch_adapter.ts @@ -22,7 +22,7 @@ import { import { inspectStringifyObject } from '../../utils/build_query'; import { DatabaseSearchResponse, FrameworkAdapter, FrameworkRequest } from '../framework'; import { TermAggregation } from '../types'; - +import { DEFAULT_MAX_TABLE_QUERY_SIZE } from '../../../common/constants'; import { DomainsRequestOptions, IpOverviewRequestOptions, @@ -76,6 +76,9 @@ export class ElasticsearchIpOverviewAdapter implements IpDetailsAdapter { request: FrameworkRequest, options: DomainsRequestOptions ): Promise { + if (options.pagination && options.pagination.querySize >= DEFAULT_MAX_TABLE_QUERY_SIZE) { + throw new Error(`No query size above ${DEFAULT_MAX_TABLE_QUERY_SIZE}`); + } const dsl = buildDomainsQuery(options); const response = await this.framework.callWithRequest( request, @@ -83,32 +86,32 @@ export class ElasticsearchIpOverviewAdapter implements IpDetailsAdapter { dsl ); - const { cursor, limit } = options.pagination; + const { activePage, cursorStart, fakePossibleCount, querySize } = options.pagination; const totalCount = getOr(0, 'aggregations.domain_count.value', response); const domainsEdges: DomainsEdges[] = getDomainsEdges(response, options); - const hasNextPage = domainsEdges.length > limit; - const beginning = cursor != null ? parseInt(cursor, 10) : 0; - const edges = domainsEdges.splice(beginning, limit - beginning); + const fakeTotalCount = fakePossibleCount <= totalCount ? fakePossibleCount : totalCount; + const edges = domainsEdges.splice(cursorStart, querySize - cursorStart); const inspect = { dsl: [inspectStringifyObject(dsl)], response: [inspectStringifyObject(response)], }; - + const showMorePagesIndicator = totalCount > fakeTotalCount; return { edges, inspect, pageInfo: { - hasNextPage, - endCursor: { - value: String(limit), - tiebreaker: null, - }, + activePage: activePage ? activePage : 0, + fakeTotalCount, + showMorePagesIndicator, }, totalCount, }; } public async getTls(request: FrameworkRequest, options: TlsRequestOptions): Promise { + if (options.pagination && options.pagination.querySize >= DEFAULT_MAX_TABLE_QUERY_SIZE) { + throw new Error(`No query size above ${DEFAULT_MAX_TABLE_QUERY_SIZE}`); + } const dsl = buildTlsQuery(options); const response = await this.framework.callWithRequest( request, @@ -116,26 +119,23 @@ export class ElasticsearchIpOverviewAdapter implements IpDetailsAdapter { dsl ); - const { cursor, limit } = options.pagination; + const { activePage, cursorStart, fakePossibleCount, querySize } = options.pagination; const totalCount = getOr(0, 'aggregations.count.value', response); const tlsEdges: TlsEdges[] = getTlsEdges(response, options); - const hasNextPage = tlsEdges.length > limit; - const beginning = cursor != null ? parseInt(cursor, 10) : 0; - const edges = tlsEdges.splice(beginning, limit - beginning); + const fakeTotalCount = fakePossibleCount <= totalCount ? fakePossibleCount : totalCount; + const edges = tlsEdges.splice(cursorStart, querySize - cursorStart); const inspect = { dsl: [inspectStringifyObject(dsl)], response: [inspectStringifyObject(response)], }; - + const showMorePagesIndicator = totalCount > fakeTotalCount; return { edges, inspect, pageInfo: { - hasNextPage, - endCursor: { - value: String(limit), - tiebreaker: null, - }, + activePage: activePage ? activePage : 0, + fakeTotalCount, + showMorePagesIndicator, }, totalCount, }; @@ -145,6 +145,9 @@ export class ElasticsearchIpOverviewAdapter implements IpDetailsAdapter { request: FrameworkRequest, options: UsersRequestOptions ): Promise { + if (options.pagination && options.pagination.querySize >= DEFAULT_MAX_TABLE_QUERY_SIZE) { + throw new Error(`No query size above ${DEFAULT_MAX_TABLE_QUERY_SIZE}`); + } const dsl = buildUsersQuery(options); const response = await this.framework.callWithRequest( request, @@ -152,26 +155,23 @@ export class ElasticsearchIpOverviewAdapter implements IpDetailsAdapter { dsl ); - const { cursor, limit } = options.pagination; + const { activePage, cursorStart, fakePossibleCount, querySize } = options.pagination; const totalCount = getOr(0, 'aggregations.user_count.value', response); const usersEdges = getUsersEdges(response); - const hasNextPage = usersEdges.length > limit; - const beginning = cursor != null ? parseInt(cursor, 10) : 0; - const edges = usersEdges.splice(beginning, limit - beginning); + const fakeTotalCount = fakePossibleCount <= totalCount ? fakePossibleCount : totalCount; + const edges = usersEdges.splice(cursorStart, querySize - cursorStart); const inspect = { dsl: [inspectStringifyObject(dsl)], response: [inspectStringifyObject(response)], }; - + const showMorePagesIndicator = totalCount > fakeTotalCount; return { edges, inspect, pageInfo: { - endCursor: { - value: String(limit), - tiebreaker: null, - }, - hasNextPage, + activePage: activePage ? activePage : 0, + fakeTotalCount, + showMorePagesIndicator, }, totalCount, }; diff --git a/x-pack/legacy/plugins/siem/server/lib/ip_details/index.ts b/x-pack/legacy/plugins/siem/server/lib/ip_details/index.ts index 83a58dc5d4e54..d1a70df4ffcf6 100644 --- a/x-pack/legacy/plugins/siem/server/lib/ip_details/index.ts +++ b/x-pack/legacy/plugins/siem/server/lib/ip_details/index.ts @@ -15,7 +15,7 @@ import { UsersData, UsersSortField, } from '../../graphql/types'; -import { FrameworkRequest, RequestOptions } from '../framework'; +import { FrameworkRequest, RequestOptions, RequestOptionsPaginated } from '../framework'; import { IpDetailsAdapter } from './types'; @@ -25,19 +25,19 @@ export interface IpOverviewRequestOptions extends RequestOptions { ip: string; } -export interface DomainsRequestOptions extends RequestOptions { +export interface DomainsRequestOptions extends RequestOptionsPaginated { ip: string; domainsSortField: DomainsSortField; flowTarget: FlowTarget; flowDirection: FlowDirection; } -export interface TlsRequestOptions extends RequestOptions { +export interface TlsRequestOptions extends RequestOptionsPaginated { ip: string; tlsSortField: TlsSortField; flowTarget: FlowTarget; } -export interface UsersRequestOptions extends RequestOptions { +export interface UsersRequestOptions extends RequestOptionsPaginated { ip: string; usersSortField: UsersSortField; flowTarget: FlowTarget; diff --git a/x-pack/legacy/plugins/siem/server/lib/ip_details/query_domains.dsl.ts b/x-pack/legacy/plugins/siem/server/lib/ip_details/query_domains.dsl.ts index fb6f02bb866e5..e81a337458203 100644 --- a/x-pack/legacy/plugins/siem/server/lib/ip_details/query_domains.dsl.ts +++ b/x-pack/legacy/plugins/siem/server/lib/ip_details/query_domains.dsl.ts @@ -20,7 +20,7 @@ const getAggs = ( flowTarget: FlowTarget, flowDirection: FlowDirection, domainsSortField: DomainsSortField, - limit: number + querySize: number ) => { return { domain_count: { @@ -31,7 +31,7 @@ const getAggs = ( [`${flowTarget}_domains`]: { terms: { field: `${flowTarget}.domain`, - size: limit + 1, + size: querySize, order: { ...getQueryOrder(domainsSortField), }, @@ -129,7 +129,7 @@ export const buildDomainsQuery = ({ filterQuery, flowDirection, flowTarget, - pagination: { limit }, + pagination: { querySize }, defaultIndex, sourceConfiguration: { fields: { timestamp }, @@ -149,7 +149,7 @@ export const buildDomainsQuery = ({ ignoreUnavailable: true, body: { aggs: { - ...getAggs(ip, flowTarget, flowDirection, domainsSortField, limit), + ...getAggs(ip, flowTarget, flowDirection, domainsSortField, querySize), }, query: { bool: { diff --git a/x-pack/legacy/plugins/siem/server/lib/ip_details/query_tls.dsl.ts b/x-pack/legacy/plugins/siem/server/lib/ip_details/query_tls.dsl.ts index 22292cb1194e3..562746bb9645c 100644 --- a/x-pack/legacy/plugins/siem/server/lib/ip_details/query_tls.dsl.ts +++ b/x-pack/legacy/plugins/siem/server/lib/ip_details/query_tls.dsl.ts @@ -9,7 +9,7 @@ import { createQueryFilterClauses, assertUnreachable } from '../../utils/build_q import { TlsRequestOptions } from './index'; import { TlsSortField, Direction, TlsFields } from '../../graphql/types'; -const getAggs = (limit: number, tlsSortField: TlsSortField) => ({ +const getAggs = (querySize: number, tlsSortField: TlsSortField) => ({ count: { cardinality: { field: 'tls.server_certificate.fingerprint.sha1', @@ -18,7 +18,7 @@ const getAggs = (limit: number, tlsSortField: TlsSortField) => ({ sha1: { terms: { field: 'tls.server_certificate.fingerprint.sha1', - size: limit + 1, + size: querySize, order: { ...getQueryOrder(tlsSortField), }, @@ -58,7 +58,7 @@ export const buildTlsQuery = ({ tlsSortField, filterQuery, flowTarget, - pagination: { limit }, + pagination: { querySize }, defaultIndex, sourceConfiguration: { fields: { timestamp }, @@ -77,7 +77,7 @@ export const buildTlsQuery = ({ ignoreUnavailable: true, body: { aggs: { - ...getAggs(limit, tlsSortField), + ...getAggs(querySize, tlsSortField), }, query: { bool: { diff --git a/x-pack/legacy/plugins/siem/server/lib/ip_details/query_users.dsl.ts b/x-pack/legacy/plugins/siem/server/lib/ip_details/query_users.dsl.ts index 222b69a76e660..0133b2e3732a1 100644 --- a/x-pack/legacy/plugins/siem/server/lib/ip_details/query_users.dsl.ts +++ b/x-pack/legacy/plugins/siem/server/lib/ip_details/query_users.dsl.ts @@ -14,7 +14,7 @@ export const buildUsersQuery = ({ usersSortField, filterQuery, flowTarget, - pagination: { limit }, + pagination: { querySize }, defaultIndex, sourceConfiguration: { fields: { timestamp }, @@ -41,7 +41,7 @@ export const buildUsersQuery = ({ users: { terms: { field: 'user.name', - size: limit + 1, + size: querySize, order: { ...getQueryOrder(usersSortField), }, diff --git a/x-pack/legacy/plugins/siem/server/lib/network/elastic_adapter.test.ts b/x-pack/legacy/plugins/siem/server/lib/network/elastic_adapter.test.ts index 1f3b59a4cc278..7ebb3427e700a 100644 --- a/x-pack/legacy/plugins/siem/server/lib/network/elastic_adapter.test.ts +++ b/x-pack/legacy/plugins/siem/server/lib/network/elastic_adapter.test.ts @@ -74,7 +74,11 @@ describe('Network Top N flow elasticsearch_adapter with FlowTarget=source and Fl response: [JSON.stringify(mockNoDataResponse, null, 2)], }, edges: [], - pageInfo: { endCursor: { tiebreaker: null, value: '10' }, hasNextPage: false }, + pageInfo: { + activePage: 0, + fakeTotalCount: 0, + showMorePagesIndicator: false, + }, totalCount: 0, }); }); @@ -107,7 +111,7 @@ describe('Network Top N flow elasticsearch_adapter with FlowTarget=source and Fl mockRequest as FrameworkRequest, mockOptions ); - expect(data.pageInfo.hasNextPage).toBeFalsy(); + expect(data.pageInfo.showMorePagesIndicator).toBeFalsy(); }); }); }); diff --git a/x-pack/legacy/plugins/siem/server/lib/network/elasticsearch_adapter.ts b/x-pack/legacy/plugins/siem/server/lib/network/elasticsearch_adapter.ts index 96dafa0ee9138..44b70f81ed3a4 100644 --- a/x-pack/legacy/plugins/siem/server/lib/network/elasticsearch_adapter.ts +++ b/x-pack/legacy/plugins/siem/server/lib/network/elasticsearch_adapter.ts @@ -9,6 +9,7 @@ import { get, getOr } from 'lodash/fp'; import { FlowDirection, FlowTarget, + NetworkDnsData, NetworkDnsEdges, NetworkTopNFlowData, NetworkTopNFlowEdges, @@ -16,6 +17,7 @@ import { import { inspectStringifyObject } from '../../utils/build_query'; import { DatabaseSearchResponse, FrameworkAdapter, FrameworkRequest } from '../framework'; import { TermAggregation } from '../types'; +import { DEFAULT_MAX_TABLE_QUERY_SIZE } from '../../../common/constants'; import { NetworkDnsRequestOptions, NetworkTopNFlowRequestOptions } from './index'; import { buildDnsQuery } from './query_dns.dsl'; @@ -35,26 +37,24 @@ export class ElasticsearchNetworkAdapter implements NetworkAdapter { 'search', dsl ); - const { cursor, limit } = options.pagination; + const { activePage, cursorStart, fakePossibleCount, querySize } = options.pagination; const totalCount = getOr(0, 'aggregations.top_n_flow_count.value', response); const networkTopNFlowEdges: NetworkTopNFlowEdges[] = getTopNFlowEdges(response, options); - const hasNextPage = networkTopNFlowEdges.length > limit; - const beginning = cursor != null ? parseInt(cursor, 10) : 0; - const edges = networkTopNFlowEdges.splice(beginning, limit - beginning); + const fakeTotalCount = fakePossibleCount <= totalCount ? fakePossibleCount : totalCount; + const edges = networkTopNFlowEdges.splice(cursorStart, querySize - cursorStart); const inspect = { dsl: [inspectStringifyObject(dsl)], response: [inspectStringifyObject(response)], }; + const showMorePagesIndicator = totalCount > fakeTotalCount; return { edges, inspect, pageInfo: { - hasNextPage, - endCursor: { - value: String(limit), - tiebreaker: null, - }, + activePage: activePage ? activePage : 0, + fakeTotalCount, + showMorePagesIndicator, }, totalCount, }; @@ -63,35 +63,32 @@ export class ElasticsearchNetworkAdapter implements NetworkAdapter { public async getNetworkDns( request: FrameworkRequest, options: NetworkDnsRequestOptions - ): Promise { + ): Promise { const dsl = buildDnsQuery(options); - const response = await this.framework.callWithRequest( + const response = await this.framework.callWithRequest( request, 'search', dsl ); - const { cursor, limit } = options.pagination; + const { activePage, cursorStart, fakePossibleCount, querySize } = options.pagination; const totalCount = getOr(0, 'aggregations.dns_count.value', response); const networkDnsEdges: NetworkDnsEdges[] = formatDnsEdges( getOr([], 'aggregations.dns_name_query_count.buckets', response) ); - const hasNextPage = networkDnsEdges.length > limit; - const beginning = cursor != null ? parseInt(cursor, 10) : 0; - const edges = networkDnsEdges.splice(beginning, limit - beginning); + const fakeTotalCount = fakePossibleCount <= totalCount ? fakePossibleCount : totalCount; + const edges = networkDnsEdges.splice(cursorStart, querySize - cursorStart); const inspect = { dsl: [inspectStringifyObject(dsl)], response: [inspectStringifyObject(response)], }; - + const showMorePagesIndicator = totalCount > fakeTotalCount; return { edges, inspect, pageInfo: { - hasNextPage, - endCursor: { - value: String(limit), - tiebreaker: null, - }, + activePage: activePage ? activePage : 0, + fakeTotalCount, + showMorePagesIndicator, }, totalCount, }; @@ -102,6 +99,9 @@ const getTopNFlowEdges = ( response: DatabaseSearchResponse, options: NetworkTopNFlowRequestOptions ): NetworkTopNFlowEdges[] => { + if (options.pagination && options.pagination.querySize >= DEFAULT_MAX_TABLE_QUERY_SIZE) { + throw new Error(`No query size above ${DEFAULT_MAX_TABLE_QUERY_SIZE}`); + } if (options.flowDirection === FlowDirection.uniDirectional) { return formatTopNFlowEdges( getOr([], 'aggregations.top_uni_flow.buckets', response), diff --git a/x-pack/legacy/plugins/siem/server/lib/network/index.ts b/x-pack/legacy/plugins/siem/server/lib/network/index.ts index dd3f7032ce99f..9bec909814afc 100644 --- a/x-pack/legacy/plugins/siem/server/lib/network/index.ts +++ b/x-pack/legacy/plugins/siem/server/lib/network/index.ts @@ -11,19 +11,19 @@ import { NetworkTopNFlowData, NetworkTopNFlowSortField, } from '../../graphql/types'; -import { FrameworkRequest, RequestOptions } from '../framework'; +import { FrameworkRequest, RequestOptionsPaginated } from '../framework'; export * from './elasticsearch_adapter'; import { NetworkAdapter } from './types'; export * from './types'; -export interface NetworkTopNFlowRequestOptions extends RequestOptions { +export interface NetworkTopNFlowRequestOptions extends RequestOptionsPaginated { networkTopNFlowSort: NetworkTopNFlowSortField; flowTarget: FlowTarget; flowDirection: FlowDirection; } -export interface NetworkDnsRequestOptions extends RequestOptions { +export interface NetworkDnsRequestOptions extends RequestOptionsPaginated { isPtrIncluded: boolean; networkDnsSortField: NetworkDnsSortField; } diff --git a/x-pack/legacy/plugins/siem/server/lib/network/mock.ts b/x-pack/legacy/plugins/siem/server/lib/network/mock.ts index afbbb1dfa86bb..d1de95f34c372 100644 --- a/x-pack/legacy/plugins/siem/server/lib/network/mock.ts +++ b/x-pack/legacy/plugins/siem/server/lib/network/mock.ts @@ -21,7 +21,12 @@ export const mockOptions: NetworkTopNFlowRequestOptions = { }, }, timerange: { interval: '12h', to: 1549852006071, from: 1549765606071 }, - pagination: { limit: 10, cursor: null, tiebreaker: null }, + pagination: { + activePage: 0, + cursorStart: 0, + fakePossibleCount: 50, + querySize: 10, + }, filterQuery: {}, fields: [ 'totalCount', @@ -40,9 +45,11 @@ export const mockOptions: NetworkTopNFlowRequestOptions = { 'edges.cursor.value', 'edges.cursor.__typename', 'edges.__typename', - 'pageInfo.endCursor.value', - 'pageInfo.endCursor.__typename', - 'pageInfo.hasNextPage', + 'pageInfo.activePage', + 'pageInfo.__typename', + 'pageInfo.fakeTotalCount', + 'pageInfo.__typename', + 'pageInfo.showMorePagesIndicator', 'pageInfo.__typename', '__typename', ], @@ -59,7 +66,12 @@ export const mockRequest = { filterQuery: '', flowDirection: FlowDirection.uniDirectional, flowType: FlowTarget.source, - pagination: { limit: 10, cursor: null, tiebreaker: null }, + pagination: { + activePage: 0, + cursorStart: 0, + fakePossibleCount: 50, + querySize: 10, + }, sourceId: 'default', timerange: { interval: '12h', from: 1549765830772, to: 1549852230772 }, }, @@ -97,11 +109,11 @@ export const mockRequest = { __typename } pageInfo { - endCursor { - value - __typename - } - hasNextPage + activePage + __typename + fakeTotalCount + __typename + showMorePagesIndicator __typename } __typename @@ -634,11 +646,9 @@ export const mockResult = { }, ], pageInfo: { - endCursor: { - tiebreaker: null, - value: '10', - }, - hasNextPage: true, + activePage: 0, + fakeTotalCount: 50, + showMorePagesIndicator: true, }, totalCount: 545, }; diff --git a/x-pack/legacy/plugins/siem/server/lib/network/query_dns.dsl.ts b/x-pack/legacy/plugins/siem/server/lib/network/query_dns.dsl.ts index 7c08aab1e20b5..c72020198ac93 100644 --- a/x-pack/legacy/plugins/siem/server/lib/network/query_dns.dsl.ts +++ b/x-pack/legacy/plugins/siem/server/lib/network/query_dns.dsl.ts @@ -56,15 +56,15 @@ const createIncludePTRFilter = (isPtrIncluded: boolean) => }; export const buildDnsQuery = ({ + defaultIndex, filterQuery, isPtrIncluded, networkDnsSortField, - timerange: { from, to }, - pagination: { limit }, - defaultIndex, + pagination: { querySize }, sourceConfiguration: { fields: { timestamp }, }, + timerange: { from, to }, }: NetworkDnsRequestOptions) => { const filter = [ ...createQueryFilterClauses(filterQuery), @@ -88,7 +88,7 @@ export const buildDnsQuery = ({ dns_name_query_count: { terms: { field: 'dns.question.etld_plus_one', - size: limit + 1, + size: querySize, order: { ...getQueryOrder(networkDnsSortField), }, diff --git a/x-pack/legacy/plugins/siem/server/lib/network/query_top_n_flow.dsl.ts b/x-pack/legacy/plugins/siem/server/lib/network/query_top_n_flow.dsl.ts index 4afb3c6607ff1..efbce55a3e968 100644 --- a/x-pack/legacy/plugins/siem/server/lib/network/query_top_n_flow.dsl.ts +++ b/x-pack/legacy/plugins/siem/server/lib/network/query_top_n_flow.dsl.ts @@ -74,16 +74,16 @@ const getCountAgg = (flowTarget: FlowTarget) => ({ }); export const buildTopNFlowQuery = ({ + defaultIndex, filterQuery, flowDirection, - networkTopNFlowSort, flowTarget, - timerange: { from, to }, - pagination: { limit }, - defaultIndex, + networkTopNFlowSort, + pagination: { querySize }, sourceConfiguration: { fields: { timestamp }, }, + timerange: { from, to }, }: NetworkTopNFlowRequestOptions) => { const filter = [ ...createQueryFilterClauses(filterQuery), @@ -98,8 +98,8 @@ export const buildTopNFlowQuery = ({ body: { aggregations: { ...getCountAgg(flowTarget), - ...getUniDirectionAggs(flowDirection, networkTopNFlowSort, flowTarget, limit), - ...getBiDirectionAggs(flowDirection, networkTopNFlowSort, flowTarget, limit), + ...getUniDirectionAggs(flowDirection, networkTopNFlowSort, flowTarget, querySize), + ...getBiDirectionAggs(flowDirection, networkTopNFlowSort, flowTarget, querySize), }, query: { bool: { @@ -118,14 +118,14 @@ const getUniDirectionAggs = ( flowDirection: FlowDirection, networkTopNFlowSortField: NetworkTopNFlowSortField, flowTarget: FlowTarget, - limit: number + querySize: number ) => flowDirection === FlowDirection.uniDirectional ? { top_uni_flow: { terms: { field: `${flowTarget}.ip`, - size: limit + 1, + size: querySize, order: { ...getQueryOrder(networkTopNFlowSortField), }, @@ -177,14 +177,14 @@ const getBiDirectionAggs = ( flowDirection: FlowDirection, networkTopNFlowSortField: NetworkTopNFlowSortField, flowTarget: FlowTarget, - limit: number + querySize: number ) => flowDirection === FlowDirection.biDirectional ? { top_bi_flow: { terms: { field: `${flowTarget}.ip`, - size: limit + 1, + size: querySize, order: { ...getQueryOrder(networkTopNFlowSortField), }, diff --git a/x-pack/legacy/plugins/siem/server/lib/network/types.ts b/x-pack/legacy/plugins/siem/server/lib/network/types.ts index ca2800a58f576..40690a442f655 100644 --- a/x-pack/legacy/plugins/siem/server/lib/network/types.ts +++ b/x-pack/legacy/plugins/siem/server/lib/network/types.ts @@ -5,12 +5,15 @@ */ import { NetworkDirectionEcs, NetworkDnsData, NetworkTopNFlowData } from '../../graphql/types'; -import { FrameworkRequest, RequestOptions } from '../framework'; +import { FrameworkRequest, RequestOptionsPaginated } from '../framework'; import { SearchHit } from '../types'; export interface NetworkAdapter { - getNetworkTopNFlow(req: FrameworkRequest, options: RequestOptions): Promise; - getNetworkDns(req: FrameworkRequest, options: RequestOptions): Promise; + getNetworkTopNFlow( + req: FrameworkRequest, + options: RequestOptionsPaginated + ): Promise; + getNetworkDns(req: FrameworkRequest, options: RequestOptionsPaginated): Promise; } export interface GenericBuckets { diff --git a/x-pack/legacy/plugins/siem/server/lib/uncommon_processes/elasticsearch_adapter.ts b/x-pack/legacy/plugins/siem/server/lib/uncommon_processes/elasticsearch_adapter.ts index ce331b0c30ed7..111df08b89e2f 100644 --- a/x-pack/legacy/plugins/siem/server/lib/uncommon_processes/elasticsearch_adapter.ts +++ b/x-pack/legacy/plugins/siem/server/lib/uncommon_processes/elasticsearch_adapter.ts @@ -9,9 +9,9 @@ import { get, getOr } from 'lodash/fp'; import { UncommonProcessesData, UncommonProcessesEdges } from '../../graphql/types'; import { mergeFieldsWithHit, inspectStringifyObject } from '../../utils/build_query'; import { processFieldsMap, userFieldsMap } from '../ecs_fields'; -import { FrameworkAdapter, FrameworkRequest, RequestOptions } from '../framework'; +import { FrameworkAdapter, FrameworkRequest, RequestOptionsPaginated } from '../framework'; import { HostHits, TermAggregation } from '../types'; - +import { DEFAULT_MAX_TABLE_QUERY_SIZE } from '../../../common/constants'; import { buildQuery } from './query.dsl'; import { UncommonProcessBucket, @@ -25,15 +25,18 @@ export class ElasticsearchUncommonProcessesAdapter implements UncommonProcessesA public async getUncommonProcesses( request: FrameworkRequest, - options: RequestOptions + options: RequestOptionsPaginated ): Promise { + if (options.pagination && options.pagination.querySize >= DEFAULT_MAX_TABLE_QUERY_SIZE) { + throw new Error(`No query size above ${DEFAULT_MAX_TABLE_QUERY_SIZE}`); + } const dsl = buildQuery(options); const response = await this.framework.callWithRequest( request, 'search', dsl ); - const { cursor, limit } = options.pagination; + const { activePage, cursorStart, fakePossibleCount, querySize } = options.pagination; const totalCount = getOr(0, 'aggregations.process_count.value', response); const buckets = getOr([], 'aggregations.group_by_process.buckets', response); const hits = getHits(buckets); @@ -41,23 +44,22 @@ export class ElasticsearchUncommonProcessesAdapter implements UncommonProcessesA const uncommonProcessesEdges = hits.map(hit => formatUncommonProcessesData(options.fields, hit, { ...processFieldsMap, ...userFieldsMap }) ); - const hasNextPage = uncommonProcessesEdges.length === limit + 1; - const beginning = cursor != null ? parseInt(cursor!, 10) : 0; - const edges = uncommonProcessesEdges.splice(beginning, limit - beginning); + + const fakeTotalCount = fakePossibleCount <= totalCount ? fakePossibleCount : totalCount; + const edges = uncommonProcessesEdges.splice(cursorStart, querySize - cursorStart); const inspect = { dsl: [inspectStringifyObject(dsl)], response: [inspectStringifyObject(response)], }; + const showMorePagesIndicator = totalCount > fakeTotalCount; return { edges, inspect, pageInfo: { - hasNextPage, - endCursor: { - value: String(limit), - tiebreaker: null, - }, + activePage: activePage ? activePage : 0, + fakeTotalCount, + showMorePagesIndicator, }, totalCount, }; diff --git a/x-pack/legacy/plugins/siem/server/lib/uncommon_processes/index.ts b/x-pack/legacy/plugins/siem/server/lib/uncommon_processes/index.ts index 17083414d245c..d9f6a5966836f 100644 --- a/x-pack/legacy/plugins/siem/server/lib/uncommon_processes/index.ts +++ b/x-pack/legacy/plugins/siem/server/lib/uncommon_processes/index.ts @@ -5,7 +5,7 @@ */ import { UncommonProcessesData } from '../../graphql/types'; -import { FrameworkRequest, RequestOptions } from '../framework'; +import { FrameworkRequest, RequestOptionsPaginated } from '../framework'; export * from './elasticsearch_adapter'; import { UncommonProcessesAdapter } from './types'; @@ -14,7 +14,7 @@ export class UncommonProcesses { public async getUncommonProcesses( req: FrameworkRequest, - options: RequestOptions + options: RequestOptionsPaginated ): Promise { return await this.adapter.getUncommonProcesses(req, options); } diff --git a/x-pack/legacy/plugins/siem/server/lib/uncommon_processes/query.dsl.ts b/x-pack/legacy/plugins/siem/server/lib/uncommon_processes/query.dsl.ts index 2f83c839d80cb..e4b6bb8c6596b 100644 --- a/x-pack/legacy/plugins/siem/server/lib/uncommon_processes/query.dsl.ts +++ b/x-pack/legacy/plugins/siem/server/lib/uncommon_processes/query.dsl.ts @@ -7,18 +7,18 @@ import { createQueryFilterClauses } from '../../utils/build_query'; import { reduceFields } from '../../utils/build_query/reduce_fields'; import { hostFieldsMap, processFieldsMap, userFieldsMap } from '../ecs_fields'; -import { RequestOptions } from '../framework'; +import { RequestOptionsPaginated } from '../framework'; export const buildQuery = ({ + defaultIndex, fields, filterQuery, - timerange: { from, to }, - defaultIndex, - pagination: { limit }, + pagination: { querySize }, sourceConfiguration: { fields: { timestamp }, }, -}: RequestOptions) => { + timerange: { from, to }, +}: RequestOptionsPaginated) => { const processUserFields = reduceFields(fields, { ...processFieldsMap, ...userFieldsMap }); const hostFields = reduceFields(fields, hostFieldsMap); const filter = [ @@ -50,7 +50,7 @@ export const buildQuery = ({ ...agg, group_by_process: { terms: { - size: limit + 1, + size: querySize, field: 'process.name', order: [ { diff --git a/x-pack/legacy/plugins/siem/server/lib/uncommon_processes/types.ts b/x-pack/legacy/plugins/siem/server/lib/uncommon_processes/types.ts index 2ebaadc17b1f5..dc60de5963a18 100644 --- a/x-pack/legacy/plugins/siem/server/lib/uncommon_processes/types.ts +++ b/x-pack/legacy/plugins/siem/server/lib/uncommon_processes/types.ts @@ -5,13 +5,13 @@ */ import { ProcessEcsFields, UncommonProcessesData } from '../../graphql/types'; -import { FrameworkRequest, RequestOptions } from '../framework'; +import { FrameworkRequest, RequestOptionsPaginated } from '../framework'; import { Hit, Hits, HostHits, SearchHit, TotalHit } from '../types'; export interface UncommonProcessesAdapter { getUncommonProcesses( req: FrameworkRequest, - options: RequestOptions + options: RequestOptionsPaginated ): Promise; } diff --git a/x-pack/test/api_integration/apis/siem/domains.ts b/x-pack/test/api_integration/apis/siem/domains.ts index 959d95e16188c..571f2685cf38d 100644 --- a/x-pack/test/api_integration/apis/siem/domains.ts +++ b/x-pack/test/api_integration/apis/siem/domains.ts @@ -43,8 +43,10 @@ const domainsTests: KbnTestProvider = ({ getService }) => { flowTarget: FlowTarget.source, sort: { field: DomainsFields.bytes, direction: Direction.desc }, pagination: { - limit: 10, - cursor: null, + activePage: 0, + cursorStart: 0, + fakePossibleCount: 30, + querySize: 10, }, defaultIndex: ['auditbeat-*', 'filebeat-*', 'packetbeat-*', 'winlogbeat-*'], inspect: false, @@ -78,8 +80,10 @@ const domainsTests: KbnTestProvider = ({ getService }) => { flowTarget: FlowTarget.source, sort: { field: DomainsFields.bytes, direction: Direction.desc }, pagination: { - limit: 10, - cursor: null, + activePage: 0, + cursorStart: 0, + fakePossibleCount: 30, + querySize: 10, }, defaultIndex: ['auditbeat-*', 'filebeat-*', 'packetbeat-*', 'winlogbeat-*'], inspect: false, @@ -113,8 +117,10 @@ const domainsTests: KbnTestProvider = ({ getService }) => { flowTarget: FlowTarget.destination, sort: { field: DomainsFields.bytes, direction: Direction.desc }, pagination: { - limit: 10, - cursor: null, + activePage: 0, + cursorStart: 0, + fakePossibleCount: 30, + querySize: 10, }, defaultIndex: ['auditbeat-*', 'filebeat-*', 'packetbeat-*', 'winlogbeat-*'], inspect: false, @@ -127,7 +133,7 @@ const domainsTests: KbnTestProvider = ({ getService }) => { expect(domains.edges.map(i => i.node.destination!.domainName).join(',')).to.be( 'samsungtv-kitchen.iot.sr.local.crowbird.com,12s3.lvlt.dash.row.aiv-cdn.net,151.205.0.17,151.205.0.19,151.205.0.21,151.205.0.23,15s3.lvlt.dash.row.aiv-cdn.net,api-global.netflix.com,d25xi40x97liuc.cloudfront.net,d2lkq7nlcrdi7q.cloudfront.net' ); - expect(domains.pageInfo.endCursor!.value).to.equal('10'); + expect(domains.pageInfo.fakeTotalCount).to.equal(12); }); }); }); diff --git a/x-pack/test/api_integration/apis/siem/events.ts b/x-pack/test/api_integration/apis/siem/events.ts index f3d7aecfacf73..9a4084a66d1c6 100644 --- a/x-pack/test/api_integration/apis/siem/events.ts +++ b/x-pack/test/api_integration/apis/siem/events.ts @@ -23,7 +23,6 @@ const TO = new Date('3000-01-01T00:00:00.000Z').valueOf(); const HOST_NAME = 'suricata-sensor-amsterdam'; const TOTAL_COUNT = 1751; const EDGE_LENGTH = 2; -const CURSOR_ID = '1550608953561'; const eventsTests: KbnTestProvider = ({ getService }) => { const esArchiver = getService('esArchiver'); @@ -45,9 +44,10 @@ const eventsTests: KbnTestProvider = ({ getService }) => { from: FROM, }, pagination: { - limit: 2, - cursor: null, - tiebreaker: null, + activePage: 0, + cursorStart: 0, + fakePossibleCount: 3, + querySize: 2, }, sortField: { sortFieldId: 'timestamp', @@ -61,7 +61,7 @@ const eventsTests: KbnTestProvider = ({ getService }) => { const events = resp.data.source.Events; expect(events.edges.length).to.be(EDGE_LENGTH); expect(events.totalCount).to.be(TOTAL_COUNT); - expect(events.pageInfo.endCursor!.value).to.equal(CURSOR_ID); + expect(events.pageInfo.fakeTotalCount).to.equal(3); }); }); @@ -77,9 +77,10 @@ const eventsTests: KbnTestProvider = ({ getService }) => { from: FROM, }, pagination: { - limit: 2, - cursor: CURSOR_ID, - tiebreaker: '193', + activePage: 1, + cursorStart: 2, + fakePossibleCount: 10, + querySize: 4, }, sortField: { sortFieldId: 'timestamp', @@ -109,9 +110,10 @@ const eventsTests: KbnTestProvider = ({ getService }) => { from: FROM, }, pagination: { - limit: 2, - cursor: CURSOR_ID, - tiebreaker: '193', + activePage: 1, + cursorStart: 2, + fakePossibleCount: 10, + querySize: 4, }, sortField: { sortFieldId: 'timestamp', diff --git a/x-pack/test/api_integration/apis/siem/hosts.ts b/x-pack/test/api_integration/apis/siem/hosts.ts index 42a5fc5bab43f..95f05516f0aa0 100644 --- a/x-pack/test/api_integration/apis/siem/hosts.ts +++ b/x-pack/test/api_integration/apis/siem/hosts.ts @@ -52,8 +52,10 @@ const hostsTests: KbnTestProvider = ({ getService }) => { direction: Direction.asc, }, pagination: { - limit: 1, - cursor: null, + activePage: 0, + cursorStart: 0, + fakePossibleCount: 3, + querySize: 1, }, inspect: false, }, @@ -62,7 +64,7 @@ const hostsTests: KbnTestProvider = ({ getService }) => { const hosts = resp.data.source.Hosts; expect(hosts.edges.length).to.be(EDGE_LENGTH); expect(hosts.totalCount).to.be(TOTAL_COUNT); - expect(hosts.pageInfo.endCursor!.value).to.equal('1'); + expect(hosts.pageInfo.fakeTotalCount).to.equal(3); }); }); @@ -83,8 +85,10 @@ const hostsTests: KbnTestProvider = ({ getService }) => { }, defaultIndex: ['auditbeat-*', 'filebeat-*', 'packetbeat-*', 'winlogbeat-*'], pagination: { - limit: 2, - cursor: '1', + activePage: 2, + cursorStart: 1, + fakePossibleCount: 5, + querySize: 2, }, inspect: false, }, diff --git a/x-pack/test/api_integration/apis/siem/network_dns.ts b/x-pack/test/api_integration/apis/siem/network_dns.ts index 6055ee652dd63..1851c23aa3492 100644 --- a/x-pack/test/api_integration/apis/siem/network_dns.ts +++ b/x-pack/test/api_integration/apis/siem/network_dns.ts @@ -38,8 +38,10 @@ const networkDnsTests: KbnTestProvider = ({ getService }) => { isPtrIncluded: false, sort: { field: NetworkDnsFields.uniqueDomains, direction: Direction.asc }, pagination: { - limit: 10, - cursor: null, + activePage: 0, + cursorStart: 0, + fakePossibleCount: 30, + querySize: 10, }, defaultIndex: ['auditbeat-*', 'filebeat-*', 'packetbeat-*', 'winlogbeat-*'], inspect: false, @@ -50,9 +52,9 @@ const networkDnsTests: KbnTestProvider = ({ getService }) => { expect(networkDns.edges.length).to.be(10); expect(networkDns.totalCount).to.be(44); expect(networkDns.edges.map(i => i.node.dnsName).join(',')).to.be( - 'aaplimg.com,adgrx.com,akadns.net,akamaiedge.net,amazonaws.com,cbsistatic.com,cdn-apple.com,connman.net,d1oxlq5h9kq8q5.cloudfront.net,d3epxf4t8a32oh.cloudfront.net' + 'aaplimg.com,adgrx.com,akadns.net,akamaiedge.net,amazonaws.com,cbsistatic.com,cdn-apple.com,connman.net,crowbird.com,d1oxlq5h9kq8q5.cloudfront.net' ); - expect(networkDns.pageInfo.endCursor!.value).to.equal('10'); + expect(networkDns.pageInfo.fakeTotalCount).to.equal(30); }); }); @@ -70,8 +72,10 @@ const networkDnsTests: KbnTestProvider = ({ getService }) => { isPtrIncluded: false, sort: { field: NetworkDnsFields.uniqueDomains, direction: Direction.desc }, pagination: { - limit: 10, - cursor: null, + activePage: 0, + cursorStart: 0, + fakePossibleCount: 30, + querySize: 10, }, defaultIndex: ['auditbeat-*', 'filebeat-*', 'packetbeat-*', 'winlogbeat-*'], inspect: false, @@ -84,7 +88,7 @@ const networkDnsTests: KbnTestProvider = ({ getService }) => { expect(networkDns.edges.map(i => i.node.dnsName).join(',')).to.be( 'nflxvideo.net,apple.com,netflix.com,samsungcloudsolution.com,samsungqbe.com,samsungelectronics.com,internetat.tv,samsungcloudsolution.net,samsungosp.com,cbsnews.com' ); - expect(networkDns.pageInfo.endCursor!.value).to.equal('10'); + expect(networkDns.pageInfo.fakeTotalCount).to.equal(30); }); }); }); diff --git a/x-pack/test/api_integration/apis/siem/network_top_n_flow.ts b/x-pack/test/api_integration/apis/siem/network_top_n_flow.ts index cd0c8323c1a6d..eedcd986b0899 100644 --- a/x-pack/test/api_integration/apis/siem/network_top_n_flow.ts +++ b/x-pack/test/api_integration/apis/siem/network_top_n_flow.ts @@ -43,8 +43,10 @@ const networkTopNFlowTests: KbnTestProvider = ({ getService }) => { sort: { field: NetworkTopNFlowFields.bytes, direction: Direction.desc }, flowDirection: FlowDirection.uniDirectional, pagination: { - limit: 10, - cursor: null, + activePage: 0, + cursorStart: 0, + fakePossibleCount: 50, + querySize: 10, }, defaultIndex: ['auditbeat-*', 'filebeat-*', 'packetbeat-*', 'winlogbeat-*'], inspect: false, @@ -58,7 +60,7 @@ const networkTopNFlowTests: KbnTestProvider = ({ getService }) => { '8.250.107.245,10.100.7.198,8.248.211.247,8.253.157.240,151.205.0.21,8.254.254.117,54.239.220.40,151.205.0.23,8.248.223.246,151.205.0.17' ); expect(networkTopNFlow.edges[0].node.destination).to.be(null); - expect(networkTopNFlow.pageInfo.endCursor!.value).to.equal('10'); + expect(networkTopNFlow.pageInfo.fakeTotalCount).to.equal(50); }); }); @@ -77,8 +79,10 @@ const networkTopNFlowTests: KbnTestProvider = ({ getService }) => { sort: { field: NetworkTopNFlowFields.bytes, direction: Direction.asc }, flowDirection: FlowDirection.uniDirectional, pagination: { - limit: 10, - cursor: null, + activePage: 0, + cursorStart: 0, + fakePossibleCount: 50, + querySize: 10, }, defaultIndex: ['auditbeat-*', 'filebeat-*', 'packetbeat-*', 'winlogbeat-*'], inspect: false, @@ -92,7 +96,7 @@ const networkTopNFlowTests: KbnTestProvider = ({ getService }) => { '10.100.4.1,54.239.219.220,54.239.219.228,54.239.220.94,54.239.220.138,54.239.220.184,54.239.220.186,54.239.221.253,35.167.45.163,52.5.171.20' ); expect(networkTopNFlow.edges[0].node.destination).to.be(null); - expect(networkTopNFlow.pageInfo.endCursor!.value).to.equal('10'); + expect(networkTopNFlow.pageInfo.fakeTotalCount).to.equal(50); }); }); @@ -111,8 +115,10 @@ const networkTopNFlowTests: KbnTestProvider = ({ getService }) => { flowTarget: FlowTarget.source, flowDirection: FlowDirection.biDirectional, pagination: { - limit: 10, - cursor: null, + activePage: 0, + cursorStart: 0, + fakePossibleCount: 10, + querySize: 10, }, defaultIndex: ['auditbeat-*', 'filebeat-*', 'packetbeat-*', 'winlogbeat-*'], inspect: false, @@ -123,7 +129,7 @@ const networkTopNFlowTests: KbnTestProvider = ({ getService }) => { expect(networkTopNFlow.edges.length).to.be(EDGE_LENGTH); expect(networkTopNFlow.totalCount).to.be(10); expect(networkTopNFlow.edges[0].node.destination).to.be(null); - expect(networkTopNFlow.pageInfo.endCursor!.value).to.equal('10'); + expect(networkTopNFlow.pageInfo.fakeTotalCount).to.equal(10); }); }); @@ -142,8 +148,10 @@ const networkTopNFlowTests: KbnTestProvider = ({ getService }) => { flowTarget: FlowTarget.destination, flowDirection: FlowDirection.uniDirectional, pagination: { - limit: 10, - cursor: null, + activePage: 0, + cursorStart: 0, + fakePossibleCount: 50, + querySize: 10, }, defaultIndex: ['auditbeat-*', 'filebeat-*', 'packetbeat-*', 'winlogbeat-*'], inspect: false, @@ -154,7 +162,7 @@ const networkTopNFlowTests: KbnTestProvider = ({ getService }) => { expect(networkTopNFlow.edges.length).to.be(EDGE_LENGTH); expect(networkTopNFlow.totalCount).to.be(144); expect(networkTopNFlow.edges[0].node.source).to.be(null); - expect(networkTopNFlow.pageInfo.endCursor!.value).to.equal('10'); + expect(networkTopNFlow.pageInfo.fakeTotalCount).to.equal(50); }); }); @@ -173,8 +181,10 @@ const networkTopNFlowTests: KbnTestProvider = ({ getService }) => { flowTarget: FlowTarget.destination, flowDirection: FlowDirection.biDirectional, pagination: { - limit: 10, - cursor: null, + activePage: 0, + cursorStart: 0, + fakePossibleCount: 50, + querySize: 10, }, defaultIndex: ['auditbeat-*', 'filebeat-*', 'packetbeat-*', 'winlogbeat-*'], inspect: false, @@ -185,7 +195,7 @@ const networkTopNFlowTests: KbnTestProvider = ({ getService }) => { expect(networkTopNFlow.edges.length).to.be(EDGE_LENGTH); expect(networkTopNFlow.totalCount).to.be(89); expect(networkTopNFlow.edges[0].node.source).to.be(null); - expect(networkTopNFlow.pageInfo.endCursor!.value).to.equal('10'); + expect(networkTopNFlow.pageInfo.fakeTotalCount).to.equal(50); }); }); @@ -204,8 +214,10 @@ const networkTopNFlowTests: KbnTestProvider = ({ getService }) => { flowTarget: FlowTarget.source, flowDirection: FlowDirection.uniDirectional, pagination: { - limit: 20, - cursor: 10, + activePage: 1, + cursorStart: 10, + fakePossibleCount: 50, + querySize: 20, }, defaultIndex: ['auditbeat-*', 'filebeat-*', 'packetbeat-*', 'winlogbeat-*'], inspect: false, @@ -243,8 +255,10 @@ const networkTopNFlowTests: KbnTestProvider = ({ getService }) => { flowTarget: FlowTarget.client, flowDirection: FlowDirection.biDirectional, pagination: { - limit: 10, - cursor: null, + activePage: 0, + cursorStart: 0, + fakePossibleCount: 50, + querySize: 10, }, defaultIndex: ['auditbeat-*', 'filebeat-*', 'packetbeat-*', 'winlogbeat-*'], inspect: false, @@ -255,7 +269,7 @@ const networkTopNFlowTests: KbnTestProvider = ({ getService }) => { expect(networkTopNFlow.edges.length).to.be(1); expect(networkTopNFlow.totalCount).to.be(1); expect(networkTopNFlow.edges[0].node.server).to.be(null); - expect(networkTopNFlow.pageInfo.endCursor!.value).to.equal('10'); + expect(networkTopNFlow.pageInfo.fakeTotalCount).to.equal(1); }); }); @@ -274,8 +288,10 @@ const networkTopNFlowTests: KbnTestProvider = ({ getService }) => { flowTarget: FlowTarget.server, flowDirection: FlowDirection.biDirectional, pagination: { - limit: 10, - cursor: null, + activePage: 0, + cursorStart: 0, + fakePossibleCount: 50, + querySize: 10, }, defaultIndex: ['auditbeat-*', 'filebeat-*', 'packetbeat-*', 'winlogbeat-*'], inspect: false, @@ -286,7 +302,7 @@ const networkTopNFlowTests: KbnTestProvider = ({ getService }) => { expect(networkTopNFlow.edges.length).to.be(1); expect(networkTopNFlow.totalCount).to.be(1); expect(networkTopNFlow.edges[0].node.client).to.be(null); - expect(networkTopNFlow.pageInfo.endCursor!.value).to.equal('10'); + expect(networkTopNFlow.pageInfo.fakeTotalCount).to.equal(1); }); }); }); diff --git a/x-pack/test/api_integration/apis/siem/tls.ts b/x-pack/test/api_integration/apis/siem/tls.ts index 5f8a1f5d3734a..bd7a9dfd28bae 100644 --- a/x-pack/test/api_integration/apis/siem/tls.ts +++ b/x-pack/test/api_integration/apis/siem/tls.ts @@ -52,8 +52,10 @@ const tlsTests: KbnTestProvider = ({ getService }) => { flowTarget: FlowTarget.source, sort: { field: TlsFields._id, direction: Direction.desc }, pagination: { - limit: 10, - cursor: null, + activePage: 0, + cursorStart: 0, + fakePossibleCount: 30, + querySize: 10, }, defaultIndex: ['auditbeat-*', 'filebeat-*', 'packetbeat-*', 'winlogbeat-*'], inspect: false, @@ -82,8 +84,10 @@ const tlsTests: KbnTestProvider = ({ getService }) => { flowTarget: FlowTarget.destination, sort: { field: TlsFields._id, direction: Direction.desc }, pagination: { - limit: 10, - cursor: null, + activePage: 0, + cursorStart: 0, + fakePossibleCount: 30, + querySize: 10, }, defaultIndex: ['auditbeat-*', 'filebeat-*', 'packetbeat-*', 'winlogbeat-*'], inspect: false, diff --git a/x-pack/test/api_integration/apis/siem/uncommon_processes.ts b/x-pack/test/api_integration/apis/siem/uncommon_processes.ts index 648974b331de2..0e1ac30634895 100644 --- a/x-pack/test/api_integration/apis/siem/uncommon_processes.ts +++ b/x-pack/test/api_integration/apis/siem/uncommon_processes.ts @@ -39,7 +39,10 @@ const uncommonProcessesTests: KbnTestProvider = ({ getService }) => { from: FROM, }, pagination: { - limit: 1, + activePage: 0, + cursorStart: 0, + fakePossibleCount: 3, + querySize: 1, }, defaultIndex: ['auditbeat-*', 'filebeat-*', 'packetbeat-*', 'winlogbeat-*'], inspect: false, @@ -63,7 +66,10 @@ const uncommonProcessesTests: KbnTestProvider = ({ getService }) => { from: FROM, }, pagination: { - limit: 2, + activePage: 0, + cursorStart: 0, + fakePossibleCount: 3, + querySize: 2, }, defaultIndex: ['auditbeat-*', 'filebeat-*', 'packetbeat-*', 'winlogbeat-*'], inspect: false, @@ -87,7 +93,10 @@ const uncommonProcessesTests: KbnTestProvider = ({ getService }) => { from: FROM, }, pagination: { - limit: 1, + activePage: 0, + cursorStart: 0, + fakePossibleCount: 3, + querySize: 1, }, defaultIndex: ['auditbeat-*', 'filebeat-*', 'packetbeat-*', 'winlogbeat-*'], inspect: false, @@ -111,7 +120,10 @@ const uncommonProcessesTests: KbnTestProvider = ({ getService }) => { from: FROM, }, pagination: { - limit: 1, + activePage: 0, + cursorStart: 0, + fakePossibleCount: 3, + querySize: 1, }, defaultIndex: ['auditbeat-*', 'filebeat-*', 'packetbeat-*', 'winlogbeat-*'], inspect: false, diff --git a/x-pack/test/api_integration/apis/siem/users.ts b/x-pack/test/api_integration/apis/siem/users.ts index 7b26152e8e4d2..25ff30c5803a9 100644 --- a/x-pack/test/api_integration/apis/siem/users.ts +++ b/x-pack/test/api_integration/apis/siem/users.ts @@ -42,8 +42,10 @@ const usersTests: KbnTestProvider = ({ getService }) => { flowTarget: FlowTarget.destination, sort: { field: UsersFields.name, direction: Direction.asc }, pagination: { - limit: 10, - cursor: null, + activePage: 0, + cursorStart: 0, + fakePossibleCount: 30, + querySize: 10, }, inspect: false, },