Ejemplo n.º 1
0
        /// <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;
        }
Ejemplo n.º 2
0
        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;
        }
Ejemplo n.º 3
0
        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
            }
        }