Skip to content

Releases: ChuckNovice/RecurringThings

v0.1.0-alpha.8

28 Jan 05:46
b694593

Choose a tag to compare

v0.1.0-alpha.8 Pre-release
Pre-release

What's Changed

MongoDB Convention-Based Serialization

  • Removed all BSON attributes from MongoDB documents
  • Added convention-based serialization for consistent configuration:
    • NamedIdMemberConvention - Maps "Id" property to MongoDB "_id" field
    • CamelCaseElementNameConvention - Converts property names to camelCase
    • IgnoreIfNullConvention - Excludes null properties from serialization
    • GuidStringRepresentationConvention - Serializes Guid properties as strings
  • Added custom StringGuidSerializer to fix "GuidRepresentation is Unspecified" error in newer MongoDB drivers
  • Added MongoDbInitializer for centralized convention registration

Full Changelog: v0.1.0-alpha.7...v0.1.0-alpha.8

v0.1.0-alpha.7

28 Jan 02:12
148a121

Choose a tag to compare

v0.1.0-alpha.7 Pre-release
Pre-release

Changes

API Surface Improvements

  • Make Domain classes (Recurrence, Occurrence, OccurrenceException, OccurrenceOverride) internal to hide implementation details
  • Make repository interfaces internal
  • Make RecurrenceEngine and MongoDB repositories/mapper internal
  • Change CreateRecurrenceAsync and CreateOccurrenceAsync to return CalendarEntry instead of domain types

CalendarEntry Property Accessibility

  • Immutable (init): Organization, EntryType, TimeZone, RecurrenceId, OccurrenceId, OverrideId, ExceptionId, RecurrenceDetails, Original
  • Mutable (set): StartTime, Duration, Extensions
  • Mutable on standalone/recurrence only: Type, ResourcePath
  • Internal: EndTime (computed value)

Other Changes

  • Add OriginalResourcePath tracking for database lookups when ResourcePath is modified
  • Allow Type and ResourcePath changes on standalone occurrences (previously blocked)
  • Block Type and ResourcePath changes on virtualized occurrences (inherit from parent recurrence)
  • Add InternalsVisibleTo for test projects and DynamicProxyGenAssembly2

Breaking Changes

Change Before After
CreateRecurrenceAsync return type Task<Recurrence> Task<CalendarEntry>
CreateOccurrenceAsync return type Task<Occurrence> Task<CalendarEntry>
Domain classes visibility public internal
Repository interfaces visibility public internal
CalendarEntry.Organization set init
CalendarEntry.EntryType set init
CalendarEntry.TimeZone set init
CalendarEntry.EndTime set internal set
Standalone occurrence Type/ResourcePath immutable mutable

v0.1.0-alpha.5

27 Jan 23:39
1783cf7

Choose a tag to compare

v0.1.0-alpha.5 Pre-release
Pre-release

Breaking Changes

  • Removed RecurrenceEndTime from RecurrenceCreate - The recurrence end time is now automatically extracted from the RRule UNTIL clause
  • Removed RecurrenceEndTime from RecurrenceDetails - Use the RRule to parse the end time if needed

Changes

  • Simplified API: no longer need to pass redundant RecurrenceEndTime that duplicates the RRule UNTIL value
  • Replaced regex-based RRule validation with Ical.Net's RecurrencePattern parser for more robust validation

Migration

Before:

new RecurrenceCreate
{
    RRule = "FREQ=DAILY;UNTIL=20261231T235959Z",
    RecurrenceEndTime = new DateTime(2026, 12, 31, 23, 59, 59, DateTimeKind.Utc), // redundant
    ...
}

After:

new RecurrenceCreate
{
    RRule = "FREQ=DAILY;UNTIL=20261231T235959Z",
    // RecurrenceEndTime is extracted automatically from UNTIL
    ...
}