/// <summary>
        /// SnapshotToContent를 For_SnapshotId, Has_ContentId, Seqno 통해서 Create 하는 함수
        /// </summary>
        /// <param name="req">
        /// For_SnapshotId
        /// </param>
        /// <param name="req">
        /// Has_ContentId
        /// </param>
        /// <param name="req">
        /// Seqno
        /// </param>
        /// <returns></returns>
        public EnvelopeDTO <GenericDummyDTO> Any(SnapshotToContentRevisionCreateRequestDTO req)
        {
            var For_SnapshotId        = req.For_SnapshotId;
            var Has_ContentRevisionId = req.Has_ContentRevisionId;
            var Seqno = req.Seqno;

            if (!For_SnapshotId.HasValue && Has_ContentRevisionId.HasValue && Seqno.HasValue)
            {
                return(Fail <GenericDummyDTO>("SnapshotToContentCreateRequestDTO : parameter 'For_SnapshotId' is empty."));
            }
            if (For_SnapshotId.HasValue && !Has_ContentRevisionId.HasValue && Seqno.HasValue)
            {
                return(Fail <GenericDummyDTO>("SnapshotToContentCreateRequestDTO : parameter 'Has_ContentRevisionId' is empty."));
            }
            if (For_SnapshotId.HasValue && Has_ContentRevisionId.HasValue && !Seqno.HasValue)
            {
                return(Fail <GenericDummyDTO>("SnapshotToContentCreateRequestDTO : parameter 'Seqno' is empty."));
            }
            if (!For_SnapshotId.HasValue && !Has_ContentRevisionId.HasValue && Seqno.HasValue)
            {
                return(Fail <GenericDummyDTO>("SnapshotToContentCreateRequestDTO : parameter 'For_SnapshotId' && 'Has_ContentRevisionId' are empty."));
            }
            if (!For_SnapshotId.HasValue && Has_ContentRevisionId.HasValue && !Seqno.HasValue)
            {
                return(Fail <GenericDummyDTO>("SnapshotToContentCreateRequestDTO : parameter 'For_SnapshotId' && 'Seqno' are empty."));
            }
            if (For_SnapshotId.HasValue && !Has_ContentRevisionId.HasValue && !Seqno.HasValue)
            {
                return(Fail <GenericDummyDTO>("SnapshotToContentCreateRequestDTO : parameter 'Has_ContentRevisionId' && 'Seqno' are empty."));
            }
            if (!For_SnapshotId.HasValue && !Has_ContentRevisionId.HasValue && !Seqno.HasValue)
            {
                return(Fail <GenericDummyDTO>("SnapshotToContentCreateRequestDTO : parameter 'For_SnapshotId' && 'Has_ContentRevisionId' && 'Seqno' are empty."));
            }
            else
            {
                using (var entities = new CrawlerStorage())
                {
                    try
                    {
                        var snapshotTocontentrevision = new SnapshotToContentRevision();

                        snapshotTocontentrevision.For_SnapshotId        = For_SnapshotId.Value;
                        snapshotTocontentrevision.Has_ContentRevisionId = Has_ContentRevisionId.Value;
                        snapshotTocontentrevision.Seqno = Seqno.Value;

                        entities.SnapshotToContentRevisions.Add(snapshotTocontentrevision);

                        entities.SaveChanges();

                        return(Succeeded(new GenericDummyDTO()));
                    }
                    catch (Exception e)
                    {
                        return(Fail <GenericDummyDTO>("e"));
                    }
                }
            }
        }
