public PersonFluffyDateModelState(
            ModelStateDictionary modelState,
            FluffyDate selectedFluffyDate,
            PersonFluffyDateTypeOptions selectedFluffyDateType,
            IEnumerable <PersonFluffyDate> allFluffyDates,
            int?personFluffyDateId)
        {
            ModelState              = modelState;
            _selectedFluffyDate     = selectedFluffyDate;
            _selectedFluffyDateType = selectedFluffyDateType;
            _allFluffyDates         = allFluffyDates;
            _personFluffyDateId     = personFluffyDateId;

            switch (_selectedFluffyDateType)
            {
            case PersonFluffyDateTypeOptions.Birth:

                _birthFluffyDate = _selectedFluffyDate;

                var death =
                    _allFluffyDates
                    .FirstOrDefault(x =>
                                    x.Type.Equals(PersonFluffyDateType.Death));

                if (death != null)
                {
                    _deathFluffyDate =
                        new FluffyDate(
                            death.Year,
                            death.Month,
                            death.Day);
                }

                break;

            case PersonFluffyDateTypeOptions.Death:

                _deathFluffyDate = _selectedFluffyDate;

                var birth =
                    _allFluffyDates
                    .FirstOrDefault(x =>
                                    x.Type.Equals(PersonFluffyDateType.Birth));

                if (birth != null)
                {
                    _birthFluffyDate =
                        new FluffyDate(
                            birth.Year,
                            birth.Month,
                            birth.Day);
                }

                break;
            }

            _birthVsDeathDate =
                new BirthVsDeathDate(_birthFluffyDate, _deathFluffyDate);
        }
        //
        // Add persons to view model
        //

        public void AddPersonsToViewModel(List <Person> persons)
        {
            foreach (var person in persons)
            {
                var personItem = new PersonItemInPersonListViewModel(person);

                var birthFluffyDate =
                    person.FluffyDates.FirstOrDefault(x =>
                                                      x.Type == PersonFluffyDateType.Birth);

                if (birthFluffyDate?.Year != null)
                {
                    var fluffyDateStart =
                        new FluffyDate(
                            birthFluffyDate.Year,
                            birthFluffyDate.Month,
                            birthFluffyDate.Day);

                    var fluffyDateEnd =
                        new FluffyDate(
                            DateTime.Now.Year,
                            DateTime.Now.Month,
                            DateTime.Now.Day);

                    var deathFluffyDate =
                        person.FluffyDates.FirstOrDefault(x =>
                                                          x.Type == PersonFluffyDateType.Death);

                    if (deathFluffyDate?.Year != null)
                    {
                        fluffyDateEnd =
                            new FluffyDate(
                                deathFluffyDate.Year,
                                deathFluffyDate.Month,
                                deathFluffyDate.Day);
                    }

                    var age =
                        new Age(
                            fluffyDateStart,
                            fluffyDateEnd);

                    if (age.InYears != null)
                    {
                        personItem.Age = age.InYears.ToString();
                    }
                }

                PersonItems.Add(personItem);
            }
        }
