Jonathan Jenne 234eb6726e init
2018-01-08 12:08:21 +01:00

288 lines
12 KiB
VB.net

Imports System.Collections.Generic
Imports System.Net
Imports System.Net.Http
Imports System.Web.Http
Imports System.Web.Http.Description
Imports System.Data
Imports Windream.WebService.WebAPI.PlugIns
Imports Windream.WebService.Documents
Imports WMOBRWSLib
Imports WINDREAMLib
Imports WMCNNCTDLLLib
Imports DD_LIB_Standards.clsDatabase
Imports NLog
Imports NLog.Targets
Imports NLog.Config
Imports System.Reflection
Imports System.Xml
Imports System.Net.Http.Headers
Imports System.Threading
Imports System.Threading.Tasks
Imports System.Web.Http.Controllers
Namespace Controllers
Public Class DigitalDataController
Inherits PlugInBaseController
Private _routesSettings As IEnumerable(Of RouteSettings)
Private _docController As IDocumentsController
Private _session As IWMSession6
Private _logger As Logger
''' <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()
Dim routesSettings As List(Of RouteSettings) = New List(Of RouteSettings)()
routesSettings.Add(New RouteSettings("DigitalDataController", "DigitalData/{action}/{id}", New With {.id = RouteParameter.Optional, .controller = "DigitalData"}))
_routesSettings = routesSettings
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 connectionString = GetConnectionString()
_logger.Info($"[DATABASE] Verbindung zu {connectionString}")
Dim dbInit = Init(connectionString)
If dbInit = 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 GetConnectionString()
Dim path As String = GetPluginPath()
Dim configFile = path & "\config.xml"
If IO.File.Exists(configFile) Then
Dim Doc As XmlDocument = New XmlDocument()
Doc.Load(configFile)
Dim connectionString As String = Doc.DocumentElement.SelectSingleNode("/config/connectionString").InnerText
_logger.Info($"[CONFIG] Konfigurations Datei {configFile} wurde gefunden")
Return connectionString
Else
_logger.Info($"[CONFIG] Konfigurations Datei {configFile} wurde NICHT gefunden!")
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>
'<ResponseType(GetType(String))>
<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 = Return_Datatable($"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