using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Text; using System.Web.Services; using BeWo.Data.Access; using BeWo.Service.ServiceContracts; using BeWo.Service.ServiceImplementations; using BeWoPlanerAndroid.Service; using BS.Shared; using BS.Shared.Core; using BS.Shared.DataContracts.Compact; using BS.Shared.Extensions; using Newtonsoft.Json; using BeWo.Data.Entities; namespace BeWoPlanerAndroid { [WebService(Namespace = "bliblablubb.org/")] [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] [System.ComponentModel.ToolboxItem(false)] // Wenn der Aufruf dieses Webdiensts aus einem Skript mithilfe von ASP.NET AJAX zulässig sein soll, heben Sie die Kommentarmarkierung für die folgende Zeile auf. // [System.Web.Script.Services.ScriptService] public class AndroidSoapService : WebService { protected readonly ICustomerService CustomerService = new MobileSessionFacade().CustomerService; protected readonly IUserService UserService = new MobileSessionFacade().UserService; protected readonly IEmployeeService EmployeeService = new MobileSessionFacade().EmployeeService; public static string Tenant; [WebMethod(EnableSession = true)] public string Login(string pTenant, string pUsername, string pPassword) { Log.Info("Login. Beginne mit Login"); if(!SoapHibernateSessionManager.TenantExists(pTenant)) { Log.Info("Login. Angegebene Kundennummer ist falsch (" + pTenant + ")"); return LoginFailReason.WrongTenant.ToString(); } MobileSessionFacade.Tenant = pTenant; Tenant = pTenant; SoapHibernateSessionManager.ConfigureHibernateSession(); var s = new UserServiceImp(); if (s.IsUserValid(pUsername, pPassword, null, "SOAPClient", false) == UserValidationResult.UserValid) { Log.Info("Login. Beginne mit Login"); var user = DAOFactory.UserDAO.FindUserByLoginName(pUsername); if (user == null || !DAOFactory.SearchDAO.CheckIfEmployeeIsAllowedToChat(user.Employee.Person.Oid.Value)) { Log.Info("Login. Der Benutzer existiert nicht oder er hat nicht das Recht zu chatten. (LoginFailReason.Unauthorized)"); return LoginFailReason.Unauthorized.ToString(); } if (!DAOFactory.UserDAO.CheckPassword(user, pPassword)) { Log.Info("Login. Benutzername und/oder Passwort inkorrekt (LoginFailReason.WrongCredentials)"); return LoginFailReason.WrongCredentials.ToString(); } MobileSessionFacade.LoggedInUser = user; Log.Info("Login. Der Login war erfolgreich"); return user.Employee.Oid.Value + ";" + user.Employee.Person.FirstNameLastName + ";" + user.LoginName + ";" + user.Employee.Person.Oid.Value; } Log.Info("Login. Benutzername und/oder Passwort inkorrekt (LoginFailReason.Unknown)"); return LoginFailReason.Unknown.ToString(); } [WebMethod(EnableSession = true)] public string LoadImageForEmployee(long pEmployeePersonOid) { //var employee = DAOFactory.SearchDAO.FindEmployeeWithPersonOid(pEmployeePersonOid); var person = DAOFactory.GenericDAO.LoadByID(pEmployeePersonOid); byte[] image = null; if (person.Images != null && person.Images.Count > 0) { image = person.Images[0].SmallThumbnail; } return SerializeObject(image); } [WebMethod(EnableSession = true)] public string TenantNochExistent() { SoapHibernateSessionManager.ConfigureHibernateSession(); var customer = CustomerService.GetCompactCustomerDC(46L); var result = SerializeObject(customer); return result; } [WebMethod(EnableSession = true)] public void UpdateCustomer(string pParam) { var customerVonAndroidZurueck = JsonConvert.DeserializeObject(pParam); SoapHibernateSessionManager.ConfigureHibernateSession(); } [WebMethod(EnableSession = true)] public string GetAllChatMessagesForSenderAndRecipient(long pSenderPersonOid, long pRecipientPersonOid, string pExceptions, bool pIsForTeam) { Debug.WriteLine("Lade alle Nachrichten für einen Chat herunter."); var exceptions = new List(); if (pExceptions.Length > 0) { var splittedString = pExceptions.Split(';'); exceptions = splittedString.ToList(); } var jsonMessages = new List(); var messages = DAOFactory.SearchDAO.FindAllChatMessagesForAndroid(pSenderPersonOid, pRecipientPersonOid, exceptions, pIsForTeam).DoForEach(dfe => jsonMessages.Add(new ChatMessageForJson(dfe.EmpfaengerPersonOid, dfe.SenderPersonOid, dfe.IsDelivered, dfe.IstGelesen, dfe.TeamOid, dfe.ChatText, dfe.Uhrzeit, dfe.Oid, dfe.InsTs, dfe.MessageId))); return JsonConvert.SerializeObject(jsonMessages); } [WebMethod(EnableSession = true)] public string GetNewestMessages(long pRecipientPersonOid) { var jsonMessages = new List(); var liste = DAOFactory.SearchDAO.FindNewestChatMessages(pRecipientPersonOid).DoForEach(dfe => jsonMessages.Add(new ChatMessageForJson(dfe.EmpfaengerPersonOid, dfe.SenderPersonOid, dfe.IsDelivered, dfe.IstGelesen, dfe.TeamOid, dfe.ChatText, dfe.Uhrzeit, dfe.Oid, dfe.InsTs, dfe.MessageId))); return JsonConvert.SerializeObject(jsonMessages); } [WebMethod(EnableSession = true)] public string GetServerAddressByToken(string pToken) { // Token überprüfen -> wenn falsch oder abgelaufen -> null zurückgeben return pToken == null ? null : "das-nur-ein-test;demo"; } [WebMethod(EnableSession = true)] public string GetContactsForPerson(long pPersonOid) { // erst mal nur für Mitarbeiter // employee oder customer laden var employee = DAOFactory.SearchDAO.FindEmployeeWithPersonOid(pPersonOid); var customer = DAOFactory.SearchDAO.FindCustomerWithPersonOid(pPersonOid); var isEmployee = customer == null; // mit den eigenen Klienten und allen anderen Mitarbeitern var allPersons = DAOFactory.SearchDAO.FindAllChatAuthorizedPersonsForEmployee(employee.Oid.Value).Where(w => w.Key.Oid.Value != employee.Person.Oid.Value); var allChatPersons = allPersons .Select(s => new ChatPerson(s.Key.Oid.Value, s.Key.FirstNameLastName, false, null, null, s.Key.Version.Value, s.Value, s.Key.Contacts.FirstOrDefault(f => f.Type == ContactType.business_MobilePhone) == null ? "" : s.Key.Contacts.FirstOrDefault(f => f.Type == ContactType.business_MobilePhone).Value)).ToList(); var teams = DAOFactory.SearchDAO.FindTeamsOfEmployee(employee.Oid.Value).Where(w => w.MemberList.Count > 1); foreach(var team in teams) { var teamMembers = team.MemberList; var memberString = ""; var memberNames = ""; foreach(var member in teamMembers) { memberString += member.Person.Oid.Value; memberNames += member.Person.FirstNameLastName; if(teamMembers.IndexOf(member) < teamMembers.Count - 1) { memberString += ";"; memberNames += ", "; } } allChatPersons.Add(new ChatPerson(team.Oid.Value, team.Name, true, memberString, memberNames, team.Version.Value, false, null)); } return SerializeObject(allChatPersons); } private static string SerializeObject(object obj) { return JsonConvert.SerializeObject(obj, Formatting.Indented, new JsonSerializerSettings { ContractResolver = new ShouldSerializeContractResolver(), ReferenceLoopHandling = ReferenceLoopHandling.Ignore }); } [WebMethod(EnableSession = true)] public string KeepAlive() { Log.Info("KeepAlive auf dem SOAP-Server wird ausgeführt"); return "lebt"; } [WebMethod(EnableSession = true)] public string CheckChatMessagesByUUIDs(string messageIds) { var splittet = messageIds.Split(";").ToList(); var existingMessageIds = (DAOFactory.SearchDAO.FindChatMessageIds(splittet) ?? new List()).ToList(); return JsonConvert.SerializeObject(existingMessageIds); } private static readonly log4net.ILog Log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); [WebMethod(EnableSession = true)] public string LoadChatMessagesChunkwise(string messageId, long pRecipientPersonOid, long pSenderPersonOid, bool pIsForTeam, string pExceptions, bool pIsInitialCall) { Log.Info("LoadChatMessagesChunkwise. Empfänger: " + pRecipientPersonOid + ", Absender: " + pSenderPersonOid + ". Ist ein Team: " + (pIsForTeam ? "ja" : "nein" + ". Ausnahmen: " + (pExceptions ?? "KEINE AUSNAHMEN") + ". Älteste Nachricht auf dem Mobilgerät: " + (messageId ?? "KEINE NACHRICHT AUF DEM MOBILGERÄT") + ".")); var exceptions = new List(); if (pExceptions.Length > 0) { var splittedString = pExceptions.Split(';'); exceptions = splittedString.ToList(); } var jsonMessages = new List(); var liste = DAOFactory.SearchDAO.LoadChatMessagesChunkwise(messageId, pRecipientPersonOid, pSenderPersonOid, pIsForTeam, exceptions, pIsInitialCall).DoForEach(dfe => jsonMessages.Add(new ChatMessageForJson(dfe.EmpfaengerPersonOid, dfe.SenderPersonOid, dfe.IsDelivered, dfe.IstGelesen, dfe.TeamOid, dfe.ChatText, dfe.Uhrzeit, dfe.Oid, dfe.InsTs, dfe.MessageId))); return JsonConvert.SerializeObject(jsonMessages); } [WebMethod(EnableSession = true)] public string LoadUserImages(long pPersonOid) { var images = new List(); // employee oder customer laden var employee = DAOFactory.SearchDAO.FindEmployeeWithPersonOid(pPersonOid); var customer = DAOFactory.SearchDAO.FindCustomerWithPersonOid(pPersonOid); var isEmployee = customer == null; // mit den eigenen Klienten und allen anderen Mitarbeitern if(isEmployee) { var byteImages = DAOFactory.SearchDAO.FindImagesForChatAuthorizedPersonsForEmployee(employee.Oid.Value); images.AddRange(byteImages.Select(img => new ImageEntity(img.Key, img.Value))); } else { } return SerializeObject(images); } public class ImageEntity { public long PersonOid { get; set; } public string ImageBase64String { get; set; } public long Version { get; set; } public ImageEntity(long pPersonOid, byte[] pImage) { PersonOid = pPersonOid; ImageBase64String = Convert.ToBase64String(pImage); Version = 1L; } } public class ChatPerson { public long Oid { get; set; } public string Name { get; set; } public bool IsTeam { get; set; } public string TeamMemberOids { get; set; } public string TeamMemberNames { get; set; } public long Version { get; set; } public bool IsEmployee { get; set; } public string PhoneNumber { get; set; } public ChatPerson(long pOid, string pName, bool pIsTeam, string pTeamMemberOids, string pTeamMemberNames, long pVersion, bool pIsEmployee, string pPhoneNumber) { Oid = pOid; Name = pName; IsTeam = pIsTeam; TeamMemberOids = pTeamMemberOids; TeamMemberNames = pTeamMemberNames; Version = pVersion; IsEmployee = pIsEmployee; PhoneNumber = pPhoneNumber; } } public class ChatMessageForJson { public string ChatText { get; set; } public DateTime Uhrzeit { get; set; } public long? EmpfängerPersonOid { get; set; } public long? SenderPersonOid { get; set; } public bool IsDelivered { get; set; } public int IstGelesen { get; set; } public long? TeamOid { get; set; } public long? Oid { get; set; } public DateTime? InsTs { get; set; } public string MessageId { get; set; } public ChatMessageForJson(long? pRecipientOid, long? pSenderOid, bool pIsDelivered, int pIstGelesen, long? pTeamOid, byte[] pChatTextAsBytes, DateTime pUhrzeit, long? pOid, DateTime? pInsTs, string pMessageId) { EmpfängerPersonOid = pRecipientOid; SenderPersonOid = pSenderOid; IsDelivered = pIsDelivered; IstGelesen = pIstGelesen; TeamOid = pTeamOid; Uhrzeit = pUhrzeit; ChatText = Encoding.UTF8.GetString(pChatTextAsBytes); Oid = pOid; InsTs = pInsTs; MessageId = pMessageId; } } } }