Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
59d93d3
Introduce DataSources client
KoditkarVedant Oct 26, 2025
0f38db6
Add support to retrieve data source
KoditkarVedant Oct 26, 2025
3159205
Add missing description property in DataSourcePropertyConfigResponse …
KoditkarVedant Nov 1, 2025
bac7842
Add support for data source create api
KoditkarVedant Nov 1, 2025
7d9d895
Add integration test for data source create api
KoditkarVedant Nov 1, 2025
2463087
Refactor DualPropertyRelationDataRequest to use Data class for DualPr…
KoditkarVedant Nov 9, 2025
46f15aa
Add update functionality for data sources with corresponding request …
KoditkarVedant Nov 9, 2025
e5e7d6a
Add ListDataSourceTemplates api support
KoditkarVedant Nov 9, 2025
e83ee15
add support for query data sources api endpoint
KoditkarVedant Nov 30, 2025
73193be
Add filters for created by, created time, last edited by, last edited…
KoditkarVedant Nov 30, 2025
f8e200a
Add support for creating databases with new request and response models
KoditkarVedant Nov 30, 2025
fab9995
Delete obsolete database response JSON files to clean up test data
KoditkarVedant Nov 30, 2025
4647997
Remove obsolete database creation parameter classes and property schemas
KoditkarVedant Nov 30, 2025
1727850
Enhance DateCustomConverter to handle timezone offsets and improve se…
KoditkarVedant Nov 30, 2025
2c0714a
Refactor PagesCreateParameters to use updated request models and clea…
KoditkarVedant Nov 30, 2025
0d387b0
Refactor LinkToPage handling to use new ILinkToPage interface and upd…
KoditkarVedant Nov 30, 2025
568d8b0
Add DataSourceParent class and update ParentType enum to include Data…
KoditkarVedant Nov 30, 2025
7645fb2
Refactor parent input handling by removing obsolete classes and intro…
KoditkarVedant Nov 30, 2025
75c74e0
Refactor page parent handling in tests to use new PageParentRequest c…
KoditkarVedant Nov 30, 2025
94e4541
Refactor Comments and Databases client tests to use PageParentRequest…
KoditkarVedant Nov 30, 2025
99e27bb
Add support for updating databases with new request model and properties
KoditkarVedant Dec 6, 2025
c95db96
Update DataSource tests to use dynamically created database IDs
KoditkarVedant Dec 6, 2025
f023c26
Add test for retrieving a database in DatabasesClientTests
KoditkarVedant Dec 6, 2025
0a5d6c6
Remove QueryAsync method and related classes from DatabasesClient
KoditkarVedant Dec 6, 2025
97b9972
Remove unused IWikiDatabase interface and update Database and Page cl…
KoditkarVedant Dec 6, 2025
bf4e518
Remove PagePropertyOnId class as it is no longer needed
KoditkarVedant Dec 6, 2025
9e7121c
Enhance search functionality by adding support for data sources and u…
KoditkarVedant Dec 6, 2025
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
14 changes: 13 additions & 1 deletion Src/Notion.Client/Api/ApiEndpoints.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
namespace Notion.Client
using System;