Exemple #3
0
        public void AddOrUpdatePerson(Person person)
        {
            if (person.PersonGuid == Guid.Empty)
            {
                return;
            }

            IGraph g = new Graph();

            // Namespaces
            g.BaseUri =
                new Uri($"https://resource.fylkesarkivet.no/person/{person.PersonGuid}#");

            // Default:
            // @prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>.
            // @prefix rdfs: < http://www.w3.org/2000/01/rdf-schema#>.
            // @prefix xsd: < http://www.w3.org/2001/XMLSchema#>.

            g.NamespaceMap.AddNamespace("foaf", UriFactory.Create("http://xmlns.com/foaf/0.1/"));
            // http://dbpedia.org/ontology/Person
            g.NamespaceMap.AddNamespace("dbo", UriFactory.Create("http://dbpedia.org/ontology/"));
            g.NamespaceMap.AddNamespace("dbp", UriFactory.Create("http://dbpedia.org/property/"));
            g.NamespaceMap.AddNamespace("xsd", UriFactory.Create("http://www.w3.org/2001/XMLSchema#"));
            g.NamespaceMap.AddNamespace("fark", UriFactory.Create("https://ontology.fylkesarkivet.no/"));

            // Agent
            g.Assert(new Triple(
                         g.CreateUriNode(),
                         g.CreateUriNode("rdf:type"),
                         g.CreateUriNode("foaf:Agent")));

            // Person
            g.Assert(new Triple(
                         g.CreateUriNode(),
                         g.CreateUriNode("rdf:type"),
                         g.CreateUriNode("foaf:Person")));

            // Gender
            switch (person.Gender)
            {
            case PersonGender.Male:
                g.Assert(new Triple(
                             g.CreateUriNode(),
                             g.CreateUriNode("foaf:Gender"),
                             g.CreateLiteralNode("male")));
                break;

            case PersonGender.Female:
                g.Assert(new Triple(
                             g.CreateUriNode(),
                             g.CreateUriNode("foaf:Gender"),
                             g.CreateLiteralNode("female")));
                break;

            case PersonGender.GenderVariant:
                g.Assert(new Triple(
                             g.CreateUriNode(),
                             g.CreateUriNode("foaf:Gender"),
                             g.CreateLiteralNode("gender variant")));
                break;
            }

            // Name
            if (person.Names != null && person.Names.Any())
            {
                foreach (var name in person.Names)
                {
                    var triples = new List <Triple>();

                    var blankNode = g.CreateBlankNode();

                    triples.Add(
                        new Triple(
                            g.CreateUriNode(),
                            g.CreateUriNode("fark:Name"),
                            blankNode));

                    // foaf:name

                    var fullName =
                        string.Join(" ", new[]
                    {
                        name.Prefix,
                        name.First,
                        name.Middle,
                        name.Last,
                        name.Suffix
                    }.Where(x => !string.IsNullOrWhiteSpace(x)).ToArray());

                    if (!string.IsNullOrWhiteSpace(fullName))
                    {
                        triples.Add(
                            new Triple(
                                blankNode,
                                g.CreateUriNode("foaf:name"),
                                g.CreateLiteralNode(fullName)));
                    }

                    // foaf:firstName
                    var firstName =
                        string.Join(" ", new[]
                    {
                        name.Prefix,
                        name.First
                    }.Where(x => !string.IsNullOrWhiteSpace(x)).ToArray());
                    if (!string.IsNullOrWhiteSpace(firstName))
                    {
                        triples.Add(
                            new Triple(
                                blankNode,
                                g.CreateUriNode("foaf:firstName"),
                                g.CreateLiteralNode(firstName)));
                    }

                    // foaf:middleName
                    if (!string.IsNullOrWhiteSpace(name.Middle))
                    {
                        triples.Add(
                            new Triple(
                                blankNode,
                                g.CreateUriNode("foaf:middleName"),
                                g.CreateLiteralNode(name.Middle)));
                    }

                    // foaf:lastName
                    var lastName =
                        string.Join(" ", new[]
                    {
                        name.Last,
                        name.Suffix
                    }.Where(x => !string.IsNullOrWhiteSpace(x)).ToArray());
                    if (!string.IsNullOrWhiteSpace(lastName))
                    {
                        triples.Add(
                            new Triple(
                                blankNode,
                                g.CreateUriNode("foaf:lastName"),
                                g.CreateLiteralNode(lastName)));
                    }

                    // fark:nameWeight

                    if (!string.IsNullOrWhiteSpace(name.NameWeight.ToString()))
                    {
                        triples.Add(
                            new Triple(
                                blankNode,
                                g.CreateUriNode("fark:nameWeight"),
                                g.CreateLiteralNode(
                                    name.NameWeight.ToString(),
                                    g.CreateUriNode("xsd:integer").Uri)));
                    }

                    // Add triples to graph
                    if (triples.Count > 1)
                    {
                        g.Assert(triples);
                    }
                }
            }

            // Description
            if (person.Descriptions != null && person.Descriptions.Any())
            {
                foreach (var description in person.Descriptions)
                {
                    var lang = "en";

                    if (description.Type == PersonDescriptionType.Norwegian)
                    {
                        lang = "no";
                    }

                    g.Assert(new Triple(
                                 g.CreateUriNode(),
                                 g.CreateUriNode("dbo:abstract"),
                                 g.CreateLiteralNode(description.Description, lang)));
                }
            }

            // Date
            if (person.FluffyDates != null && person.FluffyDates.Any())
            {
                foreach (var fluffyDate in person.FluffyDates)
                {
                    if (fluffyDate.Type == PersonFluffyDateType.Birth &&
                        fluffyDate.Type == PersonFluffyDateType.Death)
                    {
                        continue;
                    }

                    var date =
                        new FluffyDate(
                            fluffyDate.Year,
                            fluffyDate.Month,
                            fluffyDate.Day);

                    var monthWithZero = string.Format("{0:00}", date.Month);
                    var dayWithZero   = string.Format("{0:00}", date.Day);

                    var dateType = "dbo:birthDate";
                    var yearType = "dbo:birthYear";

                    if (fluffyDate.Type == PersonFluffyDateType.Death)
                    {
                        dateType = "dbo:deathDate";
                        yearType = "dbo:deathYear";

                        // FluffyDate can be blank if person is dead
                        g.Assert(new Triple(
                                     g.CreateUriNode(),
                                     g.CreateUriNode("rdf:type"),
                                     g.CreateUriNode("fark:Dead")));
                    }

                    if (date.IsValidDate)
                    {
                        g.Assert(new Triple(
                                     g.CreateUriNode(),
                                     g.CreateUriNode(dateType),
                                     g.CreateLiteralNode(
                                         $"{date.Year}-{monthWithZero}-{dayWithZero}",
                                         g.CreateUriNode("xsd:date").Uri)));
                    }

                    if (date.HasValidYear)
                    {
                        g.Assert(new Triple(
                                     g.CreateUriNode(),
                                     g.CreateUriNode(yearType),
                                     g.CreateLiteralNode(
                                         $"{date.Year}",
                                         g.CreateUriNode("xsd:gYear").Uri)));
                    }
                }
            }

            // Timestamp
            g.Assert(new Triple(
                         g.CreateUriNode(),
                         g.CreateUriNode("dbp:timestamp"),
                         g.CreateLiteralNode(
                             person.TimeLastUpdated.ToString("yyyyMMddHHmmss"),
                             g.CreateUriNode("xsd:double").Uri)));

            var writer = new CompressingTurtleWriter();

            writer.Save(g, $"{_serviceSettings.Value.RdfTurtleFilesForPersonPath}/{person.PersonGuid}.ttl");
        }
