BNSOnWebPlugin/DigitalDataBNSPlugin/DigitalDataController.vb
2023-06-15 09:52:03 +02:00

314 lines
12 KiB
VB.net

Imports DigitalData.Modules.Database
Imports DigitalData.Modules.Logging
Imports System.Collections.Generic
Imports System.Data
Imports System.Net
Imports System.Net.Http
Imports System.Net.Http.Headers
Imports System.Reflection
Imports System.Threading
Imports System.Threading.Tasks
Imports System.Web.Http
Imports System.Web.Http.Controllers
Imports System.Xml
Imports Windream.WebService.Documents
Imports Windream.WebService.WebAPI.PlugIns
Imports WINDREAMLib
Imports WMCNNCTDLLLib
Imports WMOBRWSLib
Namespace Controllers
Public Class DigitalDataController
Inherits PlugInBaseController
Private ReadOnly _routesSettings As IEnumerable(Of RouteSettings)
Private ReadOnly _docController As IDocumentsController
Private _session As IWMSession6
Private ReadOnly _logConfig As LogConfig
Private ReadOnly _logger As Logger
Private ReadOnly _database As MSSQLServer
''' <summary>
''' Gets the routes settings for the controller.
''' This property will automatically be called from the windream Web Service - WebAPI framework.
''' </summary>
''' <value>
''' The routes settings of the controller.
''' </value>
Public Overrides ReadOnly Property RoutesSettings As IEnumerable(Of RouteSettings)
Get
Return _routesSettings
End Get
End Property
Public Overrides Function ExecuteAsync(controllerContext As HttpControllerContext, cancellationToken As CancellationToken) As Task(Of HttpResponseMessage)
Return MyBase.ExecuteAsync(controllerContext, cancellationToken)
End Function
''' <summary>
''' Initializes a new instance of the <see cref="DigitalDataController"/> class.
''' </summary>
Sub New()
MyBase.New()
Dim routesSettings As New List(Of RouteSettings) From {
New RouteSettings("DigitalDataController", "DigitalData/{action}/{id}", New With {
.id = RouteParameter.Optional, .controller = "DigitalData"
})
}
_routesSettings = routesSettings
Dim oLogPath = GetLogPath()
_logConfig = New LogConfig(LogPath:=LogConfig.PathType.CustomPath, oLogPath)
_logger = _logConfig.GetLogger()
'Dim config = New LoggingConfiguration()
'Dim fileTarget = New FileTarget() With {
' .Name = "BNSPlugin",
' .ArchiveEvery = FileArchivePeriod.Day,
' .FileName = "D:/ProgramFiles/DigitalData/SERVICES/WMWebServiceBNS/Log/${date:format=yyyy-MM-dd}-WMWebServiceBNS.txt",
' .Layout = "${longdate} || ${message}"
'}
'config.AddTarget("file", fileTarget)
'Dim rule = New LoggingRule("*", LogLevel.Debug, fileTarget)
'config.LoggingRules.Add(rule)
'LogManager.Configuration = config
'_logger = LogManager.GetLogger("DigitalDataController")
Dim oConnectionString = GetConnectionString()
_logger.Info($"[DATABASE] Verbindung zu {oConnectionString}")
_database = New MSSQLServer(_logConfig, oConnectionString)
If _database.DBInitialized = False Then
_logger.Info("[DATABASE] Die Verbindung zur Datenbank konnte nicht hergestellt werden.")
Else
_logger.Info("[DATABASE] Die Verbindung zur Datenbank wurde hergestellt.")
End If
_logger.Info("[INIT] Die Initialisierung wurde abgeschlossen.")
End Sub
Private Function GetPluginPath()
Dim s = Assembly.GetExecutingAssembly().CodeBase
s = New Uri(s).AbsolutePath
s = Uri.UnescapeDataString(s)
s = IO.Path.GetFullPath(s)
s = IO.Path.GetDirectoryName(s)
Return s
End Function
Private Function GetConfig() As XmlDocument
Dim path As String = GetPluginPath()
Dim configFile = path & "\config.xml"
If IO.File.Exists(configFile) Then
Dim Doc As New XmlDocument()
Doc.Load(configFile)
Return Doc
Else
_logger.Info($"[CONFIG] Konfigurations Datei {configFile} wurde NICHT gefunden!")
Return Nothing
End If
End Function
Private Function GetConnectionString() As String
Dim oConfig = GetConfig()
If oConfig IsNot Nothing Then
Dim connectionString As String = oConfig.DocumentElement.SelectSingleNode("/config/connectionString").InnerText
Return connectionString
Else
Return Nothing
End If
End Function
Private Function GetLogPath() As String
Dim oConfig = GetConfig()
If oConfig IsNot Nothing Then
Dim oLogPath As String = oConfig.DocumentElement.SelectSingleNode("/config/logPath").InnerText
Return oLogPath
Else
Return Nothing
End If
End Function
''' <summary>
''' A simple example of a http-get service method implementation.
''' </summary>
''' <param name="docId">windream Document-ID</param>
''' <param name="userId">windream User-ID</param>
''' <remarks>This method creates a nice greeting.</remarks>
<HttpGet>
Public Function BNSDownload(<FromUri> docId As Integer, <FromUri> userId As String) As HttpResponseMessage
Dim DT As DataTable
Dim Domain, Username, Password As String
_logger.Info($"[REQUEST] Anfrage von Benutzer-ID {userId} für Dokument-ID {docId}")
Try
DT = _database.GetDatatable($"SELECT DOMAIN, USERNAME, PW FROM TBDD_WEBSERVICE_USER_EX WHERE USERNAME_LINK = '{userId}'")
Catch ex As Exception
_logger.Info("[DATABASE] Fehler beim Zugriff auf die Datenbank ")
_logger.Info(ex.Message)
Return CreateResponseMessage(Request, HttpStatusCode.InternalServerError)
End Try
If DT.Rows.Count = 0 Then
_logger.Info($"[DATABASE] BenutzerID {userId} wurde nicht in der Datenbank gefunden.")
Return CreateResponseMessage(Request, $"Benutzer {userId} wurde nicht gefunden", HttpStatusCode.Unauthorized)
Else
Dim firstRow As DataRow = DT.Rows.Item(0)
Domain = firstRow.Item("DOMAIN")
Username = firstRow.Item("USERNAME")
Password = firstRow.Item("PW")
_logger.Info($"[DATABASE] BenutzerID {userId} wurde gefunden.")
End If
Dim loggedIn As Boolean = CreateSessionForUser(Username, Password, Domain)
If Not loggedIn Then
Return CreateResponseMessage(Request, $"Session für Benutzer {userId} konnte nicht aufgebaut werden. Weitere Informationen im Log", HttpStatusCode.BadRequest)
End If
Dim WMDoc As IWMObject7
Dim WMStream As IWMStream
Dim fileContent As Byte()
Try
WMDoc = _session.GetWMObjectById(WMEntity.WMEntityDocument, docId)
Catch ex As Exception
_logger.Info("[WINDREAM/GetWMObjectById] Ein Fehler beim Zugriff auf Windream ist aufgetreten ")
_logger.Info(ex.Message)
_logger.Info($"[WINDREAM/Session] Session für Benutzer {Username} wird geschlossen")
_session.Logout()
Return CreateResponseMessage(Request, "Document not found", HttpStatusCode.NotFound)
End Try
Try
WMStream = WMDoc.OpenStream("BinaryObject", WMObjectStreamOpenMode.WMObjectStreamOpenModeRead)
fileContent = WMStream.Read(WMStream.GetSize())
Catch ex As Exception
_logger.Info("[WINDREAM/OpenStream] Ein Fehler beim Zugriff auf Windream ist aufgetreten")
_logger.Info(ex.Message)
_logger.Info($"[WINDREAM/Session] Session für Benutzer {Username} wird geschlossen")
_session.Logout()
Return CreateResponseMessage(Request, HttpStatusCode.InternalServerError)
End Try
_logger.Info($"[WINDREAM/Session] Session für Benutzer {Username} wird geschlossen")
_session.Logout()
' Gibt die Datei zum Download zurück
Return CreateFileResponseMessage(fileContent, WMDoc.aName)
End Function
Private Function CreateFileResponseMessage(data As Byte(), filename As String) As HttpResponseMessage
_logger.Info($"[WINDREAM/Download] Datei {filename} wird für Download zur Verfügung gestellt")
Dim Res = New HttpResponseMessage()
Res.StatusCode = HttpStatusCode.OK
Res.Content = New ByteArrayContent(data)
Res.Content.Headers.ContentType = New MediaTypeHeaderValue("application/octet-stream")
Res.Content.Headers.ContentDisposition = New ContentDispositionHeaderValue("attachment") With {
.FileName = filename
}
Return Res
End Function
Private Function CreateSessionForUser(username As String, password As String, domain As String)
Dim WMServerBrowser As New ServerBrowser()
Dim DMSServer As String
Dim Connect As IWMConnect2
Dim Session As IWMSession6
Dim User As WMOTOOLLib.WMUserIdentity
Try
'' Get the current Windream Server
DMSServer = WMServerBrowser.GetCurrentServer()
Catch ex As Exception
_logger.Info($"[WINDREAM/ServerBrowser] DMS Server konnte nicht ausgelesen werden.")
_logger.Info(ex.Message)
Return False
End Try
Try
' Create a User Object for Session
User = New WMOTOOLLib.WMUserIdentity()
User.aDomain = domain
User.aPassword = password
User.aUserName = username
User.aServerName = DMSServer
Catch ex As Exception
_logger.Info($"[WINDREAM/User] User Objekt konnte nicht erstellt werden.")
_logger.Info(ex.Message)
Return False
End Try
_logger.Info("[WINDREAM/Session] Session wird aufgebaut")
_logger.Info($"[WINDREAM/Session] Username: {username}")
_logger.Info($"[WINDREAM/Session] Passwort: {password}")
_logger.Info($"[WINDREAM/Session] Domäne: {domain}")
_logger.Info($"[WINDREAM/Session] Windream Server: {DMSServer}")
Try
' Create Connect Object for Session
Connect = New WMConnect()
Connect.ModuleId = 9
Catch ex As Exception
_logger.Info($"[WINDREAM/Connect] Connect Objekt konnte nicht erstellt werden.")
_logger.Info(ex.Message)
Return False
End Try
Try
Session = Connect.Login(User)
_logger.Info($"[WINDREAM/Session] Session wurde aufgebaut")
If Session.aLoggedin Then
_session = Session
_logger.Info($"[WINDREAM/Session] Benutzer {username} ist eingeloggt")
Return True
Else
_logger.Info($"[WINDREAM/Session] Fehler beim Aufbau der Session. Benutzer {username} ist nicht eingeloggt!")
Return False
End If
Catch ex As Exception
_logger.Info($"[WINDREAM/Session] Fehler bei Login von Benutzer {username}!")
_logger.Info(ex.Message)
If Not IsNothing(Session) AndAlso Session.aLoggedin Then
_session = Session
_logger.Info($"[WINDREAM/Session] Benutzer {username} ist eingeloggt")
Return True
Else
_logger.Info($"[WINDREAM/Session] Fehler beim Aufbau der Session. Benutzer {username} ist nicht eingeloggt!")
_logger.Info(ex.Message)
Return False
End If
End Try
End Function
End Class
End Namespace