namespace Notion.Client
{
public static class ApiEndpoints
{
Expand Down Expand Up @@ -148,5 +150,15 @@ public static class FileUploadsApiUrls
public static string List => "/v1/file_uploads";
public static string Retrieve(IRetrieveFileUploadPathParameters pathParameters) => $"/v1/file_uploads/{pathParameters.FileUploadId}";
}

public static class DataSourcesApiUrls
{
private const string BasePath = "/v1/data_sources";
public static string Retrieve(IRetrieveDataSourcePathParameters pathParameters) => $"{BasePath}/{pathParameters.DataSourceId}";
internal static string CreateDataSource() => BasePath;
internal static string Update(IUpdateDataSourcePathParameters pathParameters) => $"{BasePath}/{pathParameters.DataSourceId}";
internal static string ListDataSourceTemplates(IListDataSourceTemplatesPathParameters pathParameters) => $"/v1/data-sources/{pathParameters.DataSourceId}/templates";
internal static string Query(IQueryDataSourcePathParameters pathParameters) => $"{BasePath}/{pathParameters.DataSourceId}/query";
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,6 @@ namespace Notion.Client
public class LinkToPageUpdateBlock : UpdateBlock
{
[JsonProperty("link_to_page")]
public IPageParentInput LinkToPage { get; set; }
public ILinkToPage LinkToPage { get; set; }
}
}
47 changes: 47 additions & 0 deletions Src/Notion.Client/Api/DataSources/Create/DataSourcesClient.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
using System;
using System.Threading;
using System.Threading.Tasks;

namespace Notion.Client
{
public sealed partial class DataSourcesClient
{
public async Task<CreateDataSourceResponse> CreateAsync(
CreateDataSourceRequest request,
CancellationToken cancellationToken = default)
{
var endpoint = ApiEndpoints.DataSourcesApiUrls.CreateDataSource();

if (request == null)
{
throw new ArgumentNullException(nameof(request));
}

ICreateDataSourceBodyParameters body = request;

if (body.Parent == null)
{
throw new ArgumentNullException(nameof(body.Parent), "Parent property cannot be null.");
}

if (body.Parent is DatabaseParentRequest dbParentRequest)
{
if (string.IsNullOrWhiteSpace(dbParentRequest.DatabaseId))
{
throw new ArgumentException("DatabaseId in Parent cannot be null or empty when Parent is of type DatabaseParentRequest.", nameof(request.Parent));
}
}

if (body.Properties == null)
{
throw new ArgumentException("Properties cannot be null or empty.", nameof(body.Properties));
}

return await _restClient.PostAsync<CreateDataSourceResponse>(
endpoint,
body,
cancellationToken: cancellationToken
);
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
using System.Collections.Generic;

namespace Notion.Client
{
public class CreateDataSourceRequest : ICreateDataSourceBodyParameters
{
public IParentOfDataSourceRequest Parent { get; set; }
public IDictionary<string, PropertyConfigurationRequest> Properties { get; set; }
public IEnumerable<RichTextBaseInput> Title { get; set; }
public IPageIconRequest Icon { get; set; }
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
using System.Collections.Generic;
using Newtonsoft.Json;

namespace Notion.Client
{
public interface ICreateDataSourceBodyParameters
{
[JsonProperty("parent")]
public IParentOfDataSourceRequest Parent { get; set; }

[JsonProperty("properties")]
public IDictionary<string, PropertyConfigurationRequest> Properties { get; set; }

[JsonProperty("title")]
public IEnumerable<RichTextBaseInput> Title { get; set; }

[JsonProperty("icon")]
public IPageIconRequest Icon { get; set; }
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
namespace Notion.Client
{
public class CreateDataSourceResponse : DataSourceResponse
{
}
}
12 changes: 12 additions & 0 deletions Src/Notion.Client/Api/DataSources/DataSourcesClient.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
namespace Notion.Client
{
public sealed partial class DataSourcesClient : IDataSourcesClient
{
private readonly IRestClient _restClient;

public DataSourcesClient(IRestClient restClient)
{
_restClient = restClient;
}
}
}
63 changes: 63 additions & 0 deletions Src/Notion.Client/Api/DataSources/IDataSourcesClient.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
using System.Threading;
using System.Threading.Tasks;

namespace Notion.Client
{
public interface IDataSourcesClient
{
/// <summary>
/// Retrieves a data source by its ID.
/// </summary>
/// <param name="request"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
Task<RetrieveDataSourceResponse> RetrieveAsync(
RetrieveDataSourceRequest request,
CancellationToken cancellationToken = default
);

/// <summary>
/// Creates a new data source.
/// </summary>
/// <param name="request"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
Task<CreateDataSourceResponse> CreateAsync(
CreateDataSourceRequest request,
CancellationToken cancellationToken = default
);

/// <summary>
/// Updates an existing data source.
/// </summary>
/// <param name="request"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
Task<UpdateDataSourceResponse> UpdateAsync(
UpdateDataSourceRequest request,
CancellationToken cancellationToken = default
);

/// <summary>
/// Lists the templates for a data source.
/// </summary>
/// <param name="request"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
Task<ListDataSourceTemplatesResponse> ListDataSourceTemplatesAsync(
ListDataSourceTemplatesRequest request,
CancellationToken cancellationToken = default
);

/// <summary>
/// Queries a data source.
/// </summary>
/// <param name="request"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
Task<QueryDataSourceResponse> QueryAsync(
QueryDataSourceRequest request,
CancellationToken cancellationToken = default
);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
using System;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;

namespace Notion.Client
{
public sealed partial class DataSourcesClient
{
public async Task<ListDataSourceTemplatesResponse> ListDataSourceTemplatesAsync(
ListDataSourceTemplatesRequest request,
CancellationToken cancellationToken = default)
{
if (request == null)
{
throw new ArgumentNullException(nameof(request));
}

if (string.IsNullOrWhiteSpace(request.DataSourceId))
{
throw new ArgumentException("DataSourceId cannot be null or empty.", nameof(request.DataSourceId));
}

IListDataSourceTemplatesPathParameters pathParameters = request;

var endpoint = ApiEndpoints.DataSourcesApiUrls.ListDataSourceTemplates(pathParameters);

IListDataSourceTemplatesQueryParameters queryParameters = request;

var queryParams = new Dictionary<string, string>()
{
{ "name", queryParameters.Name },
{ "start_cursor", queryParameters.StartCursor },
{ "page_size", queryParameters.PageSize?.ToString() }
};

return await _restClient.GetAsync<ListDataSourceTemplatesResponse>(
endpoint,
queryParams: queryParams,
cancellationToken: cancellationToken
);
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
namespace Notion.Client
{
public interface IListDataSourceTemplatesPathParameters
{
/// <summary>
/// The ID of the data source.
/// </summary>
public string DataSourceId { get; set; }
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
using Newtonsoft.Json;

namespace Notion.Client
{
public interface IListDataSourceTemplatesQueryParameters : IPaginationParameters
{
/// <summary>
/// Filter templates by name (case-insensitive substring match).
/// </summary>
[JsonProperty("name")]
string Name { get; set; }
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
namespace Notion.Client
{
public class ListDataSourceTemplatesRequest : IListDataSourceTemplatesPathParameters, IListDataSourceTemplatesQueryParameters
{
public string DataSourceId { get; set; }
public string Name { get; set; }
public string StartCursor { get; set; }
public int? PageSize { get; set; }
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
using Newtonsoft.Json;

namespace Notion.Client
{
public class DataSourceTemplate
{
/// <summary>
/// The unique identifier of the data source template.
/// </summary>
[JsonProperty("id")]
public string Id { get; set; }

/// <summary>
/// The name of the data source template.
/// </summary>
[JsonProperty("name")]
public string Name { get; set; }

/// <summary>
/// Indicates whether the template is the default template for the data source.
/// </summary>
[JsonProperty("is_default")]
public bool IsDefault { get; set; }
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
using System.Collections.Generic;
using Newtonsoft.Json;

namespace Notion.Client
{
public class ListDataSourceTemplatesResponse
{
/// <summary>
/// A collection of data source templates.
/// </summary>
[JsonProperty("templates")]
public IEnumerable<DataSourceTemplate> Templates { get; set; }

/// <summary>
/// Indicates whether there are more templates to retrieve.
/// </summary>
[JsonProperty("has_more")]
public bool HasMore { get; set; }

/// <summary>
/// The cursor to use for fetching the next page of templates.
/// </summary>
[JsonProperty("next_cursor")]
public string NextCursor { get; set; }
}
}
Loading