Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

MTM-41851 C# REST SDK to be on par with Java #3

Merged
Show file tree
Hide file tree
Changes from 8 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
58 changes: 57 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
/.vs/Cumulocity.MQTT/v15
.vs/
/REST-SDK/src/ConsoleApp1/bin/Debug/netcoreapp2.2
/REST-SDK/src/ConsoleApp1/obj
/REST-SDK/src/cometd.NetStandard/obj
Expand Down Expand Up @@ -70,3 +70,59 @@
.vscode/

/.idea/

# Files built by Visual Studio
*_i.c
*_p.c
*_h.h
*.ilk
*.meta
*.obj
*.iobj
*.pch
*.pdb
*.ipdb
*.pgc
*.pgd
*.rsp
*.sbr
*.tlb
*.tli
*.tlh
*.tmp
*.tmp_proj
*_wpftmp.csproj
*.log
*.tlog
*.vspscc
*.vssscc
.builds
*.pidb
*.svclog
*.scc

# Visual Studio 2017 auto generated files
Generated\ Files/

# Build results
[Dd]ebug/
[Dd]ebugPublic/
[Rr]elease/
[Rr]eleases/
x64/
x86/
[Ww][Ii][Nn]32/
[Aa][Rr][Mm]/
[Aa][Rr][Mm]64/
bld/
[Bb]in/
[Oo]bj/
[Ll]og/
[Ll]ogs/

