Estrelica.Core 3.1.0
Estrelica.Core is a .NET Standard 2.0 library which simplifies and enhances integration with Archer. All aspects of the Archer platform (Metadata, Content, Reports, Datafeeds, Layouts, etc.) exposed via Archer's public APIs are accessible as strongly-typed .NET objects, available on-demand as needed with no explicit API calls on your part.
The Demos solution on github illustrates how to implement a variety of use cases with Estrelica.Core. These demos provide you a starting point for your own custom Archer integration development projects.
Full online documentation is available as well.
Release History:
3.1.0 (Current Release) - Released 2024-10-28
- Added a new "boolean throwExceptionIfNotLoaded = true" parameter to all relevant .Value(xxx) methods in IArcherContentAccess and IArcherContentEdit. This will ensure that non-loaded fields will only be evaluated/modified by intent rather than by accident.
- Added article to documentation describing throwExceptionIfNotLoaded option
- Addressed memory leak that occurred with long-running .Content() access use cases
- Optimized caches to reduce memory use
- Cleaned up ArcherContentAccess (got rid of some local caching that duplicates what's available in MetadataResolver)
- Renamed CustomContentBase to CustomContent (it's abstract, obviously a base class)
- Moved most non-essential CustomContent methods to explicit interface implementations (so Intellisense will show fewer suggested properties/methods, allowing users to focus on the more relevant properties implemented in their classes)
- Added missing Set(IEnumerable<int> contentIds) and Set(IEnumerable<IArcherRecord> contents) methods to IReferencedRecordsSelectionEdit
- Updated CastleHill Software references in getting_started.md to Estrelica Software
- Added support for third-party product licensing (Estrelica.ProductLicense)
- Added IEnumerable<IArcherField> MappedFields property to CustomContent<T>, automatically set when the descendant type is registered, returning all of its [MapField] fields
- Changed SearchOptions.includeFieldIds property to "displayFieldIds" in order to resolve ambiguities where it's called DisplayFieldIds elsewhere.
- Added support for caching content (IContentResolver.CacheContent()) to be retrieved later via IReferencedRecordsSelection field results without requiring them to make additional API calls.
- Added support for automatic reference content caching during any IContentResolver calls that use the Archer search engine or reports via new options available on ISearchOptions and IContentReportOptions
- Added article to documentation describing Referenced Content Caching
- Added capability to define the display fields that will be returned for searches on any level (including cached content returned from referenced levels) via the new IArcherLevel.DisplayFields (IEnumerable<IArcherField>) property.
- Added IArcherLevel.GetDisplayFields() method which can be called to determine which fields will actually be returned by the search engine for a given level, based on (optionally) an ISearchOptions/IContentReportOptions instance, any DisplayFields that have been previously set for the level, and any [MapField] attributes found on CustomContent<T> classes registered for the level. See documentation for full explanation of how this works.
- Added IArcherLevel.ParentLevel and IArcherLevel.ChildLevel properties, useful for navigating the hierarchy of levelled modules (both will return null for non-levelled cases).
- Fixed null reference exception during callback on IArcherLevel(contentId, Action<ISearchDisplayFieldOptions>)
- Updated IArcherLevel.GetMaxLastUpdate(useStatisticsSearch) to ignore the useStatisticsSearch parameter when running on non-Windows OSes, since Archer uses Windows timeZoneIds which are not convertible elsewhere. (The original intent of this parameter was to leverage statistics searches which returned fractionally faster than non-statistics searches, but non-stats searches have been optimized to the point that this is no longer relevant.)
- Fixed issue that caused some newly-inserted Values List Values to still be considered invalid after calling IValuesListSelectionEdit.Set("Some New Value", addUnknownValues: true)
- Optimized level Id determination needed when saving cross-referenced content to eliminate repetitive API calls
3.0.6 - Released 2024-08-01
- Added call to CustomContentFactory.BuildWrapper() in IArcherLevel.CreateContent so IArcherLevel.CreateContent<T> will work as expected.
- Fixed license expiration exception to show the actual (past) expiration date rather than today in the "as of" message
3.0.5 - Released 2024-07-01
- Updated license server URL to licensing.estrelica.com
- Added new ArcherEntityExtensions.ByIdentifier(this IEnumerable<T> values) which accepts (optionally) id, guid, alias and name, returning (by preference in that order) the first item matching the identifier and throws appropriate exception on no item found (if throwExceptionIfInvalid = true, otherwise returns null). Eliminates need to search individually for each identifier.
- Updated CustomContentFactory to use the above
- Added PropertyType enum to MapFieldAttribute
- Updated MetadataBase to cache common values (Alias, Guid, Name) in local variables rather than retrieving them from the internal dictionary on every call
- Removed extraneous Action populateDictionary and Load() method from ArcherEntityBase
3.0.4 - Released 2024-05-29
- Fixed issue causing IBaseDateField.CreateCondition() searches to fail when no timeZoneId is specified. It will now use the date value's DateTimeKind's standard name (i.e. TimeZoneInfo.Utc.StandardName, TimeZoneInfo.Local.StandardName or default to the Archer user's configured timeZoneId if DateTimeKind.Unspecified)
- Updated IArcherLevel.GetMaxLastUpdate() so that both modes (content and statistics search) return equal values (with no milliseconds), always in UTC
3.0.3 - Released 2024-05-29
- Made IArcherContentEdit.ForEdit() automatically reload the record if it has been previously saved to Archer (in order to refresh changes resulting from the save like calc fields)
- Standardized field/level/module name conventions in error messages
- Updated IArcherContentEdit.SaveChanges(bool) so it now accepts a bool (default false) indicating whether the record should be saved in the context of its parent (for use when creating multiple xref/RR/subform records, avoiding the need to keep track of and call SaveChanges() on the owning "parent" record -- just call SaveChanges(true) on the child and Estrelica.Core will figure it out)
- Added DeleteContent() method to IArcherContentEdit (does what it says, returns true if the record was successfully deleted from Archer)
- Updated IArcherContentAccess.Reload() to accept a bool loadAllFields parameter. If true, all fields in the level will be loaded. If false, only those fields that were loaded/edited on the original record will be loaded.
- Added CustomContentBase<T> (see demos for details of use)
- Added default IArcherLevel MappedLevel and IArcherModule MappedModule static automatic properties to CustomContentBase<T>
- Updated IArcherLevel.CreateContent() to validate the target subform better when called with ISubformField
- Added public RegisterCustomTypes() and RegisterCustomType() methods to Core
3.0.2 - Released 2024-05-24
- Added AddNewRecord<T>(...) overloads to IReferencedRecordSelectionEdit
- Refactored IUserGroupListSelectionEdit to be a superset of what's available on IUserGroupListSelection
- Refactored IValuesListSelectionEdit to be a superset of what's available on IValuesListSelection
- Refactored CustomContentBase class to make it easier to create subclasses -- no constructor needs to be defined anymore (and any existing classes should have their constructors removed)
- Refactored CustomContentFactory class registration to provide better error messaging on ineligible types
- Enhanced custom class handling to allow classes to be nested (e.g. for mapping nested classes to Archer levelled modules)
- Improved ContentResolver searches for levelled content (resolving parent Ids for each level formerly used a separate search API call, now it's implemented in the content search)
- Added IArcherCustomContent interface to CustomContentBase, which makes the wrapped IArcherContentAccess object available directly via a Content property should it ever be needed
- Updated RegisterCustomContentType() logic to group multiple [MapField] errors together in an AggregateException and to provide better information when an incorrect field type is mapped to an IArcherField-descendant interface
3.0.1 - Released 2024-05-22
- Added default [MapField] (no identifier required) for standard field types (ITrackingIdField, IFirstPublishedField, ILastUpdatedField) which will map the first field (ordered by Id) of the relevant type found in the level. E.g. [MapField] when applied to an ILastUpdatedField property will inject the first Last Updated field found for the level. An exception will be thrown when applied to any other field types (those require a name, alias, and/or guid).
- Ensured that all [MapField], [MapReferenceField] and [MapLevel] lookups resolve first by Guid, then Alias, then Name (depending on which are configured)
- Added default [MapField] (no identifier required) for standard field types (ITrackingIdField, IFirstPublishedField, ILastUpdatedField) which will map the first field (ordered by Id) of those types found in the level. E.g. [MapField] when applied to an ILastUpdatedField property will inject the first Last Updated field.
- Added bool "optional" (default false) parameter to all [MapField] attributes (allows testing in different environments where the mapped field may not exist -- be sure to check the static field property for null before using it if optional == true)
- Updated search xml comments to include Module and Level info for all fields when includeXmlComments == true
3.0.0 - Released 2024-05-21
- Added double lock logic to TimeoutDictionary
- Added support to handle Archer content with your own custom content classes
- Added Estrelica.Archer.Content.Custom.CustomContentBase to serve as base class for custom content class implementation
- [MapField], [MapLevel] and [MapReferenceField] attributes to allow automatic injection of Level and Fields into custom content classes
- Fixed loading of multi-level xml in ArcherContentAccess so it doesn't need to re-fetch the content a second time when accessed via a cross-ref field from Level X to Level X+1 (for a levelled record loaded via XML, this will return the same IEnumerable<IArcherContentAccess> that's available via the ChildContent property)
- Changed the IArcherContentAccess.ChildContent property so it returns Enumerable.Empty<IArcherContentAccess> rather than null if no child records were loaded
- Implemented IArcherContentAccess.ChildContentAs<T>() to allow retrieving child content as a custom class (assuming the class has been registered for the child level)
- Implemented bool IsLevelReference property on IIsLevelReferenceProperty interface (present on both ICrossReferenceField and IRelatedRecordsField) to easily identify which fields form the relationship between levels
- Implemented Content<T>() methods on IArcherModule and IArcherLevel to support custom content types
2.5.9 - Released 2024-05-16*(not released, held back in favor of 3.0.0, all changes included there)*
- Added wrapperCallback to allow IArcherContentAccess to be wrapped with a custom implementation of the user's choice,
- Added BaseCustomContent class to serve as a starting point for users who want to create their own custom implementations,
- Added support for caching content to be returned later via xref/RR/subform fields and levelled content (to minimize the number of API calls required when dereferencing IReferencedRecordsSelection.Content)
- Added IArcherLevel.GetMaxLastUpdate() method to return the Last Updated field result from the most-recently modified record in a given level
- Renamed Timezone class to TimezoneHelper in order to reduce confusion with System.TimezoneInfo
- Fixed issue that was causing IAPIFacade.ExecuteSearch() to fail on <SearchStatisticReport>... searches
- Updated all cases where statistics reports were formerly returning IEnumerable<string> so they now return IEnumerable<XElement> (still a WIP, eventually some cases will return a complex object akin to IArcherContentAccess but more research is needed)
- Added IContentResolver.GetContentInfo() and IContentResolver.GetUpdatedContentInfo() which returns extended info about content records when API extensions are available, less so if not (Archer's API doesn't return as much detail as the Extended API, but it at least provides the user Last Updated value which can be valuable in some cases)
2.5.8 - Released 2024-04-19
- Changed FieldType.CastScoreCard -> CrossModuleStatusTracking to align with the Admin UI
- Updates to ArcherContentAccess.CoerceResult() to address numeric field rounding issues
- Added many new properties for fields
- Fixed issue that was causing HTTP retries on server disconnect to fail
- Improved cache cleanup
- Fixed IArcherReport.DisplayFields to ensure that it never returns null (now returns an empty IEnumerable<IDisplayField> instead)
- Fixed IArcherContentAccess.Value() so Values List, UG, Cross-Ref, Related Records and Subform fields no longer return null when not populated (they all return an empty selection object instead)
- Fixed NullReferenceException that occurred if fieldMetadataCallback was not null on a report content search that returns no records
- Fixed API handling of search on Statistics Reports (contrary to Archer's documentation, unlike all other searches they start at page 0, not page 1)
- Refactored IArcherReport into sub-interfaces IContentReport and IStatisticsReport, each with their own .Content() methods
- Implemented IStatisticsReport.Content() to return IEnumerable<string> representing the XML returned directly from the API ExecuteStatisticSearchByReport results. Note that this will change in a future version to return a more complex object type to make evaluating the results easier. The XML will still be available via APIFacade.ExecuteStatisticsReport() after that change however.
- Changed IDatafeed.NextScheduledParent property type from Guid to IDatafeed, returning an actual datafeed object representing the parent feed rather than just its Guid. If you still need the parent datafeed's Guid it's available via datafeed.NextScheduledParent?.Guid, but note that while in the past this property returned Guid.Empty if no parent exists, doing the above will return a null Guid? instead. To retain current functionality, use IDatafeed.NextScheduledParent?.Guid ?? Guid.Empty.
- Added IDatafeed.NextScheduledChildren (inverse of IDatafeed.NextScheduledParent)
- Fixed issue that caused repeated calls to the license API server while in an expiration grace period (now limited to one call per day)
2.5.7 - Released 2024-03-27
- Added IEnumerable<IArcherContentAccess> Content() to IArcherReport
- Added IEnumerable<IArcherContentAccess> Content(contentIds, Action<ISearchDisplayFieldOptions> fieldOptionsCallback) methods to IArcherModule and IArcherLevel which will return records for the indicated contentIds (optionally limited to the fields set via the callback) if the content exists in the module/level
- Added Action<ISearchDisplayFieldOptions> fieldOptionsCallback parameter to the existing IArcherModule/IArcherLevel Content(contentId) method so fields can be limited in those calls as well
- Changed all of the fieldOperatorOrder references back to fieldOperatorLogic (since the relevant Archer search XML node is named "OperatorLogic")
- Added more chainable methods (RecordCountCallback, SearchXmlPreview, PageSize, FilterOperatorLogic, ContainedDisplayFieldsFilter, IncludeDisplayFieldCallback) to ISearchOptions
2.5.6 - Released 2024-03-25
- Added IReportResolver.DatafeedByName() method
- Added chainable .AddDisplayField(), .AddSortField() and .AddFilterCondition() methods to ISearchOptions()
- Added IArcherContentEdit.SaveChanges() method (no need to explicitly call core.Content.Update(record) any longer, although that's still supported)
- Renamed Estrelica.Archer.Metadata.SortType to ValueSortType to avoid ambiguity with Estrelica.Archer.Content.SortType
- Fixed issue in ContentResolver that was failing to default sort field on searches to a TrackingId/FirstPublished field unless it was included in the display fields
- Added sortFields to ISearchOptions to allow user to specify the sort fields/order
- Added includeXmlComments (bool) property to ISearchOptions which, when combined with searchXmlPreview, makes debugging easier by adding type and name comments to the XML for every field/module involved in the search
2.5.5 - Released 2024-03-20
- Implemented HttpRequestException on APIFacade.ExecuteDatafeed if Archer returns "IsSuccessful": false, wrapping whatever error is returned in "ValidationMessages".
- Added .Content(Action<ISearchOptions>) methods directly to IArcherLevel and IArcherModule, allowing IEnumerable<IArcherContentAccess> results to be retrieved directly from a Module/Level without extra code involving Content resolver.
2.5.4 - Released 2024-03-13
- Added core.APITimeoutSeconds setting to manage the number of seconds that all API calls will wait for a response from Archer before timing out and raising an exception (default 500, minimum 30)
- Added handling for System.IO.IOException "Unable to read data" to search calls
2.5.3 - Released 2024-02-26
- Added more null conversions to empty IEnumerable
- Implemented SearchXmlPreview callback on IContentResolver
- Fixed null reference error on DeferEnumerable<T>
2.5.2 - Released 2023-12-14
- Fixed issue in DatabaseFacade that caused dates to be returned with DateTimeKind Unspecified rather than UTC
- Fixed issue on ValuesListSelectionEdit that caused Set(xxx, addUnknownValues: true) to fail when the ValuesList exists in the MetadataResolver cache
- Fixed issue that caused throwExceptionIfInvalid: false to be ignored in MetadataResolver.IdToGuid()
- Added DeleteValuesListValue() overload using value name to MetadataResolver
- Updated ReportResolver to handle Archer server errors occurring while loading SearchOptions on an IDictionary report result
- Added OnReset and OnLoad events to IDeferrable
- Added ValuesListChanged event to IMetadataResolver so anyone who wants to know when a VL and/or VLV is modified can be notified about it
2.5.1 - Released 2023-11-07
- Implemented invalidation logic for IDatafeed references so that a given datafeed's LastRun and History will get invalidated/reloaded whenever the APIFacade.ExecuteDatafeed() method is called on its GUID (so the IDatafeed will be able to see the result of the execution).
- Added Refresh() method to IDatafeed so a user can force the same reload if they think the loaded status(es) might be stale (e.g. if the datafeed was started by some entity other than the current Estrelica.Core instance).
- Added Execute(bool includeReferenceFeeds = false) method to IDatafeed, so a datafeed may be executed directly from its IDatafeed reference without having to pass its GUID in a separate call to APIFacade.ExecuteDatafeed() or core.Report.ExecuteDatafeed() (all three approaches do the same thing, so this is just a convenience method).
2.5.0 - Released 2023-10-29
- Added two new hooks to Estrelica.Core: RequestHeaderCallback (Action<IDictionary<string, string>>) allows customer code to evaluate and/or modify the headers that are sent with each Archer API call ExceptionRetryCallback (Func<Exception, bool>) will be called whenever an unhandled exception occurs during an API call, and if the result is true, the API call will be retried (up to 5 times before failing outright). Together these two hooks may be used to inject any special headers needed for API gateway authorization, and to recognize and handle errors returned by the gateway when reauthorization is needed
- Complete rewrite of all Archer SOAP API calls to eliminate WCF dependencies so that SOAP calls may participate in the new logic introduced above
- Added UserByUsername overload to IAccessResolver which optionally accepts a user domain for lookup (requires extensions)
- Added parent field info to all of the relevant CreateCondition methods to handle fields that are on subforms (which require a ParentField reference in their xml search conditions)
- Modified ValuesListSelection to allow new values to be inserted into the VL and attached to the record in one call (via the new addUnknownValues parameter on the setters, behaves like the "Add unknown source values to the target values list" option in the DFM)
- Fixed issue where adding a VLV to an empty VL caused the VL to remain empty.
- Added support for getting all datafeeds (basic info from Archer, more info if extensions are available) via APIFacade and ReportResolver
- Improved parsing of error messages for SOAP calls.
- Added logic to build out child module relationships in search if filter criteria is provided that references a field in another module
- Added methods to create/delete VLVs on MetadataResolver.
2.4.7 - Released 2023-08-07
- Added methods (FieldHistory, FieldHistoryAsOf, HistoryAsOf) to IArcherContentAccess to get content history for specific fields and/or points in time (via an "asOfUTC" parameter).
2.4.6 - Released 2023-07-06
- Added support for retrieving content history via new IContentHistory implementation (including field, workflow and signature audit info) available through IContentResolver.GetContentHistory() methods and IArcherContentAccess.ContentHistory property.
2.4.5 - Released 2023-06-09
- Fixed issue regarding empty JSON array in ArcherContentAccess and wrapped parsing logic with try..catch to better identify any future problem nodes
- Fixed .ContentAccess() extension method to properly return null when called on a null XElement/JSON record (rather than an empty uninitialized IArcherContentAccess result)
- Added .CreateIsEmptyCondition() and .CreateIsNotEmptyCondition methods for IDateField, INumericField, IValuesListField, IUserGroupListField, ITextField and IReferenceField (although the latter is not yet working for subforms)
- Added GuidToId() method to IMetadataResolver (requires extensions)
- Added GetReportSearchOptions(Guid) to IReportResolver
- Updated ArcherContentAccess to load full UpdateInformation even when Extensions are unavailable
2.4.4 - Released 2023-06-02
- Cleaned up references to RSA Archer in comments and exceptions
- Fixed issue that was surfacing a 404 error on startup while probing for the Extended API in scenarios where it does not exist
- Updated HistoryLog field logic in ContentResolver to disregard field types that are not tracked by HL fields
2.4.3 - Released 2023-05-03
- Added handling for Workflow (see IWorkflowNode and IWorkflowAction interfaces in Estrelica.Archer.Content as well as the WorkflowNode(), WorkflowActions(), and PerformWorkflowAction() extension methods on IArcherContentAccess, IAPIFacade methods GetWorkflowActions() and PerformWorkflowAction(), and IContentResolver methods GetWorkflowNode() and PerformWorkflowAction(). All of these methods provide different ways to do the same thing (evaluate and perform workflow actions) based on different implementation use cases.)
2.4.2 - Released 2023-03-31
- Improved TimeoutDictionary (using SpinLock rather than traditional locks)
2.4.1 - Released 2023-03-28
- Added role validation to DatabaseFacade
- Added ContainingField and Flatten() extension method to IDisplayField
- Added IEnumerable<IDisplayField> "DisplayFields" property to IArcherReport
- Started work on undocumented API call to get integer Report Ids from Archer
- Added WebProxy to SOAP calls
- Added UniqueNonEmpty extension method for IEnumerable<string>
2.4.0 - Released 2023-03-23
- Updated IArcherContentAccess.Reload() to update itself in place rather than returning a new instance
- Updated all ArcherEntity types to include OriginId (an integer hash of the url/instance they were loaded from) for distinguishing identity of same type/same id entities loaded from two Archer instances
- Implemented IArcherEntity.Equals() in support of same (to improve equality comparisons for entities that have been reloaded across cache flushes -- they will now be considered equal if their OriginId, Id and EntityType are the same. Note that this does not consider any other properties, only the origin/identity/type of the IArcherEntity)
- Made significant improvements to resolver caching
- Simplified CellKeeper and made everything just use TimeoutDictionary
- Moved all the Resolvers' InstanceKey logic into the CachedSessionResolver base class
- Added ability to preview the search xml before it's sent to Archer in GetContent(ContentSearchOptions) by assigning an Action<string> callback to searchXmlPreview
- Added checks for no display fields in search (which causes Archer to return 0 records)
- Added ParentId to IArcherRecord (for levelled content)
- Implemented IReportResolver.ReportDisplayFields() (returning IEnumerable<IDisplayField>)
2.3.33 - Released 2023-03-07
- Fixed null reference exception when trying to add external links where they aren't already present on the record
- Fixed issue that was causing Archer's 500 - Internal Server Error not to be caught when calling IAPIFacade.GetAllRoles()
2.3.32 - Released 2023-03-06
- Added entityTypeName (e.g. "Application", "Level", etc.) to ArcherNamedEntityKeeper to clarify exception messages
- Included check for "Unable to validate session" in token error check (for retrying API calls)
- Made UseRESTLogin default to false (so session logins will occur via the Webservices API by default, in order to support SSO customers with manual logins disabled)
- Implemented editor for External Links
2.3.30 - Released 2023-02-04
- Fixed issue in ArcherContentAccess that caused "OtherText" to be null for ValuesListSelections loaded via REST API (it was working already for XML)
2.3.29 - Released 2023-02-17
- Added KeyFieldValue property to IArcherRecord (returns value of the Key field if one is defined, TrackingId if not)
- Fixed issue where subform content loaded via XML did not have ContentKeys
2.3.28 - Released 2023-02-07
- Allowed Core.SessionProvider to be assigned by the caller
- Updated ArcherContentAccess and ReferencedRecordsSelection to get subform content directly from Search/Report XML without having to call the REST API on Ids
- Updated everywhere that GetContentByIds() is in scope to default to treating "Resource Not Found" (e.g. where the user has no permission to the records) as an empty result rather than surfacing exceptions returned by Archer
2.3.27 - Released 2023-02-07
- Fixed error in "valid value names" message
- Added logic to terminate a search if same page is returned twice (as occurs on some levelled reports)
- Added optimization to cache all fields for level when MetadataResolver.FieldById is called (anticipating future calls for other fields from the same level)
- Added option to pass in an existing session token when initializing Core (reducing startup cost for frequently-invoked processes)
- Added new methods to IAPIFacade to support paged ExecuteReport() calls similar to ExecuteSearch() (rather than iterating and returning the whole report in one call)
2.3.26 - Released 2023-01-30
- Added ability to add files to Attachment/Image fields by document Id
- Implemented IReferencedRecordsSelection.ContentKeys for records loaded via REST API
- Changed "caseInsensitive" throughout to "ignoreCase" for consistency
- Added ByGuid(string) ArcherEntity extension methods
- Added ability to update VLs and VLVs with cache invalidation
- Added capability to login optionally via the SOAP API for SSO environments where REST login is unavailable
- Added capability to inject a WebProxy in all API calls
- Added optional predicate to IArcherLevel.FieldsOfType<FT>
- Added option to ignore case when setting VLVs by name (default true)
- Exposed ExecuteSearch(searchOptionsXml) on IContentResolver for ad hoc xml searches
2.3.24 - Released 2023-01-12
- Added support for getting "ContentKeys" (i.e. TrackingId/Key) from IReferencedRecordsSelection for results loaded from XML (without requiring another API call)
- Added GetLevelForContent(contentId) method to Content resolver (quickly identifies which level a given Content Id exists in without pulling the full record)
- Added support to get search options by Guid for cases where int report Id is unavailable
- Moved RetryOperation from APIHelper to Estrelica.Utility to allow it to be used elsewhere
- Added support for storing Estrelica.Core license key somewhere other than a file (e.g. SQL server, S3 bucket, etc.)
- Updated TimeoutDictionary to use ConcurrentDictionary internally to try to overcome spurious and harmelss "key xxx has already been added" errors coming from .NET
- Added ContentKeys property to IRelatedRecordsSelection
- Added GetContentForFieldIds() method to IReferencedRecordsSelection
- Added CONST declarations for all the ws endpoints in APIFacade
- Added handling for 500 Internal Server errors to the Archer Roles API call
2.3.22 - Released 2022-12-15
- Added support for downloading attachments as zip file/stream
- Refactored GetReportContent(Guid) to eliminate need to convert Guid to Int id via Extended API
- Added ReportDisplayFields() method to ReportResolver so metadata can be retrieved even if the report has no returned content
- Added "DisableSSLCertificateVerification" to Estrelica.Core for testing with self-signed SSL certs
- Added IHttpClientAccessor interface to allow all HTTP requests to be inspected/modified before dispatch
2.3.19 - Released 2022-11-09
- Modified GetIdGuidMappings to return empty dictionary rather than null for entity types with no Guid
- Added override to ReferencedRecordsSelection to allow AddNewRecord() at a specific level by int levelId or IArcherLevel reference
- Removed GetSearchableFields() from ContentResolver, as it is no longer needed (all field types are searchable now)
- Fixed APIFacade.ExecuteReport() to return an empty <Records> node rather than null after the last page of records
- Implemented ValuesList/ValuesListValue editors
2.3.18 - Released 2022-10-12
- Fixed issues with APIFacade.ExecuteReport and ContentResolver.ExecuteReportInternal
2.3.17 - Released 2022-10-7
- Implemented CreateCondition for IReferenceField
- Added more methods to IAccessResolver for deleting user/group/role by object or id
- Added TerminateSession method to IAPIFacade
- Added Estrelica.Archer.Metadata.Timezone helper class to make it easier to work with Archer's Timezone strings
- Added capability to change user passwords via IArcherUserEdit and IAPIFacade
- Added CreateUser() to IAccessResolver
2.3.15 - Released 2022-09-15
- Fixes for populating read only fields on newly-inserted records
- Fix for null reference error on FilterCriteria objects having no FilterConditions
- Added more logging on startup re: Extended API and Archer versions
- Modified invocation logic to allow a non-default license location to be specified
- Updated StringExtensions.ConformPathSeparator to allow conversion from Linux to Windows (rather than just Windows to Linux as before)
2.3.12 - Released 2022-08-09
- Refactored all the common "referenced records" behavior into specific methods for CR/RR/Subform
- Implemented FilterCriteria helpers for all remaining field types
- Implemented support for executing reports via IContentResolver
- Implemented logic to support getting records modified since a given datetime (still need to do this for non-extended cases, where LUD is the only option)
2.3.9 - Released 2022-03-23
- Eliminated Estrelica.Interfaces.Archer and Estrelica.Archer.Datafeeds namespaces (Datafeeds and related entities are now in Estrelica.Archer.Content)
- Implemented ISetDateOption type for EventAction
- Added Where<IArcherField>(predicate), First<IArcherField>(predicate) and FirstOrDefault<IArcherField>(predicate) extensions for IEnumerable<IArcherField>
- Added Where<IArcherModule>(predicate), First<IArcherModule>(predicate) and FirstOrDefault<IArcherModule>(predicate) extensions for IEnumerable<IArcherModule>
- Added IArcherLevel TargetLevel and IArcherApplication TargetApplication properties to IArcherQuestionnaire
- Fixed issue where ContentResolver.GetContentInformationForLevelId() returned stale info after content was updated/inserted
2.3.8 - Released 2022-02-09
- Relaxed some of the required/min/max rules on content update in order to better match Archer UI behavior
- Added an option to bypass record validation on ContentResolver.Update()
- Implemented "treatResourceNotFoundAsNull/Empty" on most of the relevant APIFacade methods (and changed the default behavior from false to true in most cases)
- Implemented fix for the various interpretations of min/max settings so they all resolve on the same interfaces
- Moved ForEdit() from an extension method to a method on the IArcherContentAccess interface
- Added codegen support
- Moved DebugLog and Logger from Estrelica.Logging to Estrelica.Utility project
- Added "Name" property to TimeoutDictionary for cache debugging
- Added ConformPathSeparators() method to StringExtensions for path support under Linux
2.3.3 - Released 2022-01-10
- Fixed issue with tblIVFieldDef (module_id not present in some dbs)
2.2.4 - Released 2021-05-04
- Initial public NuGet release
2.1.1 - Released 2021-04-19
- Renamed "SubForm" to "Subform" for consistency
- Refactored ArcherSearchResult into ArcherContent
- Added editors for DateValue, NumericValue, TextValue and ReferencedRecords
- Updates to ValuesListSelection editor (Add and Remove methods, more validation)
- Added Contacts to ArcherUser, Implemented handling of Contacts records through AccessResolver
- Implemented common IReferenceField.ReturnFields property on cross-ref
- RR and subform fields (returns the opposing field(s) from the corresponding module)
- Implemented User update via AccessResolver
- Implemented linked content creation via xref/RR/subform fields in records
- Added ExtendedAPIVersion method to APIFacade
- Converted ArcherVersion field to a property on APIFacade
- Added GetAllContacts and GetContactsForUser methods to APIFacade
- Fixed content insert/update APIFacade methods (forceGETOverride needs to be false)
- Refactored a lot of namespaces to minimize how many "usings" are required -- this led to a lot of discrepancies between project/folder structure and class namespaces, but will make things more sensible for consuming developers
- Added serialization extensions for IArcherEntity
2.1.0 - Released 2021-04-01
- Refactored all the resolvers to use interfaces
- Implemented some adjustment over cache lifetimes
- Implemented expectedIds handling for ContentResolver.GetModuleContent()
- Implemented CrossRef <-> RelatedRecords <-> Subform field visibility
- Created "NugetPackager" to help build nuget packages for Estrelica.Core
1.2.0 - Released 2021-02-27
- Updates for content and datafeeds
- Introduced specific .NET types (IArcherEntity and descendants) for all dictionaries return from API calls
- Implemented edit capability for Groups
- Refactored SqlUtilities into extension methods for SqlConnection
- Added logic to populate "Depth", "ParentLevelId" and "ParentLevelGuid" to all levels returned via APIFacade
- Updates to ContentResolver to ensure all levelled content reflects parentIds correctly
- Fixed UTC xmlConvertedValue dates in UpdateInformation returned by ContentResolver
- Added docfx to Estrelica.Core
- Eliminated "Builder" class and made everything work directly on Estrelica.Core instead
- Added several interfaces for ArcherContent
- Added file retention/cleanup logic to FileLogger
- Moved SqlLogger over to the Estrelica.DataUtility.Workflow project where it belongs
- Implemented Roles and basic content fetching
1.0.0 - Released 2020-03-08
- Extracted Estrelica.Core from Estrelica.DataUtility for reuse in other projects
Showing the top 20 packages that depend on Estrelica.Core.
Packages | Downloads |
---|---|
Estrelica.Core.Configuration
Allows Estrelica.Core validation and authentication with Archer to be easily managed via appSettings.json and/or local user secrets.
|
0 |
Estrelica.Core.Configuration
Allows Estrelica.Core validation and authentication with Archer to be easily managed via appSettings.json and/or local user secrets.
|
5 |
Estrelica.Core.Configuration
Allows Estrelica.Core validation and authentication with Archer to be easily managed via appSettings.json and/or local user secrets.
|
20 |
Estrelica.Core.Configuration
Allows Estrelica.Core validation and authentication with Archer to be easily managed via appSettings.json and/or local user secrets.
|
42 |
Estrelica.Core.Configuration
Allows Estrelica.Core validation and authentication with Archer to be easily managed via appSettings.json and/or local user secrets.
|
66 |
Estrelica.Core.Configuration
Allows Estrelica.Core validation and authentication with Archer to be easily managed via appSettings.json and/or local user secrets.
|
76 |
Estrelica.Core.Configuration
Allows Estrelica.Core validation and authentication with Archer to be easily managed via appSettings.json and/or local user secrets.
|
106 |
Estrelica.Core.Configuration
Allows Estrelica.Core validation and authentication with Archer to be easily managed via appSettings.json and/or local user secrets.
|
107 |
Estrelica.Core.Configuration
Allows Estrelica.Core validation and authentication with Archer to be easily managed via appSettings.json and/or local user secrets.
|
108 |
Estrelica.Core.Configuration
Allows Estrelica.Core validation and authentication with Archer to be easily managed via appSettings.json and/or local user secrets.
|
199 |
Estrelica.Core.Configuration
Allows Estrelica.Core validation and authentication with Archer to be easily managed via appSettings.json and/or local user secrets.
|
618 |
Estrelica.Core.Configuration
Allows Estrelica.Core validation and authentication with Archer to be easily managed via appSettings.json and/or local user secrets. As of v1.0.23, configuration may also be provided via a user-generated IConfigurationRoot object.
|
1 |
Estrelica.ProductLicense
Allows Estrelica partners to include and license Estrelica.Core (v 3.1.0 or later) for deployment in their products. Contact Estrelica Software for contract information.
|
1 |
3.1.0 - Released 2024-10-28
- Added a new "boolean throwExceptionIfNotLoaded = true" parameter to all relevant .Value(xxx) methods in IArcherContentAccess and IArcherContentEdit. This will ensure that non-loaded fields will only be evaluated/modified by intent rather than by accident.
- Added article to documentation describing throwExceptionIfNotLoaded option
- Addressed memory leak that occurred with long-running .Content() access use cases
- Optimized caches to reduce memory use
- Cleaned up ArcherContentAccess (got rid of some local caching that duplicates what's available in MetadataResolver)
- Renamed CustomContentBase to CustomContent (it's abstract, obviously a base class)
- Moved most non-essential CustomContent methods to explicit interface implementations (so Intellisense will show fewer suggested properties/methods, allowing users to focus on the more relevant properties implemented in their classes)
- Added missing Set(IEnumerable<int> contentIds) and Set(IEnumerable<IArcherRecord> contents) methods to IReferencedRecordsSelectionEdit
- Updated CastleHill Software references in getting_started.md to Estrelica Software
- Added support for third-party product licensing (Estrelica.ProductLicense)
- Added IEnumerable<IArcherField> MappedFields property to CustomContent<T>, automatically set when the descendant type is registered, returning all of its [MapField] fields
- Changed SearchOptions.includeFieldIds property to "displayFieldIds" in order to resolve ambiguities where it's called DisplayFieldIds elsewhere.
- Added support for caching content (IContentResolver.CacheContent()) to be retrieved later via IReferencedRecordsSelection field results without requiring them to make additional API calls.
- Added support for automatic reference content caching during any IContentResolver calls that use the Archer search engine or reports via new options available on ISearchOptions and IContentReportOptions
- Added article to documentation describing Referenced Content Caching
- Added capability to define the display fields that will be returned for searches on any level (including cached content returned from referenced levels) via the new IArcherLevel.DisplayFields (IEnumerable<IArcherField>) property.
- Added IArcherLevel.GetDisplayFields() method which can be called to determine which fields will actually be returned by the search engine for a given level, based on (optionally) an ISearchOptions/IContentReportOptions instance, any DisplayFields that have been previously set for the level, and any [MapField] attributes found on CustomContent<T> classes registered for the level. See documentation for full explanation of how this works.
- Added IArcherLevel.ParentLevel and IArcherLevel.ChildLevel properties, useful for navigating the hierarchy of levelled modules (both will return null for non-levelled cases).
- Fixed null reference exception during callback on IArcherLevel(contentId, Action<ISearchDisplayFieldOptions>)
- Updated IArcherLevel.GetMaxLastUpdate(useStatisticsSearch) to ignore the useStatisticsSearch parameter when running on non-Windows OSes, since Archer uses Windows timeZoneIds which are not convertible elsewhere. (The original intent of this parameter was to leverage statistics searches which returned fractionally faster than non-statistics searches, but non-stats searches have been optimized to the point that this is no longer relevant.)
- Fixed issue that caused some newly-inserted Values List Values to still be considered invalid after calling IValuesListSelectionEdit.Set("Some New Value", addUnknownValues: true)
- Optimized level Id determination needed when saving cross-referenced content to eliminate repetitive API calls
.NET Standard 2.0
- Microsoft.CSharp (>= 4.7.0)
- RedGate.SmartAssembly.Attributes (>= 8.2.1.5254)
- Newtonsoft.Json (>= 13.0.1)
- System.ComponentModel.Primitives (>= 4.3.0)
- System.Configuration.ConfigurationManager (>= 6.0.1)
- System.Data.SqlClient (>= 4.8.6)
- System.Net.Http (>= 4.3.4)
- System.ServiceModel.Duplex (>= 4.10.0)
- System.ServiceModel.Http (>= 4.10.0)
- System.ServiceModel.NetTcp (>= 4.10.0)
- System.ServiceModel.Security (>= 4.10.0)
- Microsoft.Extensions.Caching.Memory (>= 7.0.0)
- System.ServiceModel.Primitives (>= 4.10.0)
- System.IdentityModel.Tokens.Jwt (>= 7.6.0)
Version | Downloads | Last updated |
---|---|---|
3.1.0 | 11 | 10/31/2024 |
3.0.6 | 97 | 08/02/2024 |
3.0.5 | 64 | 07/02/2024 |
3.0.4 | 129 | 05/30/2024 |
2.5.8 | 54 | 04/26/2024 |
2.5.7 | 41 | 03/27/2024 |
2.5.6 | 15 | 03/26/2024 |
2.5.5 | 10 | 03/21/2024 |
2.5.4 | 16 | 03/13/2024 |
2.5.3 | 41 | 02/27/2024 |
2.5.2 | 143 | 12/14/2023 |
2.5.1 | 59 | 11/07/2023 |
2.5.0 | 25 | 10/30/2023 |
2.4.7 | 146 | 08/07/2023 |
2.4.6 | 80 | 07/07/2023 |
2.4.5 | 42 | 06/09/2023 |
2.4.4 | 17 | 06/02/2023 |
2.4.3 | 46 | 05/03/2023 |
2.4.1 | 73 | 03/28/2023 |
2.4.0 | 16 | 03/21/2023 |
2.3.33 | 28 | 03/08/2023 |
2.3.32 | 3 | 03/06/2023 |
2.3.30 | 30 | 02/25/2023 |
2.3.29 | 13 | 02/18/2023 |
2.3.27 | 25 | 02/07/2023 |
2.3.26 | 21 | 01/30/2023 |
2.3.25 | 15 | 01/20/2023 |
2.3.24 | 19 | 01/12/2023 |
2.3.23 | 14 | 01/05/2023 |
2.3.22 | 48 | 12/15/2022 |
2.3.21 | 22 | 12/07/2022 |
2.3.20 | 3 | 12/05/2022 |
2.3.19 | 59 | 11/09/2022 |
2.3.18 | 42 | 10/13/2022 |
2.3.17 | 42 | 09/21/2022 |
2.3.15 | 13 | 09/14/2022 |
2.3.14 | 4 | 09/13/2022 |
2.3.13 | 32 | 08/30/2022 |
2.3.12 | 197 | 06/03/2022 |
2.3.11 | 3 | 06/01/2022 |
2.3.9 | 171 | 03/23/2022 |
2.3.3 | 133 | 12/30/2021 |
2.3.2 | 30 | 12/17/2021 |
2.3.1 | 0 | 12/17/2021 |
2.3.0 | 1 | 12/17/2021 |
2.2.5 | 11 | 12/10/2021 |
2.2.4 | 125 | 10/10/2021 |
2.2.3 | 0 | 10/10/2021 |
2.2.2 | 3 | 10/08/2021 |
2.2.1 | 0 | 10/08/2021 |
2.1.29 | 5 | 10/06/2021 |
2.1.28 | 32 | 09/22/2021 |
2.1.27 | 149 | 07/15/2021 |
2.1.23 | 104 | 05/27/2021 |