use bigdecimal::BigDecimal;
use serde::{Deserialize, Serialize};
use crate::client::{KintoneClient, RequestBuilder};
use crate::error::ApiError;
use crate::internal::serde_helper::{option_stringified, stringified};
use crate::model::{
Order,
record::{PostedRecordComment, Record, RecordComment},
};
pub fn get_record(app: u64, id: u64) -> GetRecordRequest {
let builder = RequestBuilder::new(http::Method::GET, "/v1/record.json")
.query("app", app)
.query("id", id);
GetRecordRequest { builder }
}
#[must_use]
pub struct GetRecordRequest {
builder: RequestBuilder,
}
impl GetRecordRequest {
pub fn send(self, client: &KintoneClient) -> Result<GetRecordResponse, ApiError> {
self.builder.call(client)
}
}
#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct GetRecordResponse {
pub record: Record,
}
pub fn get_records(app: u64) -> GetRecordsRequest {
let builder = RequestBuilder::new(http::Method::GET, "/v1/records.json").query("app", app);
GetRecordsRequest { builder }
}
#[must_use]
pub struct GetRecordsRequest {
builder: RequestBuilder,
}
#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct GetRecordsResponse {
pub records: Vec<Record>,
#[serde(with = "option_stringified")]
pub total_count: Option<usize>,
}
impl GetRecordsRequest {
pub fn fields(mut self, fields: &[&str]) -> Self {
self.builder = self.builder.query_array("fields", fields);
self
}
pub fn query(mut self, query: &str) -> Self {
self.builder = self.builder.query("query", query);
self
}
pub fn total_count(mut self, total_count: bool) -> Self {
self.builder = self.builder.query("totalCount", total_count);
self
}
pub fn send(self, client: &KintoneClient) -> Result<GetRecordsResponse, ApiError> {
self.builder.call(client)
}
}
pub fn add_record(app: u64) -> AddRecordRequest {
let builder = RequestBuilder::new(http::Method::POST, "/v1/record.json");
AddRecordRequest {
builder,
body: AddRecordRequestBody { app, record: None },
}
}
#[must_use]
pub struct AddRecordRequest {
builder: RequestBuilder,
pub(crate) body: AddRecordRequestBody,
}
#[derive(Serialize)]
#[serde(rename_all = "camelCase")]
pub struct AddRecordRequestBody {
app: u64,
record: Option<Record>,
}
#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct AddRecordResponse {
#[serde(with = "stringified")]
pub id: u64,
#[serde(with = "stringified")]
pub revision: u64,
}
impl AddRecordRequest {
pub fn record(mut self, record: Record) -> Self {
self.body.record = Some(record);
self
}
pub fn send(self, client: &KintoneClient) -> Result<AddRecordResponse, ApiError> {
self.builder.send(client, self.body)
}
}
pub fn add_records(app: u64, records: Vec<Record>) -> AddRecordsRequest {
let builder = RequestBuilder::new(http::Method::POST, "/v1/records.json");
AddRecordsRequest {
builder,
body: AddRecordsRequestBody { app, records },
}
}
#[must_use]
pub struct AddRecordsRequest {
builder: RequestBuilder,
pub(crate) body: AddRecordsRequestBody,
}
#[derive(Serialize)]
#[serde(rename_all = "camelCase")]
pub struct AddRecordsRequestBody {
app: u64,
records: Vec<Record>,
}
#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct AddRecordsResponse {
pub ids: Vec<String>,
pub revisions: Vec<String>,
}
impl AddRecordsRequest {
pub fn send(self, client: &KintoneClient) -> Result<AddRecordsResponse, ApiError> {
self.builder.send(client, self.body)
}
}
pub fn update_record(app: u64) -> UpdateRecordRequest {
let builder = RequestBuilder::new(http::Method::PUT, "/v1/record.json");
UpdateRecordRequest {
builder,
body: UpdateRecordRequestBody {
app,
id: None,
update_key: None,
record: None,
revision: None,
},
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
pub enum UpdateKeyValue {
String(String),
Number(BigDecimal),
}
impl From<String> for UpdateKeyValue {
fn from(value: String) -> Self {
UpdateKeyValue::String(value)
}
}
impl From<&str> for UpdateKeyValue {
fn from(value: &str) -> Self {
UpdateKeyValue::String(value.to_string())
}
}
impl From<BigDecimal> for UpdateKeyValue {
fn from(value: BigDecimal) -> Self {
UpdateKeyValue::Number(value)
}
}
impl From<i64> for UpdateKeyValue {
fn from(value: i64) -> Self {
UpdateKeyValue::Number(BigDecimal::from(value))
}
}
impl From<u64> for UpdateKeyValue {
fn from(value: u64) -> Self {
UpdateKeyValue::Number(BigDecimal::from(value))
}
}
impl From<i32> for UpdateKeyValue {
fn from(value: i32) -> Self {
UpdateKeyValue::Number(BigDecimal::from(value))
}
}
impl From<u32> for UpdateKeyValue {
fn from(value: u32) -> Self {
UpdateKeyValue::Number(BigDecimal::from(value))
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct UpdateKey {
pub field: String,
pub value: UpdateKeyValue,
}
#[must_use]
pub struct UpdateRecordRequest {
builder: RequestBuilder,
pub(crate) body: UpdateRecordRequestBody,
}
#[derive(Serialize)]
#[serde(rename_all = "camelCase")]
pub struct UpdateRecordRequestBody {
app: u64,
id: Option<u64>,
update_key: Option<UpdateKey>,
record: Option<Record>,
revision: Option<u64>,
}
#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct UpdateRecordResponse {
#[serde(with = "stringified")]
pub revision: u64,
}
impl UpdateRecordRequest {
pub fn id(mut self, id: u64) -> Self {
self.body.id = Some(id);
self
}
pub fn update_key(mut self, field: String, value: impl Into<UpdateKeyValue>) -> Self {
self.body.update_key = Some(UpdateKey {
field,
value: value.into(),
});
self
}
pub fn record(mut self, record: Record) -> Self {
self.body.record = Some(record);
self
}
pub fn revision(mut self, revision: u64) -> Self {
self.body.revision = Some(revision);
self
}
pub fn send(self, client: &KintoneClient) -> Result<UpdateRecordResponse, ApiError> {
self.builder.send(client, self.body)
}
}
pub fn update_records(app: u64, records: Vec<UpdateRecordData>) -> UpdateRecordsRequest {
let builder = RequestBuilder::new(http::Method::PUT, "/v1/records.json");
UpdateRecordsRequest {
builder,
body: UpdateRecordsRequestBody {
app,
records,
upsert: None,
},
}
}
#[derive(Debug, Clone, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct UpdateRecordData {
#[serde(skip_serializing_if = "Option::is_none")]
pub id: Option<u64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub update_key: Option<UpdateKey>,
#[serde(skip_serializing_if = "Option::is_none")]
pub record: Option<Record>,
#[serde(skip_serializing_if = "Option::is_none")]
pub revision: Option<u64>,
}
impl UpdateRecordData {
pub fn new() -> Self {
Self {
id: None,
update_key: None,
record: None,
revision: None,
}
}
pub fn id(mut self, id: u64) -> Self {
self.id = Some(id);
self
}
pub fn update_key(mut self, field: String, value: impl Into<UpdateKeyValue>) -> Self {
self.update_key = Some(UpdateKey {
field,
value: value.into(),
});
self
}
pub fn record(mut self, record: Record) -> Self {
self.record = Some(record);
self
}
pub fn revision(mut self, revision: u64) -> Self {
self.revision = Some(revision);
self
}
}
impl Default for UpdateRecordData {
fn default() -> Self {
Self::new()
}
}
#[must_use]
pub struct UpdateRecordsRequest {
builder: RequestBuilder,
pub(crate) body: UpdateRecordsRequestBody,
}
#[derive(Serialize)]
#[serde(rename_all = "camelCase")]
pub struct UpdateRecordsRequestBody {
app: u64,
records: Vec<UpdateRecordData>,
#[serde(skip_serializing_if = "Option::is_none")]
upsert: Option<bool>,
}
#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct UpdateRecordsResponse {
pub records: Vec<UpdatedRecordInfo>,
}
#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct UpdatedRecordInfo {
pub id: String,
pub revision: String,
pub operation: String,
}
impl UpdateRecordsRequest {
pub fn upsert(mut self, upsert: bool) -> Self {
self.body.upsert = Some(upsert);
self
}
pub fn send(self, client: &KintoneClient) -> Result<UpdateRecordsResponse, ApiError> {
self.builder.send(client, self.body)
}
}
pub fn delete_records(app: u64, ids: Vec<u64>) -> DeleteRecordsRequest {
let builder = RequestBuilder::new(http::Method::DELETE, "/v1/records.json");
DeleteRecordsRequest {
builder,
body: DeleteRecordsRequestBody {
app,
ids,
revisions: None,
},
}
}
#[must_use]
pub struct DeleteRecordsRequest {
builder: RequestBuilder,
pub(crate) body: DeleteRecordsRequestBody,
}
#[derive(Serialize)]
#[serde(rename_all = "camelCase")]
pub struct DeleteRecordsRequestBody {
app: u64,
ids: Vec<u64>,
#[serde(skip_serializing_if = "Option::is_none")]
revisions: Option<Vec<u64>>,
}
#[derive(Debug, Clone, Deserialize)]
pub struct DeleteRecordsResponse {
}
impl DeleteRecordsRequest {
pub fn revisions(mut self, revisions: Vec<u64>) -> Self {
self.body.revisions = Some(revisions);
self
}
pub fn send(self, client: &KintoneClient) -> Result<DeleteRecordsResponse, ApiError> {
self.builder.send(client, self.body)
}
}
pub fn get_comments(app: u64, record: u64) -> GetCommentsRequest {
let builder = RequestBuilder::new(http::Method::GET, "/v1/record/comments.json")
.query("app", app)
.query("record", record);
GetCommentsRequest { builder }
}
#[must_use]
pub struct GetCommentsRequest {
builder: RequestBuilder,
}
#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct GetCommentsResponse {
pub comments: Vec<PostedRecordComment>,
pub older: bool,
pub newer: bool,
}
impl GetCommentsRequest {
pub fn order(mut self, order: Order) -> Self {
self.builder = self.builder.query("order", order);
self
}
pub fn offset(mut self, offset: u64) -> Self {
self.builder = self.builder.query("offset", offset);
self
}
pub fn limit(mut self, limit: u64) -> Self {
self.builder = self.builder.query("limit", limit);
self
}
pub fn send(self, client: &KintoneClient) -> Result<GetCommentsResponse, ApiError> {
self.builder.call(client)
}
}
pub fn add_comment(app: u64, record: u64, comment: RecordComment) -> AddCommentRequest {
let builder = RequestBuilder::new(http::Method::POST, "/v1/record/comment.json");
AddCommentRequest {
builder,
body: AddCommentRequestBody {
app,
record,
comment,
},
}
}
#[must_use]
pub struct AddCommentRequest {
builder: RequestBuilder,
body: AddCommentRequestBody,
}
#[derive(Serialize)]
#[serde(rename_all = "camelCase")]
pub struct AddCommentRequestBody {
app: u64,
record: u64,
comment: RecordComment,
}
#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct AddCommentResponse {
#[serde(with = "stringified")]
pub id: u64,
}
impl AddCommentRequest {
pub fn send(self, client: &KintoneClient) -> Result<AddCommentResponse, ApiError> {
self.builder.send(client, self.body)
}
}
pub fn delete_comment(app: u64, record: u64, comment: u64) -> DeleteCommentRequest {
let builder = RequestBuilder::new(http::Method::DELETE, "/v1/record/comment.json");
DeleteCommentRequest {
builder,
body: DeleteCommentRequestBody {
app,
record,
comment,
},
}
}
#[must_use]
pub struct DeleteCommentRequest {
builder: RequestBuilder,
body: DeleteCommentRequestBody,
}
#[derive(Serialize)]
#[serde(rename_all = "camelCase")]
pub struct DeleteCommentRequestBody {
app: u64,
record: u64,
comment: u64,
}
#[derive(Debug, Clone, Deserialize)]
pub struct DeleteCommentResponse {
}
impl DeleteCommentRequest {
pub fn send(self, client: &KintoneClient) -> Result<DeleteCommentResponse, ApiError> {
self.builder.send(client, self.body)
}
}
pub fn update_assignees(app: u64, id: u64, assignees: Vec<String>) -> UpdateAssigneesRequest {
let builder = RequestBuilder::new(http::Method::PUT, "/v1/record/assignees.json");
UpdateAssigneesRequest {
builder,
body: UpdateAssigneesRequestBody {
app,
id,
assignees,
revision: None,
},
}
}
#[must_use]
pub struct UpdateAssigneesRequest {
builder: RequestBuilder,
pub(crate) body: UpdateAssigneesRequestBody,
}
#[derive(Serialize)]
#[serde(rename_all = "camelCase")]
pub struct UpdateAssigneesRequestBody {
app: u64,
id: u64,
assignees: Vec<String>,
revision: Option<u64>,
}
#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct UpdateAssigneesResponse {
#[serde(with = "stringified")]
pub revision: u64,
}
impl UpdateAssigneesRequest {
pub fn revision(mut self, revision: u64) -> Self {
self.body.revision = Some(revision);
self
}
pub fn send(self, client: &KintoneClient) -> Result<UpdateAssigneesResponse, ApiError> {
self.builder.send(client, self.body)
}
}
pub fn update_status(app: u64, id: u64, action: String) -> UpdateStatusRequest {
let builder = RequestBuilder::new(http::Method::PUT, "/v1/record/status.json");
UpdateStatusRequest {
builder,
body: UpdateStatusRequestBody {
app,
id,
action,
assignee: None,
revision: None,
},
}
}
#[must_use]
pub struct UpdateStatusRequest {
builder: RequestBuilder,
pub(crate) body: UpdateStatusRequestBody,
}
#[derive(Serialize)]
#[serde(rename_all = "camelCase")]
pub struct UpdateStatusRequestBody {
app: u64,
id: u64,
action: String,
assignee: Option<String>,
revision: Option<u64>,
}
#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct UpdateStatusResponse {
#[serde(with = "stringified")]
pub revision: u64,
}
impl UpdateStatusRequest {
pub fn assignee(mut self, assignee: String) -> Self {
self.body.assignee = Some(assignee);
self
}
pub fn revision(mut self, revision: u64) -> Self {
self.body.revision = Some(revision);
self
}
pub fn send(self, client: &KintoneClient) -> Result<UpdateStatusResponse, ApiError> {
self.builder.send(client, self.body)
}
}
pub fn create_cursor(app: u64) -> CreateCursorRequest {
let builder = RequestBuilder::new(http::Method::POST, "/v1/records/cursor.json");
CreateCursorRequest {
builder,
body: CreateCursorRequestBody {
app,
fields: None,
query: None,
size: None,
},
}
}
#[must_use]
pub struct CreateCursorRequest {
builder: RequestBuilder,
body: CreateCursorRequestBody,
}
#[derive(Serialize)]
#[serde(rename_all = "camelCase")]
pub struct CreateCursorRequestBody {
app: u64,
#[serde(skip_serializing_if = "Option::is_none")]
fields: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
query: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
size: Option<u64>,
}
#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct CreateCursorResponse {
pub id: String,
#[serde(with = "stringified")]
pub total_count: u64,
}
impl CreateCursorRequest {
pub fn fields(mut self, fields: &[&str]) -> Self {
self.body.fields = Some(fields.iter().map(|s| s.to_string()).collect());
self
}
pub fn query(mut self, query: &str) -> Self {
self.body.query = Some(query.to_string());
self
}
pub fn size(mut self, size: u64) -> Self {
self.body.size = Some(size);
self
}
pub fn send(self, client: &KintoneClient) -> Result<CreateCursorResponse, ApiError> {
self.builder.send(client, self.body)
}
}
pub fn get_records_by_cursor(id: &str) -> GetRecordsByCursorRequest {
let builder = RequestBuilder::new(http::Method::GET, "/v1/records/cursor.json").query("id", id);
GetRecordsByCursorRequest { builder }
}
#[must_use]
pub struct GetRecordsByCursorRequest {
builder: RequestBuilder,
}
#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct GetRecordsByCursorResponse {
pub records: Vec<Record>,
pub next: bool,
}
impl GetRecordsByCursorRequest {
pub fn send(self, client: &KintoneClient) -> Result<GetRecordsByCursorResponse, ApiError> {
self.builder.call(client)
}
}
pub fn delete_cursor(id: &str) -> DeleteCursorRequest {
let builder = RequestBuilder::new(http::Method::DELETE, "/v1/records/cursor.json");
DeleteCursorRequest {
builder,
body: DeleteCursorRequestBody { id: id.to_string() },
}
}
#[must_use]
pub struct DeleteCursorRequest {
builder: RequestBuilder,
body: DeleteCursorRequestBody,
}
#[derive(Serialize)]
#[serde(rename_all = "camelCase")]
pub struct DeleteCursorRequestBody {
id: String,
}
#[derive(Debug, Clone, Deserialize)]
pub struct DeleteCursorResponse {
}
impl DeleteCursorRequest {
pub fn send(self, client: &KintoneClient) -> Result<DeleteCursorResponse, ApiError> {
self.builder.send(client, self.body)
}
}
pub fn bulk_request(requests: Vec<BulkRequestItem>) -> BulkRequestRequest {
let builder = RequestBuilder::new(http::Method::POST, "/v1/bulkRequest.json");
BulkRequestRequest {
builder,
body: BulkRequestRequestBody { requests },
}
}
#[derive(Debug, Clone, Serialize)]
pub struct BulkRequestItem {
#[serde(with = "stringified")]
method: http::Method,
api: String,
payload: serde_json::Value,
}
impl TryFrom<AddRecordRequest> for BulkRequestItem {
type Error = serde_json::Error;
fn try_from(request: AddRecordRequest) -> Result<Self, Self::Error> {
Ok(Self {
method: http::Method::POST,
api: "/k/v1/record.json".to_string(),
payload: serde_json::to_value(request.body)?,
})
}
}
impl TryFrom<AddRecordsRequest> for BulkRequestItem {
type Error = serde_json::Error;
fn try_from(request: AddRecordsRequest) -> Result<Self, Self::Error> {
Ok(Self {
method: http::Method::POST,
api: "/k/v1/records.json".to_string(),
payload: serde_json::to_value(request.body)?,
})
}
}
impl TryFrom<UpdateRecordRequest> for BulkRequestItem {
type Error = serde_json::Error;
fn try_from(request: UpdateRecordRequest) -> Result<Self, Self::Error> {
Ok(Self {
method: http::Method::PUT,
api: "/k/v1/record.json".to_string(),
payload: serde_json::to_value(request.body)?,
})
}
}
impl TryFrom<UpdateRecordsRequest> for BulkRequestItem {
type Error = serde_json::Error;
fn try_from(request: UpdateRecordsRequest) -> Result<Self, Self::Error> {
Ok(Self {
method: http::Method::PUT,
api: "/k/v1/records.json".to_string(),
payload: serde_json::to_value(request.body)?,
})
}
}
impl TryFrom<DeleteRecordsRequest> for BulkRequestItem {
type Error = serde_json::Error;
fn try_from(request: DeleteRecordsRequest) -> Result<Self, Self::Error> {
Ok(Self {
method: http::Method::DELETE,
api: "/k/v1/records.json".to_string(),
payload: serde_json::to_value(request.body)?,
})
}
}
impl TryFrom<UpdateAssigneesRequest> for BulkRequestItem {
type Error = serde_json::Error;
fn try_from(request: UpdateAssigneesRequest) -> Result<Self, Self::Error> {
Ok(Self {
method: http::Method::PUT,
api: "/k/v1/record/assignees.json".to_string(),
payload: serde_json::to_value(request.body)?,
})
}
}
impl TryFrom<UpdateStatusRequest> for BulkRequestItem {
type Error = serde_json::Error;
fn try_from(request: UpdateStatusRequest) -> Result<Self, Self::Error> {
Ok(Self {
method: http::Method::PUT,
api: "/k/v1/record/status.json".to_string(),
payload: serde_json::to_value(request.body)?,
})
}
}
#[must_use]
pub struct BulkRequestRequest {
builder: RequestBuilder,
body: BulkRequestRequestBody,
}
#[derive(Serialize)]
struct BulkRequestRequestBody {
requests: Vec<BulkRequestItem>,
}
#[derive(Debug, Clone, Deserialize)]
pub struct BulkRequestResponse {
pub results: Vec<serde_json::Value>,
}
impl BulkRequestRequest {
pub fn send(self, client: &KintoneClient) -> Result<BulkRequestResponse, ApiError> {
self.builder.send(client, self.body)
}
}