예제 #2
0
        /// <summary>
        /// Snapshot을 SnapshotDTO를 통해서 Create 하는 함수
        /// </summary>
        /// <param name="req">
        /// SnapshotDTO
        /// </param>
        /// <returns></returns>
        public EnvelopeDTO <SnapshotDTO> Any(SnapshotCreateRequestDTO req)
        {
            // 단정하기.
            Debug.Assert(req.Snapshot.Id == 0);
            Debug.Assert(req.Snapshot.ContentRevisions != null);

            var Snapshot = req.Snapshot;

            using (var entities = new CrawlerStorage())
            {
                try
                {
                    // 가장 최근의 TimePeriod를 가져온다.
                    var timeperiod = entities.TimePeriods.OrderByDescending(t => t.Scheduled).FirstOrDefault();

                    var snapshot = new Snapshot
                    {
                        For_Timeperiod = timeperiod.Id,
                        Taken          = Snapshot.Taken,
                        For_BoardId    = Snapshot.For_BoardId
                    };

                    entities.Snapshots.Add(snapshot);

                    // 해당하는 boardId의 가장 최근의 Snapshot을 가져온다.
                    var LastSnapshot = entities.Snapshots.Where(p => p.For_BoardId == Snapshot.For_BoardId).OrderByDescending(t => t.Id).FirstOrDefault();
                    if (LastSnapshot != null)
                    {
                        foreach (var eachCurrentRevision in Snapshot.ContentRevisions)
                        {
                            foreach (var eachLastRevision in LastSnapshot.SnapshotToContentRevisions)
                            {
                                if (eachCurrentRevision.CheckSum.Equals(eachLastRevision.ContentRevision.CheckSum))
                                {
                                    eachCurrentRevision.id = eachLastRevision.ContentRevision.Id;
                                }
                            }
                        }
                    }


                    int         contentseq = 0;
                    List <long> sizelist   = new List <long>();

                    if (Snapshot.ContentRevisions == null)
                    {
                        return(Fail <SnapshotDTO>("발생하면 안됨."));
                    }

                    foreach (var contentRevision in Snapshot.ContentRevisions)
                    {
                        // 이미 뭔가 있는 상황
                        if (contentRevision.id != 0)
                        {
                            var snapshotTocontentrevision = new SnapshotToContentRevision
                            {
                                Has_ContentRevisionId = contentRevision.id,
                                Seqno    = ++contentseq,
                                Snapshot = snapshot
                            };

                            entities.SnapshotToContentRevisions.Add(snapshotTocontentrevision);
                            continue;
                        }

                        // snapshotcontentrevision.id -> snapshotcontentrevision가 DB에 있었던 정보인지 아닌지 판단함

                        var newContentRevision = new ContentRevision
                        {
                            Details        = contentRevision.Details,
                            Details_Html   = contentRevision.Details_Html,
                            Crawled        = contentRevision.Crawled,
                            RecommandCount = contentRevision.recommandCount,
                            ViewCount      = contentRevision.viewCount,
                            CheckSum       = contentRevision.CheckSum
                        };

                        var contentChecksum = Convert.ToBase64String(HashHelper.ObjectToMD5Hash(contentRevision.Content.Url_Params));

                        var existingContent = entities.Contents.SingleOrDefault(p => p.CheckSum.Equals(contentChecksum));

                        var content = existingContent == null ? new Content
                        {
                            Article      = contentRevision.Content.Article,
                            Contents_URL = contentRevision.Content.Contents_URL,
                            ContentGuId  = Guid.NewGuid(),
                            Url_Params   = contentRevision.Content.Url_Params,
                            CheckSum     = Convert.ToBase64String(HashHelper.ObjectToMD5Hash(contentRevision.Content.Url_Params))
                        } : existingContent;

                        // 글 중에서 그림이 없는 글이 있을 수 있으므로 그림 여부 판단 -> 없으면 if문 해당 안되므로 저장을 안함.
                        if (contentRevision.SrcDatas != null)
                        {
                            foreach (var data in contentRevision.SrcDatas)
                            {
                                // 그림 데이터 중에서 originalpayload가 없는 경우, commonCrawler에서 다운로드 이미지 하는 부분에서 isDepricated 변수가 true로 넘어오므로 판단할 수 있다.

                                if (data == null || data.OriginalPayload == null)
                                {
                                    continue;
                                }

                                var srcdataChecksum = Convert.ToBase64String(HashHelper.ObjectToMD5Hash(data.OriginalPayload));

                                var existingSrcdataId = entities.Srcdatas.Where(s => s.CheckSum.Equals(srcdataChecksum)).Select(s => s.Id).FirstOrDefault();

                                // ExistSrcdata는 기존 DB에서 가지고 있던 Srcdata 이미지와 중복되는지 여부를 판단 해준다.
                                if (existingSrcdataId == 0)
                                {
                                    var srcdata = new Srcdata {
                                        SrcGuId              = Guid.NewGuid(),
                                        Original_SourceUrl   = data.SourceUrl,
                                        Content              = content,
                                        FileName             = data.FileName,
                                        OriginalPayload      = data.OriginalPayload,
                                        OriginalPayload_Size = data.OriginalPayload_Size,
                                        CheckSum             = srcdataChecksum
                                    };

                                    entities.Srcdatas.Add(srcdata);
                                }
                            }
                        }
                        newContentRevision.Content = content;
                        entities.ContentRevisions.Add(newContentRevision);
                        entities.SnapshotToContentRevisions.Add(new SnapshotToContentRevision
                        {
                            ContentRevision = newContentRevision,
                            Snapshot        = snapshot,
                            Seqno           = ++contentseq,
                        });
                    }
                    try
                    {
                        entities.SaveChanges();
                        return(Succeeded(new SnapshotDTO()));
                    }
                    catch (Exception e)
                    {
                        return(null);
                    }
                }

                catch (System.Data.Entity.Validation.DbEntityValidationException dbEx)
                {
                    Exception raise = dbEx;
                    foreach (var validationErrors in dbEx.EntityValidationErrors)
                    {
                        foreach (var validationError in validationErrors.ValidationErrors)
                        {
                            string message = string.Format("{0}:{1}",
                                                           validationErrors.Entry.Entity.ToString(),
                                                           validationError.ErrorMessage);
                            raise = new InvalidOperationException(message, raise);
                        }
                    }
                    throw raise;
                }
            }
        }