Exemple #4
0
        public IActionResult Create(
            Guid personGuid,
            PersonFluffyDateCreateModel createModel)
        {
            // Must have GUID
            if (personGuid == Guid.Empty)
            {
                return(NotFound());
            }

            // Must have a person
            var person =
                _personData.ReadPersonWithFluffyDates(personGuid);

            // Do we have what we need so far?
            if (person == null)
            {
                return(NotFound());
            }

            // Page navigation
            ViewData["PersonGuid"] = person.PersonGuid;

            //
            // Validate
            //

            var form =
                new PersonFluffyDateModelState(
                    ModelState,
                    new FluffyDate(
                        createModel.Year,
                        createModel.Month,
                        createModel.Day),
                    createModel.Type,
                    person.FluffyDates,
                    null);

            form.HasValidValues();
            if (!ModelState.IsValid)
            {
                return(View(createModel));
            }

            form.HasUniqueTypeToBeCreated();
            if (!ModelState.IsValid)
            {
                return(View(createModel));
            }

            form.BirthVsDeathYear();
            if (!ModelState.IsValid)
            {
                return(View(createModel));
            }

            form.BirthVsDeathMonth();
            if (!ModelState.IsValid)
            {
                return(View(createModel));
            }

            form.BirthVsDeathDay();
            if (!ModelState.IsValid)
            {
                return(View(createModel));
            }

            form.PersonHasNormalAge();
            if (!ModelState.IsValid)
            {
                return(View(createModel));
            }

            form.DateIsNotInTheFuture(
                DateTime.Now.Year,
                DateTime.Now.Month,
                DateTime.Now.Day);
            if (!ModelState.IsValid)
            {
                return(View(createModel));
            }

            //
            // Create
            //

            var newPersonFluffyDate = new PersonFluffyDate();

            newPersonFluffyDate.PersonId = person.PersonId;
            newPersonFluffyDate.Year     = createModel.Year;
            newPersonFluffyDate.Month    = createModel.Month;
            newPersonFluffyDate.Day      = createModel.Day;
            newPersonFluffyDate.Type     =
                (PersonFluffyDateType)createModel.Type;

            try
            {
                _personData.AddPersonFluffyDate(newPersonFluffyDate);
            }
            catch (DbUpdateException /* ex */)
            {
                // Log the error (uncomment ex variable name and write a log.)
                ModelState.AddModelError(
                    "",
                    "Unable to save changes. " +
                    "Try again, and if the problem persists, " +
                    "see your system administrator.");

                return(View(createModel));
            }

            //
            // Update RDF
            //

            var readPerson = _personData.ReadAllPersonData(personGuid);

            if (readPerson != null)
            {
                _rdfData.AddOrUpdatePerson(readPerson);
            }

            //
            // Update search index
            //

            // Update selected year type
            switch (createModel.Type)
            {
            case PersonFluffyDateTypeOptions.Birth:
                _personSearchIndex.MergeYearOfBirth(
                    person.PersonGuid.ToString(),
                    createModel.Year);
                break;

            case PersonFluffyDateTypeOptions.Death:
                _personSearchIndex.MergeYearOfDeath(
                    person.PersonGuid.ToString(),
                    createModel.Year);
                break;
            }

            // Update age

            // Get updated dates
            person = _personData.ReadPersonWithFluffyDates(personGuid);

            var birthFluffyDate =
                person.FluffyDates.FirstOrDefault(x =>
                                                  x.Type == PersonFluffyDateType.Birth);

            if (birthFluffyDate?.Year != null)
            {
                var fluffyDateStart =
                    new FluffyDate(
                        birthFluffyDate.Year,
                        birthFluffyDate.Month,
                        birthFluffyDate.Day);

                var fluffyDateEnd =
                    new FluffyDate(
                        DateTime.Now.Year,
                        DateTime.Now.Month,
                        DateTime.Now.Day);

                var deathFluffyDate =
                    person.FluffyDates.FirstOrDefault(x =>
                                                      x.Type == PersonFluffyDateType.Death);

                if (deathFluffyDate?.Year != null)
                {
                    fluffyDateEnd =
                        new FluffyDate(
                            deathFluffyDate.Year,
                            deathFluffyDate.Month,
                            deathFluffyDate.Day);
                }

                var age =
                    new Age(
                        fluffyDateStart,
                        fluffyDateEnd);

                if (age.InYears != null)
                {
                    _personSearchIndex.MergeAge(
                        person.PersonGuid.ToString(),
                        age.InYears);
                }
            }

            //
            // Redirect
            //

            return(RedirectToAction(
                       "Details",
                       "Person",
                       new { personGuid = personGuid }));
        }
