Skip to content

Commit be4743a

Browse files
committed
feat(tiktokshop): 新增商品制造商与责任人相关接口
1 parent d26a19f commit be4743a

33 files changed

Lines changed: 1318 additions & 21 deletions

File tree

docs/TikTokGlobalShop/Basic_ModelDefinition.md

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ Notes: The following catalog is consistent with the catalog structure of [TikTok
4242
- Upload Product File: `ProductUploadFile`
4343
- Search Size Charts: `ProductSearchSizeCharts`
4444
- Create Product: `ProductCreateProduct`
45-
- Partial Edit Product: `ProductUpdateProductPartial`
45+
- Partial Edit Product: `ProductUpdateProductPartially`
4646
- Edit Product: `ProductUpdateProduct`
4747
- Activate Products: `ProductActivateProducts`
4848
- Deactivate Products: `ProductDeactivateProducts`
@@ -68,6 +68,12 @@ Notes: The following catalog is consistent with the catalog structure of [TikTok
6868
- Get Global Product: `ProductGetGlobalProductDetail`
6969
- Search Global Products: `ProductSearchGlobalProducts`
7070
- Update Global Inventory: `ProductUpdateGlobalProductInventory`
71+
- Create Manufacturer: `ProductCreateComplianceManufacturer`
72+
- Partial Edit Manufacturer: `ProductUpdateComplianceManufacturerPartially`
73+
- Search Manufacturers: `ProductSearchComplianceManufacturers`
74+
- Create Responsible Person: `ProductCreateComplianceResponsiblePerson`
75+
- Partial Edit Responsible Person: `ProductUpdateComplianceResponsiblePersonPartially`
76+
- Search Responsible Persons: `ProductSearchComplianceResponsiblePersons`
7177
- Create Category Upgrade Task: `ProductCreateProductCategoryUpgradeTask`
7278
- Listing Schemas: `ProductGetListingSchemas`
7379
- Promotion

src/SKIT.FlurlHttpClient.ByteDance.TikTokGlobalShop/Extensions/TikTokShopClientExecuteProductExtensions.cs

Lines changed: 140 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,144 @@ public static class TikTokShopClientExecuteProductExtensions
159159
}
160160
#endregion
161161

162+
#region Compliance
163+
/// <summary>
164+
/// <para>异步调用 [POST] /product/{version}/compliance/manufacturers 接口。</para>
165+
/// <para>
166+
/// REF: <br/>
167+
/// <![CDATA[ https://partner.tiktokshop.com/docv2/page/67066a54a049d802e7afd063 ]]>
168+
/// </para>
169+
/// </summary>
170+
/// <param name="client"></param>
171+
/// <param name="request"></param>
172+
/// <param name="cancellationToken"></param>
173+
/// <returns></returns>
174+
public static async Task<Models.ProductCreateComplianceManufacturerResponse> ExecuteProductCreateComplianceManufacturerAsync(this TikTokShopClient client, Models.ProductCreateComplianceManufacturerRequest request, CancellationToken cancellationToken = default)
175+
{
176+
if (client is null) throw new ArgumentNullException(nameof(client));
177+
if (request is null) throw new ArgumentNullException(nameof(request));
178+
179+
IFlurlRequest flurlReq = client
180+
.CreateFlurlRequest(request, HttpMethod.Post, "product", request.ApiVersion, "compliance", "manufacturers");
181+
182+
return await client.SendFlurlRequesAsJsontAsync<Models.ProductCreateComplianceManufacturerResponse>(flurlReq, data: request, cancellationToken: cancellationToken).ConfigureAwait(false);
183+
}
184+
185+
/// <summary>
186+
/// <para>异步调用 [POST] /product/{version}/compliance/manufacturers/{manufacturer_id}/partial_edit 接口。</para>
187+
/// <para>
188+
/// REF: <br/>
189+
/// <![CDATA[ https://partner.tiktokshop.com/docv2/page/67066a55c55b3a03044eea29 ]]>
190+
/// </para>
191+
/// </summary>
192+
/// <param name="client"></param>
193+
/// <param name="request"></param>
194+
/// <param name="cancellationToken"></param>
195+
/// <returns></returns>
196+
public static async Task<Models.ProductUpdateComplianceManufacturerPartiallyResponse> ExecuteProductUpdateComplianceManufacturerPartiallyAsync(this TikTokShopClient client, Models.ProductUpdateComplianceManufacturerPartiallyRequest request, CancellationToken cancellationToken = default)
197+
{
198+
if (client is null) throw new ArgumentNullException(nameof(client));
199+
if (request is null) throw new ArgumentNullException(nameof(request));
200+
201+
IFlurlRequest flurlReq = client
202+
.CreateFlurlRequest(request, HttpMethod.Post, "product", request.ApiVersion, "compliance", "manufacturers", request.ManufacturerId, "partial_edit");
203+
204+
return await client.SendFlurlRequesAsJsontAsync<Models.ProductUpdateComplianceManufacturerPartiallyResponse>(flurlReq, data: request, cancellationToken: cancellationToken).ConfigureAwait(false);
205+
}
206+
207+
/// <summary>
208+
/// <para>异步调用 [POST] /product/{version}/compliance/manufacturers/search 接口。</para>
209+
/// <para>
210+
/// REF: <br/>
211+
/// <![CDATA[ https://partner.tiktokshop.com/docv2/page/67066a580dcee902fa03ccf9 ]]>
212+
/// </para>
213+
/// </summary>
214+
/// <param name="client"></param>
215+
/// <param name="request"></param>
216+
/// <param name="cancellationToken"></param>
217+
/// <returns></returns>
218+
public static async Task<Models.ProductSearchComplianceManufacturersResponse> ExecuteProductSearchComplianceManufacturersAsync(this TikTokShopClient client, Models.ProductSearchComplianceManufacturersRequest request, CancellationToken cancellationToken = default)
219+
{
220+
if (client is null) throw new ArgumentNullException(nameof(client));
221+
if (request is null) throw new ArgumentNullException(nameof(request));
222+
223+
IFlurlRequest flurlReq = client
224+
.CreateFlurlRequest(request, HttpMethod.Post, "product", request.ApiVersion, "compliance", "manufacturers", "search")
225+
.SetQueryParam("page_size", request.PageSize)
226+
.SetQueryParam("page_token", request.PageToken);
227+
228+
return await client.SendFlurlRequesAsJsontAsync<Models.ProductSearchComplianceManufacturersResponse>(flurlReq, data: request, cancellationToken: cancellationToken).ConfigureAwait(false);
229+
}
230+
231+
/// <summary>
232+
/// <para>异步调用 [POST] /product/{version}/compliance/responsible_persons 接口。</para>
233+
/// <para>
234+
/// REF: <br/>
235+
/// <![CDATA[ https://partner.tiktokshop.com/docv2/page/67066a553521310300c988f2 ]]>
236+
/// </para>
237+
/// </summary>
238+
/// <param name="client"></param>
239+
/// <param name="request"></param>
240+
/// <param name="cancellationToken"></param>
241+
/// <returns></returns>
242+
public static async Task<Models.ProductCreateComplianceResponsiblePersonResponse> ExecuteProductCreateComplianceResponsiblePersonAsync(this TikTokShopClient client, Models.ProductCreateComplianceResponsiblePersonRequest request, CancellationToken cancellationToken = default)
243+
{
244+
if (client is null) throw new ArgumentNullException(nameof(client));
245+
if (request is null) throw new ArgumentNullException(nameof(request));
246+
247+
IFlurlRequest flurlReq = client
248+
.CreateFlurlRequest(request, HttpMethod.Post, "product", request.ApiVersion, "compliance", "responsible_persons");
249+
250+
return await client.SendFlurlRequesAsJsontAsync<Models.ProductCreateComplianceResponsiblePersonResponse>(flurlReq, data: request, cancellationToken: cancellationToken).ConfigureAwait(false);
251+
}
252+
253+
/// <summary>
254+
/// <para>异步调用 [POST] /product/{version}/compliance/responsible_persons/{responsible_person_id}/partial_edit 接口。</para>
255+
/// <para>
256+
/// REF: <br/>
257+
/// <![CDATA[ https://partner.tiktokshop.com/docv2/page/67066a5587019802fdce19b3 ]]>
258+
/// </para>
259+
/// </summary>
260+
/// <param name="client"></param>
261+
/// <param name="request"></param>
262+
/// <param name="cancellationToken"></param>
263+
/// <returns></returns>
264+
public static async Task<Models.ProductUpdateComplianceResponsiblePersonPartiallyResponse> ExecuteProductUpdateComplianceResponsiblePersonPartiallyAsync(this TikTokShopClient client, Models.ProductUpdateComplianceResponsiblePersonPartiallyRequest request, CancellationToken cancellationToken = default)
265+
{
266+
if (client is null) throw new ArgumentNullException(nameof(client));
267+
if (request is null) throw new ArgumentNullException(nameof(request));
268+
269+
IFlurlRequest flurlReq = client
270+
.CreateFlurlRequest(request, HttpMethod.Post, "product", request.ApiVersion, "compliance", "responsible_persons", request.ResponsiblePersonId, "partial_edit");
271+
272+
return await client.SendFlurlRequesAsJsontAsync<Models.ProductUpdateComplianceResponsiblePersonPartiallyResponse>(flurlReq, data: request, cancellationToken: cancellationToken).ConfigureAwait(false);
273+
}
274+
275+
/// <summary>
276+
/// <para>异步调用 [POST] /product/{version}/compliance/responsible_persons/search 接口。</para>
277+
/// <para>
278+
/// REF: <br/>
279+
/// <![CDATA[ https://partner.tiktokshop.com/docv2/page/67066a55f17b7d02f95d2fb1 ]]>
280+
/// </para>
281+
/// </summary>
282+
/// <param name="client"></param>
283+
/// <param name="request"></param>
284+
/// <param name="cancellationToken"></param>
285+
/// <returns></returns>
286+
public static async Task<Models.ProductSearchComplianceResponsiblePersonsResponse> ExecuteProductSearchComplianceResponsiblePersonsAsync(this TikTokShopClient client, Models.ProductSearchComplianceResponsiblePersonsRequest request, CancellationToken cancellationToken = default)
287+
{
288+
if (client is null) throw new ArgumentNullException(nameof(client));
289+
if (request is null) throw new ArgumentNullException(nameof(request));
290+
291+
IFlurlRequest flurlReq = client
292+
.CreateFlurlRequest(request, HttpMethod.Post, "product", request.ApiVersion, "compliance", "responsible_persons", "search")
293+
.SetQueryParam("page_size", request.PageSize)
294+
.SetQueryParam("page_token", request.PageToken);
295+
296+
return await client.SendFlurlRequesAsJsontAsync<Models.ProductSearchComplianceResponsiblePersonsResponse>(flurlReq, data: request, cancellationToken: cancellationToken).ConfigureAwait(false);
297+
}
298+
#endregion
299+
162300
#region Global
163301
#region Global/Category
164302
/// <summary>
@@ -649,15 +787,15 @@ public static class TikTokShopClientExecuteProductExtensions
649787
/// <param name="request"></param>
650788
/// <param name="cancellationToken"></param>
651789
/// <returns></returns>
652-
public static async Task<Models.ProductUpdateProductPartialResponse> ExecuteProductUpdateProductPartialAsync(this TikTokShopClient client, Models.ProductUpdateProductPartialRequest request, CancellationToken cancellationToken = default)
790+
public static async Task<Models.ProductUpdateProductPartiallyResponse> ExecuteProductUpdateProductPartiallyAsync(this TikTokShopClient client, Models.ProductUpdateProductPartiallyRequest request, CancellationToken cancellationToken = default)
653791
{
654792
if (client is null) throw new ArgumentNullException(nameof(client));
655793
if (request is null) throw new ArgumentNullException(nameof(request));
656794

657795
IFlurlRequest flurlReq = client
658796
.CreateFlurlRequest(request, HttpMethod.Post, "product", request.ApiVersion, "products", request.ProductId, "partial_edit");
659797

660-
return await client.SendFlurlRequesAsJsontAsync<Models.ProductUpdateProductPartialResponse>(flurlReq, data: request, cancellationToken: cancellationToken).ConfigureAwait(false);
798+
return await client.SendFlurlRequesAsJsontAsync<Models.ProductUpdateProductPartiallyResponse>(flurlReq, data: request, cancellationToken: cancellationToken).ConfigureAwait(false);
661799
}
662800

663801
/// <summary>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
namespace SKIT.FlurlHttpClient.ByteDance.TikTokGlobalShop.Models
2+
{
3+
/// <summary>
4+
/// <para>表示 [POST] /product/{version}/compliance/manufacturers 接口的请求。</para>
5+
/// </summary>
6+
public class ProductCreateComplianceManufacturerRequest : TikTokShopRequest
7+
{
8+
public static class Types
9+
{
10+
public class PhoneNumber
11+
{
12+
/// <summary>
13+
/// 获取或设置国家地区号码。
14+
/// </summary>
15+
[Newtonsoft.Json.JsonProperty("country_code")]
16+
[System.Text.Json.Serialization.JsonPropertyName("country_code")]
17+
public string CountryCode { get; set; } = string.Empty;
18+
19+
/// <summary>
20+
/// 获取或设置本地号码。
21+
/// </summary>
22+
[Newtonsoft.Json.JsonProperty("local_number")]
23+
[System.Text.Json.Serialization.JsonPropertyName("local_number")]
24+
public string LocalNumber { get; set; } = string.Empty;
25+
}
26+
}
27+
28+
/// <summary>
29+
/// 获取或设置 API 版本号。
30+
/// <para>默认值:202409</para>
31+
/// </summary>
32+
[Newtonsoft.Json.JsonIgnore]
33+
[System.Text.Json.Serialization.JsonIgnore]
34+
public override int ApiVersion { get; set; } = 202409;
35+
36+
/// <summary>
37+
/// 获取或设置制造商名称。
38+
/// </summary>
39+
[Newtonsoft.Json.JsonProperty("name")]
40+
[System.Text.Json.Serialization.JsonPropertyName("name")]
41+
public string Name { get; set; } = string.Empty;
42+
43+
/// <summary>
44+
/// 获取或设置制造商注册商业名称。
45+
/// </summary>
46+
[Newtonsoft.Json.JsonProperty("registered_trade_name")]
47+
[System.Text.Json.Serialization.JsonPropertyName("registered_trade_name")]
48+
public string? RegisteredTradeName { get; set; }
49+
50+
/// <summary>
51+
/// 获取或设置邮件地址。
52+
/// </summary>
53+
[Newtonsoft.Json.JsonProperty("email")]
54+
[System.Text.Json.Serialization.JsonPropertyName("email")]
55+
public string Email { get; set; } = string.Empty;
56+
57+
/// <summary>
58+
/// 获取或设置电话号码信息。
59+
/// </summary>
60+
[Newtonsoft.Json.JsonProperty("phone_number")]
61+
[System.Text.Json.Serialization.JsonPropertyName("phone_number")]
62+
public Types.PhoneNumber PhoneNumber { get; set; } = new Types.PhoneNumber();
63+
64+
/// <summary>
65+
/// 获取或设置地址。
66+
/// </summary>
67+
[Newtonsoft.Json.JsonProperty("address")]
68+
[System.Text.Json.Serialization.JsonPropertyName("address")]
69+
public string Address { get; set; } = string.Empty;
70+
}
71+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
namespace SKIT.FlurlHttpClient.ByteDance.TikTokGlobalShop.Models
2+
{
3+
/// <summary>
4+
/// <para>表示 [POST] /product/{version}/compliance/manufacturers 接口的响应。</para>
5+
/// </summary>
6+
public class ProductCreateComplianceManufacturerResponse : TikTokShopResponse<ProductCreateComplianceManufacturerResponse.Types.Data>
7+
{
8+
public static class Types
9+
{
10+
public class Data
11+
{
12+
/// <summary>
13+
/// 获取或设置制造商 ID。
14+
/// </summary>
15+
[Newtonsoft.Json.JsonProperty("manufacturer_id")]
16+
[System.Text.Json.Serialization.JsonPropertyName("manufacturer_id")]
17+
[System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Serialization.Common.NumericalStringReadOnlyConverter))]
18+
public string ManufacturerId { get; set; } = default!;
19+
}
20+
}
21+
}
22+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
namespace SKIT.FlurlHttpClient.ByteDance.TikTokGlobalShop.Models
2+
{
3+
/// <summary>
4+
/// <para>表示 [POST] /product/{version}/compliance/responsible_persons 接口的请求。</para>
5+
/// </summary>
6+
public class ProductCreateComplianceResponsiblePersonRequest : TikTokShopRequest
7+
{
8+
public static class Types
9+
{
10+
public class PhoneNumber : ProductCreateComplianceManufacturerRequest.Types.PhoneNumber
11+
{
12+
}
13+
14+
public class Address
15+
{
16+
/// <summary>
17+
/// 获取或设置邮编。
18+
/// </summary>
19+
[Newtonsoft.Json.JsonProperty("postal_code")]
20+
[System.Text.Json.Serialization.JsonPropertyName("postal_code")]
21+
public string PostalCode { get; set; } = string.Empty;
22+
23+
/// <summary>
24+
/// 获取或设置国家。
25+
/// </summary>
26+
[Newtonsoft.Json.JsonProperty("country")]
27+
[System.Text.Json.Serialization.JsonPropertyName("country")]
28+
public string Country { get; set; } = string.Empty;
29+
30+
/// <summary>
31+
/// 获取或设置省。
32+
/// </summary>
33+
[Newtonsoft.Json.JsonProperty("province")]
34+
[System.Text.Json.Serialization.JsonPropertyName("province")]
35+
public string Province { get; set; } = string.Empty;
36+
37+
/// <summary>
38+
/// 获取或设置市。
39+
/// </summary>
40+
[Newtonsoft.Json.JsonProperty("city")]
41+
[System.Text.Json.Serialization.JsonPropertyName("city")]
42+
public string City { get; set; } = string.Empty;
43+
44+
/// <summary>
45+
/// 获取或设置区。
46+
/// </summary>
47+
[Newtonsoft.Json.JsonProperty("district")]
48+
[System.Text.Json.Serialization.JsonPropertyName("district")]
49+
public string? District { get; set; }
50+
51+
/// <summary>
52+
/// 获取或设置街道地址行 1。
53+
/// </summary>
54+
[Newtonsoft.Json.JsonProperty("street_address_line1")]
55+
[System.Text.Json.Serialization.JsonPropertyName("street_address_line1")]
56+
public string? StreetAddressLine1 { get; set; }
57+
58+
/// <summary>
59+
/// 获取或设置街道地址行 2。
60+
/// </summary>
61+
[Newtonsoft.Json.JsonProperty("street_address_line2")]
62+
[System.Text.Json.Serialization.JsonPropertyName("street_address_line2")]
63+
public string? StreetAddressLine2 { get; set; }
64+
}
65+
}
66+
67+
/// <summary>
68+
/// 获取或设置 API 版本号。
69+
/// <para>默认值:202409</para>
70+
/// </summary>
71+
[Newtonsoft.Json.JsonIgnore]
72+
[System.Text.Json.Serialization.JsonIgnore]
73+
public override int ApiVersion { get; set; } = 202409;
74+
75+
/// <summary>
76+
/// 获取或设置责任人名称。
77+
/// </summary>
78+
[Newtonsoft.Json.JsonProperty("name")]
79+
[System.Text.Json.Serialization.JsonPropertyName("name")]
80+
public string Name { get; set; } = string.Empty;
81+
82+
/// <summary>
83+
/// 获取或设置邮件地址。
84+
/// </summary>
85+
[Newtonsoft.Json.JsonProperty("email")]
86+
[System.Text.Json.Serialization.JsonPropertyName("email")]
87+
public string Email { get; set; } = string.Empty;
88+
89+
/// <summary>
90+
/// 获取或设置电话号码信息。
91+
/// </summary>
92+
[Newtonsoft.Json.JsonProperty("phone_number")]
93+
[System.Text.Json.Serialization.JsonPropertyName("phone_number")]
94+
public Types.PhoneNumber PhoneNumber { get; set; } = new Types.PhoneNumber();
95+
96+
/// <summary>
97+
/// 获取或设置地址信息。
98+
/// </summary>
99+
[Newtonsoft.Json.JsonProperty("address")]
100+
[System.Text.Json.Serialization.JsonPropertyName("address")]
101+
public Types.Address Address { get; set; } = new Types.Address();
102+
}
103+
}

0 commit comments

Comments
 (0)