/// <summary> /// Returns true if user has write access right for document. /// </summary> /// <param name="userId"></param> /// <param name="documentId"></param> /// <returns></returns> public bool CheckIfUserHasWriteAccess(int userId, int documentId) { using (DMSDataBaseEntities context = new DMSDataBaseEntities()) { tUser user = context.tUsers.Find(userId); if (user.AuthorizationRoleId == (int)AuthorizationRoleCodes.Administrator) { return(true); } tUserDocument ud = context.tUserDocuments.Where(u => u.UserId == userId && u.DocumentId == documentId).SingleOrDefault(); if (ud == null) { return(false); } if (ud.DocumentAccessRightId == (int)DocumentAccessRightCodes.Owner) { return(true); } if (ud.DocumentAccessRightId == (int)DocumentAccessRightCodes.Modify) { return(true); } return(false); } }
/// <summary> /// Opens document for writing for current user if document is not locked and no one currently reads it. /// </summary> /// <param name="documentId">The document id.</param> /// <param name="loggedUserId">The logged user id.</param> /// <returns></returns> public bool TryOpenDocumentForWriting(int documentId, int loggedUserId) { using (TransactionScope scope = new TransactionScope()) { using (DMSDataBaseEntities context = new DMSDataBaseEntities()) { tDocument document = context.tDocuments.Find(documentId); if (document.IsLocked) { scope.Complete(); return(false); } int readers = context.tUserDocuments.Where(u => u.DocumentId == documentId && u.IsReading).Count(); if (readers > 0) { scope.Complete(); return(false); } tUserDocument ud = context.tUserDocuments.Where(u => u.DocumentId == documentId && u.UserId == loggedUserId).Single(); ud.IsWriting = true; document.IsLocked = true; context.SaveChanges(); scope.Complete(); return(true); } } }
/// <summary> /// Adds new document to system. /// </summary> /// <param name="documentDto">The document</param> /// <param name="ownerId">The owner id = logged user id.</param> /// <returns></returns> public DocumentDTO SaveNewDocument(DocumentDTO documentDto, int ownerId) { if (documentDto == null) { throw new ArgumentNullException("documentDto"); } documentDto.CreatedAt = DateTime.Now; documentDto.IsArchived = false; documentDto.IsLocked = false; documentDto.IsValid = true; tDocument result = Mapper.Map <tDocument>(documentDto); result.Version = 1; result.Guid = Guid.NewGuid(); result.Extension = result.Extension.TrimStart('.'); result.tKeywords = Mapper.Map <List <tKeyword> >(documentDto.Keywords.ToList()); foreach (DocumentShareDTO share in documentDto.DocumentShares) { tUserDocument ud = new tUserDocument(); ud.IsReading = false; ud.IsWriting = false; ud.UserId = share.UserId; ud.DocumentId = documentDto.Id; ud.DocumentAccessRightId = (int)share.AccessRight; result.tUserDocuments.Add(ud); } tUserDocument owner = new tUserDocument() { IsReading = false, IsWriting = false, DocumentAccessRightId = (int)DocumentAccessRightCodes.Owner, UserId = ownerId }; using (DMSDataBaseEntities context = new DMSDataBaseEntities()) { result = context.tDocuments.Add(result); context.SaveChanges(); owner.DocumentId = result.Id; result.tUserDocuments.Add(owner); context.SaveChanges(); } AddAdministratorsToDocument(result.Id, ownerId); documentDto.Id = result.Id; return(documentDto); }
/// <summary> /// Check if user is currently reading from last version of document. /// </summary> /// <param name="userId">The user id.</param> /// <param name="documentId">The document id.</param> /// <returns></returns> public bool IsUserReadingFromDocument(int userId, int documentId) { using (DMSDataBaseEntities context = new DMSDataBaseEntities()) { tUserDocument ud = context.tUserDocuments.Where(u => u.UserId == userId && u.DocumentId == documentId).SingleOrDefault(); if (ud == null) { throw new AuthorizationException(); } return(ud.IsReading); } }
/// <summary> /// Closes file without saving changes or creating new version. /// </summary> /// <param name="documentId">The document id.</param> /// <param name="userId">The user id.</param> public void CloseDocument(int documentId, int userId) { BeginTransaction(); tUserDocument ud = Context.tUserDocuments.Where(u => u.DocumentId == documentId && u.UserId == userId).Single(); tDocument document = Context.tDocuments.Find(documentId); document.IsLocked = false; ud.IsReading = false; ud.IsWriting = false; Context.SaveChanges(); EndTransaction(); }
/// <summary> /// Updates document title, keywords and sharing with users. /// </summary> /// <param name="documentDto">The document dto.</param> /// <param name="loggedUserId">The logged user id.</param> public void UpdateDocumentData(DocumentDTO documentDto, long loggedUserId) { if (documentDto == null) { throw new ArgumentNullException("documentDto"); } // operators, not owner, not logged user Expression <Func <tUserDocument, bool> > oldShareRestrictions = x => x.DocumentId == documentDto.Id && x.DocumentAccessRightId != (int)DocumentAccessRightCodes.Owner && x.UserId != loggedUserId && x.tUser.AuthorizationRoleId == (int)AuthorizationRoleCodes.Operator; using (DMSDataBaseEntities context = new DMSDataBaseEntities()) { tDocument document = context.tDocuments.Find(documentDto.Id); document.tKeywords.Clear(); document.tKeywords = Mapper.Map <List <tKeyword> >(documentDto.Keywords.ToList()); document.LastModifiedAt = DateTime.Now; document.Version++; document.Title = documentDto.Title; IEnumerable <tUserDocument> oldShared = context.tUserDocuments.Where(oldShareRestrictions); foreach (tUserDocument ud in oldShared) { context.tUserDocuments.Remove(ud); } foreach (DocumentShareDTO share in documentDto.DocumentShares) { tUserDocument ud = new tUserDocument(); ud.IsReading = false; ud.IsWriting = false; ud.UserId = share.UserId; ud.DocumentId = documentDto.Id; ud.DocumentAccessRightId = (int)share.AccessRight; document.tUserDocuments.Add(ud); } context.SaveChanges(); } }
/// <summary> /// Gives modify access right to all administrators of system except owner, to the document. /// </summary> /// <param name="documentId">The document id</param> private void AddAdministratorsToDocument(int documentId, int ownerId) { using (DMSDataBaseEntities context = new DMSDataBaseEntities()) { IEnumerable <tUser> users = context.tUsers.Where(u => u.AuthorizationRoleId == (int)AuthorizationRoleCodes.Administrator && u.Id != ownerId); foreach (tUser user in users) { tUserDocument ud = new tUserDocument() { DocumentId = documentId, IsReading = false, IsWriting = false, DocumentAccessRightId = (int)DocumentAccessRightCodes.Modify, UserId = user.Id }; context.tUserDocuments.Add(ud); } context.SaveChanges(); } }
/// <summary> /// Gives modify access right for all documents in system to admistrator. This method is called when new administrator is added to system. /// </summary> /// <param name="documentId">The specified </param> private void AddDocumentsToAdministrator(int userId) { BeginTransaction(); IEnumerable <tDocument> documents = Context.tDocuments.Where(u => u.IsValid); foreach (tDocument document in documents) { tUserDocument ud = new tUserDocument() { DocumentId = document.Id, IsReading = false, IsWriting = false, DocumentAccessRightId = (int)DocumentAccessRightCodes.Modify, UserId = userId }; Context.tUserDocuments.Add(ud); } Context.SaveChanges(); EndTransaction(); }