Exemple #5
0
        public IActionResult DeleteByPost(
            int personFluffyDateId)
        {
            var fluffyDate =
                _personData
                .GetPersonFluffyDateWithNavigation(
                    personFluffyDateId);

            if (fluffyDate == null)
            {
                return(NotFound());
            }

            _personData.DeletePersonFluffyDate(fluffyDate);

            //
            // Update RDF
            //

            var readPerson =
                _personData.ReadAllPersonData(fluffyDate.Person.PersonGuid);

            if (readPerson != null)
            {
                _rdfData.AddOrUpdatePerson(readPerson);
            }

            //
            // Update search index
            //

            // Update selected year type
            switch (fluffyDate.Type)
            {
            case PersonFluffyDateType.Birth:
                _personSearchIndex.MergeYearOfBirth(
                    fluffyDate.Person.PersonGuid.ToString(),
                    null);
                break;

            case PersonFluffyDateType.Death:
                _personSearchIndex.MergeYearOfDeath(
                    fluffyDate.Person.PersonGuid.ToString(),
                    null);
                break;
            }

            // Update age

            // Get updated dates
            var person = _personData.ReadPersonWithFluffyDates(fluffyDate.Person.PersonGuid);

            var birthFluffyDate =
                person.FluffyDates.FirstOrDefault(x =>
                                                  x.Type == PersonFluffyDateType.Birth);

            if (birthFluffyDate?.Year != null)
            {
                var fluffyDateStart =
                    new FluffyDate(
                        birthFluffyDate.Year,
                        birthFluffyDate.Month,
                        birthFluffyDate.Day);

                var fluffyDateEnd =
                    new FluffyDate(
                        DateTime.Now.Year,
                        DateTime.Now.Month,
                        DateTime.Now.Day);

                var deathFluffyDate =
                    person.FluffyDates.FirstOrDefault(x =>
                                                      x.Type == PersonFluffyDateType.Death);

                if (deathFluffyDate?.Year != null)
                {
                    fluffyDateEnd =
                        new FluffyDate(
                            deathFluffyDate.Year,
                            deathFluffyDate.Month,
                            deathFluffyDate.Day);
                }

                var age =
                    new Age(
                        fluffyDateStart,
                        fluffyDateEnd);

                if (age.InYears != null)
                {
                    _personSearchIndex.MergeAge(
                        person.PersonGuid.ToString(),
                        age.InYears);
                }
            }
            else
            {
                _personSearchIndex.MergeAge(
                    person.PersonGuid.ToString(),
                    null);
            }

            //
            // Redirect
            //

            return(RedirectToAction(
                       "Details",
                       "Person",
                       new { personGuid = fluffyDate.Person.PersonGuid }));
        }