# User-specific files
*.rsuser
*.suo
*.user
*.userosscache
*.sln.docstates
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,7 @@ private void ThreadProc()
}
catch (ThreadInterruptedException e)
{
//logger.warn("Thread interrupted while processing operationRep", e);
LOG.Warn("Thread interrupted while processing operationRep", e);
}
catch (SDKException e)
{
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
using Cumulocity.SDK.Client.Rest.Representation.Messaging.Notifications;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Cumulocity.SDK.Client.Rest.API.Messaging.Notifications
{
public interface INotificationSubscriptionApi
{
/// <summary>
/// Creates a subscription to a source
/// </summary>
/// <param name="representation">
/// </param>
/// <exception cref="SDKException"> </exception>
NotificationSubscriptionRepresentation subscribe(NotificationSubscriptionRepresentation representation);

INotificationSubscriptionCollection getSubscriptions();

/// <summary>
/// Gets all the subscriptions matching a filter. If the filter is null, return all subscriptions.
/// </summary>
/// <param name="filter">
/// </param>
/// <exception cref="SDKException"> </exception>
INotificationSubscriptionCollection getSubscriptionsByFilter(NotificationSubscriptionFilter filter);

/// <summary>
/// Delete by object.
/// </summary>
/// <param name="subscription">
/// </param>
/// <exception cref="SDKException"> </exception>
void delete(NotificationSubscriptionRepresentation subscription);

/// <summary>
/// Delete by ID.
/// </summary>
/// <param name="subscriptionId">
/// </param>
/// <exception cref="SDKException"> </exception>
void deleteById(String subscriptionId);

/// <summary>
/// Delete all subscriptions matching a filter.
/// </summary>
/// <param name="filter">
/// </param>
void deleteByFilter(NotificationSubscriptionFilter filter);

/// <summary>
/// Deletes all subscriptions to a source in managed object context.
/// </summary>
/// <param name="source">
/// </param>
void deleteBySource(string source);

/// <summary>
/// Deletes all subscriptions of the current tenant.
/// </summary>
void deleteTenantSubscriptions();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
using Cumulocity.SDK.Client.Rest.Representation.Messaging.Notifications;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Cumulocity.SDK.Client.Rest.API.Messaging.Notifications
{
public interface INotificationSubscriptionCollection : IPagedCollectionResource<NotificationSubscriptionRepresentation, PagedNotificationSubscriptionCollectionRepresentation>
{
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
using Cumulocity.SDK.Client.Rest.Representation.Messaging.Notifications;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Cumulocity.SDK.Client.Rest.API.Messaging.Notifications
{
public interface ITokenApi
{
Token create(NotificationTokenRequestRepresentation tokenRequest);

TokenClaims verify(Token token);

Token refresh(Token token);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,121 @@
using Cumulocity.SDK.Client.Rest.Model.Idtype;
using Cumulocity.SDK.Client.Rest.Representation;
using Cumulocity.SDK.Client.Rest.Representation.Messaging.Notifications;
using Cumulocity.SDK.Client.Rest.Utils;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Cumulocity.SDK.Client.Rest.API.Messaging.Notifications
{
public class NotificationSubscriptionApiImpl : INotificationSubscriptionApi
{
public static readonly CumulocityMediaType MEDIA_TYPE = new CumulocityMediaType("application", "json");

public static readonly String SUBSCRIPTION_REQUEST_URI = "notification2/subscriptions";

private readonly RestConnector restConnector;

private readonly int pageSize;

private readonly UrlProcessor urlProcessor;

public NotificationSubscriptionApiImpl(RestConnector restConnector, int pageSize, UrlProcessor urlProcessor)
{
this.restConnector = restConnector ?? throw new ArgumentNullException(nameof(restConnector));
this.pageSize = pageSize;
this.urlProcessor = urlProcessor ?? throw new ArgumentNullException(nameof(urlProcessor));
}

private string getSelfUri()
{
return $"{restConnector.PlatformParameters.Host}{SUBSCRIPTION_REQUEST_URI}";
}

public void delete(NotificationSubscriptionRepresentation subscription)
{
if(subscription != null)
ashhSAG93 marked this conversation as resolved.
Show resolved Hide resolved
{
deleteById(subscription.Id.Value);
}
else
{
throw new ArgumentNullException("Invalid null subscription");
ashhSAG93 marked this conversation as resolved.
Show resolved Hide resolved
}
}

public void deleteByFilter(NotificationSubscriptionFilter filter)
{
if(filter != null)
{
Dictionary<string, string> parameters = (Dictionary<string, string>)filter.QueryParams;
restConnector.Delete(urlProcessor.replaceOrAddQueryParam(getSelfUri(), parameters));
}
ashhSAG93 marked this conversation as resolved.
Show resolved Hide resolved
else
{
throw new ArgumentNullException("Invalid null filter");
}
}

public void deleteById(string subscriptionId)
{
if(!string.IsNullOrEmpty(subscriptionId))
{
string url = $"{getSelfUri()}/{subscriptionId}";
restConnector.Delete(url);
}
ashhSAG93 marked this conversation as resolved.
Show resolved Hide resolved
else
{
throw new ArgumentNullException("Invalid null subscription id");
}
}

public void deleteBySource(string source)
{
if (!string.IsNullOrEmpty(source))
{
NotificationSubscriptionFilter filter = new NotificationSubscriptionFilter().bySource(new GId(source));
deleteByFilter(filter);
}
ashhSAG93 marked this conversation as resolved.
Show resolved Hide resolved
else
{
throw new ArgumentNullException("Invalid null source");
}
}

public void deleteTenantSubscriptions()
{
NotificationSubscriptionFilter filter = new NotificationSubscriptionFilter().byContext(SubscriptionContext.TENANT.ToDescriptionString());
deleteByFilter(filter);
}

public INotificationSubscriptionCollection getSubscriptions()
{
return new NotificationSubscriptionCollectionImpl(restConnector, getSelfUri(), pageSize);
}

public INotificationSubscriptionCollection getSubscriptionsByFilter(NotificationSubscriptionFilter filter)
{
if(filter == null)
{
return getSubscriptions();
}
Dictionary<string, string> parameters = (Dictionary<string, string>)filter.QueryParams;
return new NotificationSubscriptionCollectionImpl(restConnector, urlProcessor.replaceOrAddQueryParam(getSelfUri(), parameters), pageSize);
}

public NotificationSubscriptionRepresentation subscribe(NotificationSubscriptionRepresentation representation)
{
if (representation != null)
{
return restConnector.Post<NotificationSubscriptionRepresentation>(getSelfUri(), MEDIA_TYPE, representation);
ashhSAG93 marked this conversation as resolved.
Show resolved Hide resolved
}
else
{
throw new ArgumentNullException("Invalid representation passed");
}
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
using Cumulocity.SDK.Client.Rest.Representation;
using Cumulocity.SDK.Client.Rest.Representation.Messaging.Notifications;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Cumulocity.SDK.Client.Rest.API.Messaging.Notifications
{
public class NotificationSubscriptionCollectionImpl : PagedCollectionResourceImpl<NotificationSubscriptionRepresentation, NotificationSubscriptionCollectionRepresentation, PagedNotificationSubscriptionCollectionRepresentation>, INotificationSubscriptionCollection
{
public NotificationSubscriptionCollectionImpl(RestConnector restConnector, string url, int pageSize) : base(restConnector, url, pageSize)
{

}

protected internal override CumulocityMediaType MediaType => NotificationSubscriptionMediaType.NOTIFICATION_SUBSCRIPTION_COLLECTION;

protected internal override Type ResponseClassProp => typeof(NotificationSubscriptionCollectionRepresentation);

protected internal override PagedNotificationSubscriptionCollectionRepresentation wrap(NotificationSubscriptionCollectionRepresentation collection)
{
return new PagedNotificationSubscriptionCollectionRepresentation(collection, this);
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
using Cumulocity.SDK.Client.Rest.Model.Idtype;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Cumulocity.SDK.Client.Rest.API.Messaging.Notifications
{
public class NotificationSubscriptionFilter : Filter
{
[ParamSource]
private string source;

[ParamSource]
private string context;

public NotificationSubscriptionFilter bySource(GId source)
{
this.source = source.Value;
return this;
}

public NotificationSubscriptionFilter byContext(String context)
{
this.context = context;
return this;
}

public string getSource()
{
return source;
}

public string getContext()
{
return context;
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
using Cumulocity.SDK.Client.Rest.Representation.Messaging.Notifications;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Cumulocity.SDK.Client.Rest.API.Messaging.Notifications
{
public class PagedNotificationSubscriptionCollectionRepresentation : NotificationSubscriptionCollectionRepresentation, IPagedCollectionRepresentation<NotificationSubscriptionRepresentation>
{
private readonly IPagedCollectionResource<NotificationSubscriptionRepresentation, NotificationSubscriptionCollectionRepresentation> collectionResource;

public PagedNotificationSubscriptionCollectionRepresentation(NotificationSubscriptionCollectionRepresentation collection, IPagedCollectionResource<NotificationSubscriptionRepresentation, NotificationSubscriptionCollectionRepresentation> collectionResource)
{
this.Subscriptions = collection.Subscriptions;
this.PageStatistics = collection.PageStatistics;
this.Self = collection.Self;
this.Next = collection.Next;
this.Prev = collection.Prev;
this.collectionResource = collectionResource;
}

public IEnumerable<NotificationSubscriptionRepresentation> AllPages()
{
return new PagedCollectionIterable<NotificationSubscriptionRepresentation, NotificationSubscriptionCollectionRepresentation>(collectionResource, this);
}

public IEnumerable<NotificationSubscriptionRepresentation> Elements(int limit)
{
return new PagedCollectionIterable<NotificationSubscriptionRepresentation, NotificationSubscriptionCollectionRepresentation>(collectionResource, this, limit);
}
}
}
Loading