/// <summary> /// Prepare a message for sending. Creates thread if needed. Assigns addressees. Verifies message recipient /// </summary> /// <param name="message"></param> /// <returns></returns> internal Message prepareMessage(Message message) { if (message.MessageThread == null) { throw new MdoException(MdoExceptionCode.ARGUMENT_NULL, "No thread defined"); } if (message.MessageThread.Id <= 0 && String.IsNullOrEmpty(message.MessageThread.Subject)) { throw new MdoException(MdoExceptionCode.ARGUMENT_NULL, "No message ID or message subject specified"); } if (message.SenderId <= 0) { throw new MdoException(MdoExceptionCode.ARGUMENT_NULL_PATIENT_ID, "No user associated with message"); } if (message.MessageThread.Id <= 0) { message.MessageThread = createThread(message.MessageThread); // the message.MessageThread should have the fields needed to create } domain.sm.User sender = new UserDao(_cxn).getUserById(Convert.ToInt32(message.SenderId)); new AddresseeDao(_cxn).addSenderToMessage(sender, message); message.SenderName = sender.getName(); message.SenderType = sender.ParticipantType; if (message.SentDate.Year > 1900) // if message is ready to be sent { if (sender.UserType == domain.sm.enums.UserTypeEnum.PATIENT) // if user is a patient, make sure recipient is ok { return prepareCompletedPatientMessage(message); } else if (sender.UserType == domain.sm.enums.UserTypeEnum.CLINICIAN) { return prepareCompletedProviderMessage(message); } else if (sender.UserType == domain.sm.enums.UserTypeEnum.ADMINISTRATOR) { // TBD - do these users have any restrictions??? } } else if (message.SentDate.Year < 1900) { if (sender.UserType == domain.sm.enums.UserTypeEnum.PATIENT) { return prepareIncompletePatientMessage(message); } else if (sender.UserType == domain.sm.enums.UserTypeEnum.CLINICIAN) { // TODO - implement some code to take care of incomplete messages } else if (sender.UserType == domain.sm.enums.UserTypeEnum.ADMINISTRATOR) { // TODO - implement some code to take care of incomplete messages } } return message; }
public Message saveDraft(Message message) { if (message == null || String.IsNullOrEmpty(message.Body) || message.MessageThread == null || message.CompletedDate.Year > 1900) { throw new MdoException("Invalid message"); } if (message.SenderId <= 0) { throw new MdoException("Invalid user ID"); } //if (message.MessageThread != null && message.MessageThread.Id > 0) //{ // throw new MdoException("Can't save more than on draft message to a thread"); //} domain.sm.User sender = new UserDao(_cxn).getUserById(Convert.ToInt32(message.SenderId)); if (sender == null) { throw new MdoException("No user found with that ID"); } // is draft new or should we update if (message.Id > 0) { // get message - see if it's ripe for updating Message dbMessage = getMessageComplete(message.Id); if (dbMessage == null || dbMessage.Id <= 0 || dbMessage.MessageThread == null || dbMessage.MessageThread.Id <= 0 || dbMessage.Addressees == null || dbMessage.Addressees.Count != 1) { throw new MdoException("Invalid message ID"); } if (dbMessage.SenderId != message.SenderId || dbMessage.Addressees[0].Owner.Id != message.SenderId) { throw new MdoException("Can't edit another user's messages"); } if (dbMessage.SentDate.Year > 1900 || dbMessage.CompletedDate.Year > 1900) { throw new MdoException("This message has already been sent - not a valid draft"); } if (dbMessage.Addressees.Count > 1) { throw new MdoException("Data integrity - this message has already been addressed to more than one user"); } // need to copy over important fields before we assign dbMessage to message dbMessage.Body = message.Body; dbMessage.Checksum = gov.va.medora.utils.StringUtils.getMD5Hash(message.Body); dbMessage.Oplock = message.Oplock; // need to copy this over because it came from the client // if mail group changed if (message.MessageThread != null && message.MessageThread.MailGroup != null && message.MessageThread.MailGroup.Id > 0 && message.MessageThread.MailGroup.Id != dbMessage.MessageThread.MailGroup.Id) { dbMessage.MessageThread.MailGroup = message.MessageThread.MailGroup; } // TODO - figure out copying over of message thread properties dbMessage.MessageThread.MessageCategoryType = message.MessageThread.MessageCategoryType; dbMessage.MessageThread.Subject = message.MessageThread.Subject; dbMessage.MessageThread.Oplock = message.MessageThread.Oplock; if (message.RecipientId > 0 && dbMessage.RecipientId != message.RecipientId) { checkValidMessageRecipient(message, sender); dbMessage.RecipientId = message.RecipientId; dbMessage.RecipientName = message.RecipientName; dbMessage.RecipientType = message.RecipientType; } message = dbMessage; try { _cxn.beginTransaction(); updateThread(dbMessage.MessageThread); message = updateMessage(dbMessage); message.MessageThread = dbMessage.MessageThread; _cxn.commitTransaction(); } catch (Exception) { _cxn.rollbackTransaction(); throw; } } else { if (message.MessageThread == null) { throw new MdoException("No thread defined for new draft message"); } message.SenderId = sender.Id; message.SenderName = sender.getName(); message.SenderType = sender.ParticipantType; if (sender.ParticipantType == domain.sm.enums.ParticipantTypeEnum.PATIENT) { checkValidMessageRecipientPatient(message); } else if (sender.ParticipantType == domain.sm.enums.ParticipantTypeEnum.CLINICIAN) { checkValidMessageRecipientProvider(message); } try { _cxn.beginTransaction(); domain.sm.Thread t = null; if (message.MessageThread.Id <= 0) { t = createThread(message.MessageThread); } else { t = getThread(message.MessageThread.Id); if (t == null || t.Id <= 0) { throw new MdoException("No thread found for that thread ID"); } } message = createMessage(message); message.MessageThread = t; AddresseeDao addrDao = new AddresseeDao(_cxn); addrDao.addSenderToMessage(sender, message); addrDao.createAddressees(message.Addressees, message.Id); _cxn.commitTransaction(); } catch (Exception) { _cxn.rollbackTransaction(); throw; } } return message; }
internal Message prepareCompletedProviderMessage(domain.sm.Message message) { // TODO - need to implement provider stuff... return message; if (message.RecipientType == domain.sm.enums.ParticipantTypeEnum.PATIENT || message.RecipientType == domain.sm.enums.ParticipantTypeEnum.CLINICIAN) { domain.sm.User recipient = new UserDao(_cxn).getUserById(Convert.ToInt32(message.RecipientId)); if (recipient == null) { throw new MdoException("No user for that recipient ID"); } message.RecipientName = recipient.getName(); message.RecipientType = recipient.ParticipantType; } else if (message.RecipientType == domain.sm.enums.ParticipantTypeEnum.DISTRIBUTION_GROUP) { // TODO implement some code to set the correct recipient values } else if (message.RecipientType == domain.sm.enums.ParticipantTypeEnum.CLINCIAN_TRIAGE) { // TODO implement some code to set the correct recipient values } }