Git Product home page Git Product logo

notion_api's Introduction

Notion API client for dart.

CI codecov

See the ROADMAP file to see what is coming next.

API implemented

Endpoint Avaliable Notes
Retrieve a database
Query a database 🏗 Working on it
List databases
Create a database Workin on more properties
Retrieve a page
Create a page Workin on more properties
Update a page Workin on more properties
Retrieve block children
Append block children
Retrieve a user
List all users
Search

Usage

Important: The methods return a NotionResponse. You can find how to use it in its documentation.

NotionClient class

You only have to create a new instance of the NotionClient class and all the API requests will be available as class methods.

NotionClient notion = NotionClient(token: 'YOUR SECRET TOKEN FROM INTEGRATIONS PAGE');

Individual classes

You can also use individual request group class like NotionPagesClient or NotionDatabasesClient. They are used like the main client but the methods are class methods instead of class properties methods.

Example

// With main class
NotionClient notion = NotionClient(token: 'YOUR_TOKEN');
notion.databases.fetchAll();

// With individual class
NotionDatabasesClient databases = NotionDatabasesClient(token: 'YOUR_TOKEN');
databases.fetchAll();

A few examples

A page created and filled using only this package:
https://jonathangomz.notion.site/notion_api-example-0893dd2cb38a413d90165cb810b3c019

To see code to create the page above or see more examples go here.

Append blocks children

// Create children instance:
Children children = Children.withBlocks([
  Heading(text: Text('Test')),
  Paragraph(texts: [
    Text('Lorem ipsum (A)'),
    Text('Lorem ipsum (B)',
        annotations: TextAnnotations(
          bold: true,
          underline: true,
          color: ColorsTypes.Orange,
        ))
  ])
]);

// Send the instance to Notion
notion.blocks.append(
  to: 'YOUR_BLOCK_ID',
  children: children,
);

Create a page

// Create a page instance
Page page = Page(
  parent: Parent.database(id: 'YOUR_DATABASE_ID'),
  title: Text('NotionClient (v1): Page test'),
);

// Send the instance to Notion.
notion.pages.create(page);

Errors

Some errors that I have encounter and still don't know how to solve because are errors that also occur on Postman are:

Create page with chidren

When the parent is a page the error is:

"body failed validation: body.properties.title.type should be an array, instead was `\"array\"`."

But when the parent is a database then the error is:

"body failed validation: body.parent.page_id should be defined, instead was `undefined`."

You can create the page first and then add the children as shown in the examples.

Contributions

Please help, I don't even know if what I'm doing is right.

Rules

Some rules to follow:

  1. Please follow the dart convention format:
    1. Effective dart
    2. dart format
  2. If you are adding a new function, please also add the documentation.
  3. If you are adding a new parameters, please also add it to the current documentation.
  4. (Optional) Run the tests to know that everything is working just fine (See how run the tests).
    • This is optional because sometimes the tests fail on GitHub actions so anyway I will check this on my computer.

Tests

To be able to run the tests you will have to have a .env file on the root directory with the next variables:

  • TOKEN: The secret token.
  • TEST_DATABASE_ID: The database id where you will be working on.
  • TEST_PAGE_ID: Some page id inside the database specified above.
  • TEST_BLOCK_ID: Some block id inside the page specified above.
  • TEST_BLOCK_HEADING_ID: Some heading block id inside the page specified above.

Example:

The values are not valid of course.

TOKEN=secret_Oa24V8FbJ49JluJankVOQihyLiMXwqSQeeHuSFobQDW
TEST_DATABASE_ID=366da3d646bb458128071fdb2fbbf427
TEST_PAGE_ID=c3b53019-4470-443b-a141-95a3a1a44g60
TEST_BLOCK_ID=c8hac4bb32af48889228bf483d938e34
TEST_BLOCK_HEADING_ID=c8hac4bb32af48889228bf483d938e34

Next release

v1.2.1:

Release date: 02/Aug/2021

  • Add constructors with only single text content with default style for:
    • Paragraph.text('some text here...')
    • ToDo.text('some text here...', checked: true)
    • Heading.text('some text here...', type: 2)
    • BulletedListItem.text('some text here...')
    • NumberedListItem.text('some text here...')
    • Toggle.text('some text here...', children: [])
  • Add more constructors for Heading class:
    • one: Heading with type 1 by default.
    • two: Heading with type 2 by default.
    • three: Heading with type 3 by default.
  • Add more constructors for Text class:
    • code: Text with code style by default.
    • italic: Text with italic style by default.
    • bold: Text with bold style by default.
    • [Opt] list: List of words separated by comma (by default).
      • Example: Text.list() will receive a list of Text and will be concatenated separated with comma by default. It may be unnecessary. Can help to make the code more readable.
    • [Opt] sep: Text separator.
      • Example: Text.sep(), by default, will insert " " in a list of Text instances, but it will be able to do more things that I don't know yet, hehe. It may be unnecessary. Can help to make the code more readable.

notion_api's People

Contributors

bgwastu avatar jonathangomz avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar

notion_api's Issues

NotionClient class was renamed to Client

Hello! I don't know if this was planned due to it being a beta version and whatnot, but using notion_api: ^2.0.0-beta2 in the dependencies and using the example, there is an error due to a class name change from NotionClient to Client.

I'm not familiar with issues or commenting on other people's packages, just wanted to let you know that the example is outdated with the most recent version 😁

Parent mapping throws exception

Thanks for the api, I'm eager to use it!

Databases attached to workspaces returns following part for parent mapping. Since id is set by using type property, json[json["type"]] returns true and fail to cast string.

Here is sample from response:

 "parent": {
    "type": "workspace",
    "workspace": true
 }

How to work with typed blocks by design?

Hi, please explain how you design work with typed Block (e.g. Paragraph) after retrieve Page?

  NotionResponse resBlocks =
      await notion.blocks.list(block_id: 'YYYYYYYYY');
  Pagination paging = resBlocks.content;
  for (Block block in paging.blocks) {
    if (block.isParagraph) {
      //<-- HOW TO GET Paragraph Object ?
    }
  }
`

Follow proper package guidelines

I just started using your package and see that I have to import every file separately for your notion package. There are 2 conventions you need to follow which is used by all packages.

  1. Could you please update your package to export all required files properly so that we don't have too many dependencies on file imports in our classes. Currently for this small bit of code.
  Future<void> createPage({required String pageId}) {
    Page page = Page(
      parent: Parent.page(id: 'YOUR_PAGE_ID'), // <- page
      title: Text('NotionClient (v1): Page test'),
    );
  }

I have to import all of this

import 'package:notion_api/notion.dart';
import 'package:notion_api/notion/general/rich_text.dart';
import 'package:notion_api/notion/objects/pages.dart';
import 'package:notion_api/notion/objects/parent.dart';

It should only be

import 'package:notion_api/notion.dart';

To achieve this all you have to do is declare an export in your notion.dart file.

export 'notion/general/rich_text.dart';
export 'notion/objects/pages.dart';
export 'notion/objects/parent.dart';
  1. Move private code into a folder called src. At the moment it's all accessible and when you do improve your code it will break all projects that use this. It's better to do it early.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.