case class DynamicsClient(http: Client[IO], connectInfo: ConnectionInfo, debug: Boolean = false)(implicit F: ApplicativeError[IO, Throwable], e: ExecutionContext) extends LazyLogger with DynamicsClientRequests with ClientMethods with Product with Serializable
Dynamics specific client. Its a thin layer over a basic HTTP client that formulates the HTTP request and minimually interprets the response.
All of the methods either return a IO or a Steam. The IO or Stream must be run in order to execute the operation. Note that the client only captures the most commonly used idioms of using the dynamic web service. It's possible to have cases here this client's API is insufficient for your OData url and you need to go one level deeper e.g. getOne is navigating to a collection valued property and the "array" is in the "value" fieldname.
You must make sure you have a MonadError[IO, Throwable]
in implicit scope
when you create the client. If you need to you can always val ehandler =
MonadError[IO, Throwable]
when creating the client to instill your own
strategy for raising an error. If you have cats.effect in scope, you should
pick up the default one automatically. All errors from responses are
captured in this layer and converted to instances of DynamicsClientError (a
Throwable). Errors generated from lower levels can be thrown and are *not*
captured in this layer.
- Alphabetic
- By Inheritance
- DynamicsClient
- Serializable
- Serializable
- Product
- Equals
- ClientMethods
- DynamicsClientRequests
- LazyLogger
- AnyRef
- Any
- Hide All
- Show All
- Public
- All
Instance Constructors
- new DynamicsClient(http: Client[IO], connectInfo: ConnectionInfo, debug: Boolean = false)(implicit F: ApplicativeError[IO, Throwable], e: ExecutionContext)
Value Members
-
final
def
!=(arg0: Any): Boolean
- Definition Classes
- AnyRef → Any
-
final
def
##(): Int
- Definition Classes
- AnyRef → Any
-
final
def
==(arg0: Any): Boolean
- Definition Classes
- AnyRef → Any
-
val
DefaultBatchRequest: HttpRequest[Nothing]
- Definition Classes
- DynamicsClientRequests
-
def
_getList[A <: Any](url: String, headers: HttpHeaders)(): IO[Seq[A]]
Get a list of values.
Get a list of values. Follows @data.nextLink but accumulates all the results into memory. Prefer getListStream. For now, the caller must decode external to this method. The url is usually generated from a QuerySpec.
- Attributes
- protected
- Definition Classes
- ClientMethods
-
def
_getListStream[A <: Any](url: String, headers: HttpHeaders): Stream[IO, A]
Get a list of values as a stream.
Get a list of values as a stream. Follows @odata.nextLink. For now, the caller must decode external to this method.
- Attributes
- protected
- Definition Classes
- ClientMethods
-
final
def
asInstanceOf[T0]: T0
- Definition Classes
- Any
-
def
associate(fromEntitySet: String, fromEntityId: String, navProperty: String, toEntitySet: String, toEntityId: String, singleNavProperty: Boolean): IO[Boolean]
Associate an existing entity to another through a single or collection valued navigation property.
-
val
base: String
Exposed so you can formulate batch request from standard HttpRequest objects which must have HOST header set or the full URL in the batch item request.
-
def
batch[R](m: Multipart, headers: HttpHeaders = HttpHeaders.empty, opts: DynamicsOptions = QuietDynamicsOptions)(implicit e: EntityEncoder[Multipart], d: EntityDecoder[IO, R]): IO[R]
Run a batch request.
Run a batch request. Dynamics batch requests are POSTs.
- headers
Headers for the post. *not* for each request.
- opts
dynamics options such as "prefer"
-
def
clone(): AnyRef
- Attributes
- protected[java.lang]
- Definition Classes
- AnyRef
- Annotations
- @native() @throws( ... )
-
def
create[B, R](entitySet: String, body: B, opts: DynamicsOptions = DefaultDynamicsOptions)(implicit e: EntityEncoder[B], d: EntityDecoder[IO, R]): IO[R]
Create an entity.
Create an entity. If return=representation then the decoder can decode the body with entity content. You can return an id or body from this function.
-
def
createReturnId[B](entityCollection: String, body: B, opts: DynamicsOptions = DefaultDynamicsOptions)(implicit e: EntityEncoder[B]): IO[String]
Create an entity and expect only its id returned.
Create an entity and expect only its id returned. includeRepresentation is set to an explicit false in the headers to ensure the id is returend in the header.
- val debug: Boolean
-
def
delete(entitySet: String, keyInfo: DynamicsId, opts: DynamicsOptions = DefaultDynamicsOptions): IO[(DynamicsId, Boolean)]
Delete an entity.
Delete an entity. Return the id passed in for convenience. Return true if the entity does not exist even though this call did not technically delete it if it did not exist already.
- keyInfo
Primary key (GUID) or alternate key.
- returns
Pair of the id passed in and true if deleted (204), false if not (404).
-
def
disassociate(fromEntitySet: String, fromEntityId: String, navProperty: String, to: Option[String] = None): IO[Boolean]
Disassociate an entity fram a navigation property.
-
final
def
eq(arg0: AnyRef): Boolean
- Definition Classes
- AnyRef
-
def
executeAction[A](action: String, body: Entity, entitySetAndId: Option[(String, String)] = None, opts: DynamicsOptions = DefaultDynamicsOptions)(implicit d: EntityDecoder[IO, A]): IO[A]
Execute an action.
Execute an action. Can be bound or unbound depending on entityCollectionAndId. Action name may be prefixed with a namespace like
Microsoft.Dynamics.CRM
.TODO: Map into a http.expect.
-
def
executeFunction[A](function: String, parameters: Map[String, Any] = Map.empty, entity: Option[(String, String)] = None)(implicit d: EntityDecoder[IO, A]): IO[A]
Exceute a bound or unbound function.
Exceute a bound or unbound function.
- function
Function name
- parameters
Query parameters for function.
- entity
Optional (entityCollection, id) info for bound function call. Use None for unbound function call.
- d
Decode response body.
-
def
finalize(): Unit
- Attributes
- protected[java.lang]
- Definition Classes
- AnyRef
- Annotations
- @throws( classOf[java.lang.Throwable] )
-
def
findDynamicsError(body: Dynamic): Option[DynamicsErrorJS]
Find an optional dynamics error message in the body.
Find an optional dynamics error message in the body.
- Attributes
- protected
-
def
findSimpleMessage(body: Dynamic): Option[String]
Not sure when this might apply.
Not sure when this might apply. Do we get errors where the error property is embedded on a Message (capital?) field?
- Attributes
- protected
-
final
def
getClass(): Class[_]
- Definition Classes
- AnyRef → Any
- Annotations
- @native()
-
def
getList[A <: Any](url: String, opts: DynamicsOptions = DefaultDynamicsOptions)(): IO[Seq[A]]
Get a list of values.
Get a list of values. Follows @data.nextLink but accumulates all the results into memory. Prefer getListStream. For now, the caller must decode external to this method. The url is typically created from a QuerySpec.
- See also
getListStream
-
def
getListStream[A <: Any](url: String, opts: DynamicsOptions = DefaultDynamicsOptions): Stream[IO, A]
Get a list of values as a stream.
Get a list of values as a stream. Follows @odata.nextLink. For now, the caller must decode external to this method. The url is usually created from a QuerySpec e.g.
val q = QuerySpec(); val url = q.url("entitysetname")
. -
def
getOne[A](url: String, opts: DynamicsOptions = DefaultDynamicsOptions)(implicit d: EntityDecoder[IO, A]): IO[A]
Get one entity using a full query url.
Get one entity using a full query url. You can use a QuerySpec to form the url then call
qs.url(myentities,Some(theid))
.If you use a URL that returns a OData response with a
value
array that needs be automatically extracted, you need to use an explict EntityDecoder that first looks for that array then obtains yourA
. SeeEntityDecoder.ValueWrapper
for an example.You also use this pattern when employing
getOne
to obtain related records in a 1:M navigation property e.g. a single entity's set of connections or some child entity. In this case, your URL will typically have an "expand" segment. Note that if you navigate to a simple attribute, then it is returned as a simple object also attached to "value" so choose your decoder wisely.- To do
Return an Option?
-
def
getOneWithKey[A](entitySet: String, keyInfo: DynamicsId, attributes: Seq[String] = Nil, opts: DynamicsOptions = DefaultDynamicsOptions)(implicit d: EntityDecoder[IO, A]): IO[A]
Get a single entity using key information.
Get a single entity using key information. The keyInfo can be a guid or alternate key criteria e.g "altkeyattribute='Larry',...". You get all the fields with this. This assumes that the entity exists since you providing it in id--you should know ahead of time.
Allow you to specify a queryspec somehow as well.
- To do
Return an Option?
-
val
http: Client[IO]
- Definition Classes
- DynamicsClient → ClientMethods
-
final
def
isInstanceOf[T0]: Boolean
- Definition Classes
- Any
-
lazy val
logger: Logger
- Definition Classes
- LazyLogger
-
def
mkAssociateRequest[F[_]](fromEntitySet: String, fromEntityId: String, navProperty: String, toEntitySet: String, toEntityId: String, base: String, singleValuedNavProperty: Boolean = true): HttpRequest[F]
Not sure adding $base to the @odata.id is absolutely needed.
Not sure adding $base to the @odata.id is absolutely needed. Probably is.
- Definition Classes
- DynamicsClientRequests
- See also
https://docs.microsoft.com/en-us/dynamics365/customer-engagement/developer/webapi/associate-disassociate-entities-using-web-api?view=dynamics-ce-odata-9
-
def
mkBatch[F[_]](m: Multipart, headers: HttpHeaders = HttpHeaders.empty): HttpRequest[F]
Body in HttpRequest is ignored and is instead generated from m.
Body in HttpRequest is ignored and is instead generated from m. Since the parts will have requests, you need to ensure that the base URL used in those requests have a consistent base URL.
- Definition Classes
- DynamicsClientRequests
-
def
mkBatchRequest[F[_], A](headers: HttpHeaders, m: Multipart): HttpRequest[F]
- Definition Classes
- DynamicsClientRequests
-
def
mkCreateRequest[F[_], B](entitySet: String, body: B, opts: DynamicsOptions = DefaultDynamicsOptions)(implicit e: EntityEncoder[B]): HttpRequest[F]
- Definition Classes
- DynamicsClientRequests
-
def
mkDeleteRequest[F[_]](entitySet: String, keyInfo: DynamicsId, opts: DynamicsOptions = DefaultDynamicsOptions): HttpRequest[F]
Make a pure delete request.
Make a pure delete request.
- Definition Classes
- DynamicsClientRequests
-
def
mkDisassocatiateRequest[F[_]](fromEntitySet: String, fromEntityId: String, navProperty: String, toId: Option[String]): HttpRequest[F]
Provide
to
if its a collection-valued navigation property, otherwise it removes a single-valued navigation property.Provide
to
if its a collection-valued navigation property, otherwise it removes a single-valued navigation property.- Definition Classes
- DynamicsClientRequests
- See also
https://docs.microsoft.com/en-us/dynamics365/customer-engagement/developer/webapi/associate-disassociate-entities-using-web-api?view=dynamics-ce-odata-9
-
def
mkExecuteActionRequest[F[_]](action: String, body: Entity, entitySetAndId: Option[(String, String)] = None, opts: DynamicsOptions = DefaultDynamicsOptions): HttpRequest[F]
- Definition Classes
- DynamicsClientRequests
-
def
mkExecuteFunctionRequest[F[_]](function: String, parameters: Map[String, Any] = Map.empty, entity: Option[(String, String)] = None): HttpRequest[F]
- Definition Classes
- DynamicsClientRequests
-
def
mkGetListRequest[F[_]](url: String, opts: DynamicsOptions = DefaultDynamicsOptions): HttpRequest[F]
- Definition Classes
- DynamicsClientRequests
-
def
mkGetOneRequest[F[_]](url: String, opts: DynamicsOptions): HttpRequest[F]
- Definition Classes
- DynamicsClientRequests
-
def
mkUpdateRequest[F[_], B](entitySet: String, id: String, body: B, upsertPreventCreate: Boolean = true, upsertPreventUpdate: Boolean = false, options: DynamicsOptions = DefaultDynamicsOptions, base: Option[String] = None)(implicit enc: EntityEncoder[B]): HttpRequest[F]
Create a PATCH request that could also upsert.
Create a PATCH request that could also upsert. "opts" version could override upsertPreventCreate if a version value is also included, so be careful.
- Definition Classes
- DynamicsClientRequests
-
final
def
ne(arg0: AnyRef): Boolean
- Definition Classes
- AnyRef
-
final
def
notify(): Unit
- Definition Classes
- AnyRef
- Annotations
- @native()
-
final
def
notifyAll(): Unit
- Definition Classes
- AnyRef
- Annotations
- @native()
-
def
responseToFailedTask[A](resp: HttpResponse[IO], msg: String, req: Option[HttpRequest[IO]]): IO[A]
Called in response to a bad status returned from a request.
Called in response to a bad status returned from a request. Create a failed effect and pull out a dynamics server error message from the body, if present.
- Definition Classes
- DynamicsClient → ClientMethods
-
final
def
synchronized[T0](arg0: ⇒ T0): T0
- Definition Classes
- AnyRef
-
def
toHeaders(o: DynamicsOptions): HttpHeaders
This does not handle the version tag + applyOptimisticConcurrency flag yet.
This does not handle the version tag + applyOptimisticConcurrency flag yet.
- Definition Classes
- DynamicsClientRequests
-
def
update[B](entitySet: String, id: String, body: B, upsertPreventCreate: Boolean = true, upsertPreventUpdate: Boolean = false, opts: DynamicsOptions = DefaultDynamicsOptions)(implicit e: EntityEncoder[B]): IO[String]
Update an entity.
Update an entity. Fails if no odata-entityid is returned in the header. For now, do not use return=representation.
-
def
updateOneProperty(entitySet: String, id: String, property: String, value: Any, opts: DynamicsOptions = QuietDynamicsOptions): IO[String]
Update a single property, return the id updated.
Update a single property, return the id updated.
- See also
https://docs.microsoft.com/en-us/dynamics365/customer-engagement/developer/webapi/update-delete-entities-using-web-api?view=dynamics-ce-odata-9
-
final
def
wait(): Unit
- Definition Classes
- AnyRef
- Annotations
- @throws( ... )
-
final
def
wait(arg0: Long, arg1: Int): Unit
- Definition Classes
- AnyRef
- Annotations
- @throws( ... )
-
final
def
wait(arg0: Long): Unit
- Definition Classes
- AnyRef
- Annotations
- @native() @throws( ... )
Deprecated Value Members
-
def
batch[R](r: HttpRequest[IO], m: Multipart)(implicit e: EntityEncoder[Multipart], d: EntityDecoder[IO, R]): IO[R]
- Deprecated