From bd1dbcf6aa34a10a0e69eac64a2b16e6da1343d8 Mon Sep 17 00:00:00 2001 From: xdrm-brackets Date: Sun, 8 Jul 2018 10:44:50 +0200 Subject: [PATCH] update readme --- README.assets/1531039386654.png | Bin 0 -> 44129 bytes README.md | 130 ++++++++++++++++++++------------ 2 files changed, 81 insertions(+), 49 deletions(-) create mode 100644 README.assets/1531039386654.png diff --git a/README.assets/1531039386654.png b/README.assets/1531039386654.png new file mode 100644 index 0000000000000000000000000000000000000000..241d97697c70443d9e3880e0ccaaeb1a8465d151 GIT binary patch literal 44129 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 A working example is available [here](https://git.xdrm.io/example/gfw) +> A working example is available [here](https://git.xdrm.io/example/aicra) @@ -44,64 +28,116 @@ You need a recent machine with `go` installed. -##### (1) Installation - -Run the following command to fetch and install the package : +##### (1) Download and install the package ```bash -go get -u git.xdrm.io/go/aicra +$ go get -u git.xdrm.io/go/aicra ``` It should now be available locally and available for your imports. -You should then install the project builder to help you manage your projects, run the following command : +##### (2) Compile the command-line builder + +You should then compile the project builder to help you manage your projects. ```bash -go install git.xdrm.io/go/aicra/cmd/aicra +$ go install git.xdrm.io/go/aicra/cmd/aicra ``` -The executable `aicra` will be placed into your `$GOPATH/bin` folder, if added to your environment PATH it should be available as a standalone command in your terminal. If not, you can simply run `$GOPATH/bin/aicra` to use the command or create a symlink into `/usr/local/bin` or the PATH folder of your choice for less characters to type. + + +> The executable `aicra` will be placed into your `$GOPATH/bin` folder, if added to your environment PATH it should be available as a standalone command in your terminal. If not, you can simply run `$GOPATH/bin/aicra` to use the command or create a symlink into `/usr/local/bin` or the PATH folder of your choice for less characters to type. #### 2. Setup a project -To create a project using **aicra**, simply create an empty folder. Then you'll have to create a `manifest.json` file containing your API description. To write your manifest file, follow this [example](https://git.xdrm.io/example/aicra/src/master/manifest.json). +The default project structure for **aicra** is as follows : + +``` +├── main.go - the entry point +├── manifest.json - the configuration file +├── middleware - middleware implementations +├── controller - controller implementations +└── types - custom type for the type checker + +``` + +In order for your project to be run, each controller, middleware and type have to be compiled as *plugins* (*i.e. shared objects*). They can then be loaded by the server. -##### (1) Controllers +##### (1) Configuration -For each *uri*, you'll have to place your implementation into the local `root` folder following the following naming convention : add `i.go` at the end of the route. +The whole project behavior is described inside the `manifest.json` file. For a better understanding of the format, take a look at this working [template](https://git.xdrm.io/example/aicra/src/master/manifest.json). This file contains information about : -> **Example** - `/path/to/some/uri` will be implemented in the *./root* local folder inside the file : `/path/to/some/urii.go`. +- resources routes and their methods +- every input for each method (called *argument*) +- every output for each method +- scope permissions +- input policy : type, required/optional, default value, variable renaming, etc. + + + +##### (2) Controllers + +For each route, you'll have to place your implementation into the `controller` folder following the naming convention : add `/i.go` at the end of the route. + +> Example - `/path/to/some/uri` will be inside `controller/path/to/some/uri/i.go`. A fully working example is available [here](https://git.xdrm.io/example/aicra). -##### (2) Custom types +##### (3) Middlewares -If you want to create custom types for the type checker or override built-in types place them inside the `./custom-types` folder. You can check what structure to follow by looking at the [built-in types](https://git.xdrm.io/go/aicra/src/master/checker/default). +In order for your project to manage authentication, the best solution is to create middlewares, there are programs that updates a *Scope* according to internal or persistent (*i.e.* database) information and the actual http request. They are all run before each request it routed by aicra. The scope are used to match the `scope` field in the configuration file and automatically block non-authed requests. Scopes can also be used for implementation-specific behavior. + + + +Each middleware must be directly inside the `middleware` folder. + +> Example - the `1-authentication` middleware will be inside `middleware/1-authentication/main.go`. + +**Note** - middleware execution will be ordered by name. Prefixing your middlewares with their order is a good practice. + + + +##### (4) Custom types + +In your configuration you will have to use built-in types (*e.g.* int, any, varchar), but if you want project-specific ones, you can add your own types inside the `type` folder. You can check what structure to follow by looking at the [built-in types](https://git.xdrm.io/go/aicra/src/master/checker/default). + + + +Each type must be inside a unique package directly inside the `type` folder. The package name is arbitrary and does not have to match the name (but it is better if it is explicit), because the `Match()` method already matches the name. #### 3. Build your project -After each controller or custom type edition, you'll have to rebuild the project. This can be achieved through the command-line builder. +After each controller, middleware or type edition, you'll have to rebuild the project. This can be achieved through the command-line builder. + Usage is `aicra [options] /path/to/your/project`. Options: -- `-c controller/path` - overrides the default controllers path ; default is `./root` - -- `-t custom/types` - overrides the default custom types path ; default is `./custom-types` +- `-c` - overrides the default controllers path ; default is `./controller` +- `-m` - overrides the default middlewares path ; default is `./middleware` +- `-t` - overrides the default custom types path ; default is `./custom-types` -#### 4. Main in go +For a project that does not need a different structure, you just have to run this command under your project root + +```bash +$ aicra . +``` + +The output should look like ![that](/storage/git.xdrm.io/GOPATH/src/git.xdrm.io/go/aicra/README.assets/1531039386654.png). + +#### 4. Main The main program is pretty small, it is as followed : @@ -109,27 +145,23 @@ The main program is pretty small, it is as followed : package main import ( - "os" + "log" "git.xdrm.io/go/aicra" ) func main() { // 1. init with manifest file - server, err := aicra.Init("manifest.json") - + server, err := aicra.New("manifest.json") if err != nil { - fmt.Printf("cannot load config : %s\n", err) - os.Exit(1) + log.Fatalf("cannot load config : %s\n", err) } - // 2. Launch server fmt.Printf("[Server up] 0.0.0.0:4242\n") - err = server.Launch(4242) - + // 2. Launch server + err = server.Listen(4242) if err != nil { - fmt.Printf("[FAILURE] server failed : %s\n", err) - os.Exit(1) + log.Fatalf("[FAILURE] server failed : %s\n", err) } } ``` @@ -142,7 +174,7 @@ func main() { ##### changelog - [x] human-readable json configuration -- [x] nested routes (*i.e. `/user/:id:` and `/user/post/​:id:​`*) +- [x] nested routes (*i.e. `/user/:id:` and `/user/post/:id:`*) - [ ] nested URL arguments (*i.e. `/user/:id:` and `/user/:id:/post/​:id:​`*) - [x] useful http methods: GET, POST, PUT, DELETE - [x] manage URL, query and body arguments: