Modules/GUIs.ZooFlow/Search/SearchLoader.vb
2022-06-14 13:38:13 +02:00

217 lines
9.0 KiB
VB.net

Imports System.IO
Imports System.Xml.Serialization
Imports DevExpress.Utils
Imports DevExpress.Utils.Svg
Imports DigitalData.GUIs.ZooFlow.Search.SearchToken
Imports DigitalData.Modules.Base
Imports DigitalData.Modules.Config
Imports DigitalData.Modules.Logging
Imports DigitalData.Modules.Language
Imports DigitalData.Modules.Database
Imports DigitalData.Modules.ZooFlow.State
Namespace Search
Public Class SearchLoader
Inherits BaseClass
Private ReadOnly Images As SvgImageCollection
Private ReadOnly ImageTable As List(Of ImageTableItem)
Private ReadOnly Serializer As XmlSerializer
Private ReadOnly Database As MSSQLServer
Private ReadOnly UserState As UserState
Public Sub New(pLogConfig As LogConfig, pDatabase As MSSQLServer, pUserState As UserState, pSvgImages As SvgImageCollection)
MyBase.New(pLogConfig)
Images = pSvgImages
ImageTable = GetImageTable(pSvgImages)
Database = pDatabase
UserState = pUserState
Serializer = New XmlSerializer(GetType(SavedSearch.CustomSearchSerializable))
End Sub
Public Sub CreateCustomSearch(pTitle As String, pDescription As String, pTokens As List(Of Token), pImage As String)
Dim oSearch As New SavedSearch.CustomSearch With {
.Name = pTitle,
.Description = pDescription,
.Tokens = pTokens,
.Image = Images.Item(pImage)
}
Try
Dim oBuffer As Byte() = SerializeSearch(oSearch)
Dim oBase64 = System.Convert.ToBase64String(oBuffer)
If Database.ExecuteNonQuery(
$"INSERT INTO TBIDB_SEARCH_DEFINITION (TITLE, DESCRIPTION, XML_VALUE, SYS_SEARCH, ADDED_WHO)
VALUES ('{pTitle}', '{pDescription}', '{oBase64}', 0, '{UserState.UserName}')"
) = True Then
Dim oSearchId = Database.GetScalarValue("SELECT MAX(GUID) FROM TBIDB_SEARCH_DEFINITION")
Database.ExecuteNonQuery(
$"INSERT INTO TBIDB_SEARCH_DEF_RELATIONS (SEARCH_ID, USR_ID, ADDED_WHO)
VALUES ({oSearchId}, {UserState.UserId}, '{UserState.UserName}')")
End If
Catch ex As Exception
Logger.Warn("Custom Search could not be saved!")
Logger.Error(ex)
End Try
End Sub
Public Function LoadSearches() As List(Of SavedSearch.SavedSearch)
Dim oSearches As New List(Of SavedSearch.SavedSearch)
Dim oCustomSearches = LoadCustomSearches()
Dim oPredefinedSearches = LoadPredefinedSearches()
Return oSearches.
Concat(oCustomSearches).
Concat(oPredefinedSearches).
ToList()
End Function
Public Function LoadCustomSearches() As List(Of SavedSearch.SavedSearch)
Dim oSearches As New List(Of SavedSearch.SavedSearch)
Dim oSQL As String = $"
SELECT DEF.*
FROM [TBIDB_SEARCH_DEFINITION] DEF
JOIN [TBIDB_SEARCH_DEF_RELATIONS] REL ON REL.SEARCH_ID = DEF.GUID
WHERE REL.USR_ID = {UserState.UserId}
"
Dim oTable = Database.GetDatatable(oSQL)
For Each oRow As DataRow In oTable.Rows
Dim oBase64 = oRow.Item("XML_VALUE")
Dim oBuffer = System.Convert.FromBase64String(oBase64)
Dim oSearch = DeserializeSearch(oBuffer)
oSearches.Add(oSearch)
Next
Return oSearches
End Function
Public Function LoadPredefinedSearches() As List(Of SavedSearch.SavedSearch)
Return New List(Of SavedSearch.SavedSearch) From {
New SavedSearch.PredefinedDateSearch() With {
.Name = "Heute",
.Description = "Dokumente, die heute abgelegt wurden",
.DateConstraint = SearchRunner.DateConstraint.Today,
.Image = Images.Item("today")
},
New SavedSearch.PredefinedDateSearch() With {
.Name = "Gestern",
.Description = "Dokumente, die gestern abgelegt wurden",
.DateConstraint = SearchRunner.DateConstraint.Yesterday,
.Image = Images.Item("yesterday")
},
New SavedSearch.PredefinedDateSearch() With {
.Name = "Letzte 7 Tage",
.Description = "Dokumente, die in den letzten 7 Tagen abgelegt wurden",
.DateConstraint = SearchRunner.DateConstraint.Last7Days,
.Image = Images.Item("week")
},
New SavedSearch.PredefinedDateSearch() With {
.Name = "Dieser Monat",
.Description = "Dokumente, die in diesem Monat abgelegt wurden",
.DateConstraint = SearchRunner.DateConstraint.CurrentMonth,
.Image = Images.Item("month")
},
New SavedSearch.PredefinedDateSearch() With {
.Name = "Letzter Monat",
.Description = "Dokumente, die im letzten Monat abgelegt wurden",
.DateConstraint = SearchRunner.DateConstraint.LastMonth,
.Image = Images.Item("month")
},
New SavedSearch.PredefinedDateSearch() With {
.Name = "Dieses Jahr",
.Description = "Dokumente, die in diesem Jahr abgelegt wurden",
.DateConstraint = SearchRunner.DateConstraint.CurrentYear,
.Image = Images.Item("year")
},
New SavedSearch.PredefinedDateSearch() With {
.Name = "Letztes Jahr",
.Description = "Dokumente, die im letzten Jahr abgelegt wurden",
.DateConstraint = SearchRunner.DateConstraint.LastYear,
.Image = Images.Item("year")
}
}
End Function
Private Function ConvertSvgImageToString(pImage As SvgImage) As String
Dim oItem = ImageTable.Where(Function(item) item.Image.Equals(pImage)).FirstOrDefault()
If oItem Is Nothing Then
Return Nothing
End If
Return oItem.Name
End Function
Private Function ConvertStringToImageName(pName As String) As SvgImage
Dim oItem = ImageTable.Where(Function(item) item.Name.Equals(pName)).FirstOrDefault()
If oItem Is Nothing Then
Return Nothing
End If
Return oItem.Image
End Function
Private Function GetImageTable(pImageCollection As SvgImageCollection) As List(Of ImageTableItem)
Dim oList As New List(Of ImageTableItem)
For Each oImageName In pImageCollection.Keys
Dim oSvgImage = pImageCollection.Item(oImageName)
oList.Add(New ImageTableItem(oImageName, oSvgImage))
Next
Return oList
End Function
Private Function SerializeSearch(pSearch As SavedSearch.CustomSearch) As Byte()
Try
Dim oSearch As New SavedSearch.CustomSearchSerializable With {
.Name = pSearch.Name,
.Description = pSearch.Description,
.GroupText = pSearch.GroupText,
.Tokens = pSearch.Tokens,
.ImageName = ConvertSvgImageToString(pSearch.Image)
}
Using oStream As New MemoryStream
Serializer.Serialize(oStream, oSearch)
Return oStream.ToArray()
End Using
Catch ex As Exception
Logger.Error(ex)
Return Nothing
End Try
End Function
Private Function DeserializeSearch(pBytes As Byte()) As SavedSearch.CustomSearch
Try
Using oStream As New MemoryStream(pBytes)
Dim oSearch As SavedSearch.CustomSearchSerializable = Serializer.Deserialize(oStream)
Return New SavedSearch.CustomSearch With {
.Name = oSearch.Name,
.Description = oSearch.Description,
.GroupText = oSearch.GroupText,
.Tokens = oSearch.Tokens,
.Image = ConvertStringToImageName(oSearch.ImageName)
}
End Using
Catch ex As Exception
Logger.Error(ex)
Return Nothing
End Try
End Function
Private Class ImageTableItem
Public ReadOnly Name As String
Public ReadOnly Image As SvgImage
Public Sub New(pName As String, pImage As SvgImage)
Name = pName
Image = pImage
End Sub
End Class
End Class
End Namespace