Compare commits

...

2 Commits

12 changed files with 310 additions and 116 deletions

View File

@ -1,4 +1,4 @@
sqlite3_file: "YetAnotherToDoList.sqlite3" sqlite3_file: 'YetAnotherToDoList.sqlite3'
log_file: "YetAnotherToDoList.log" log_file: 'YetAnotherToDoList.log'
log_UTC: false log_UTC: false
port: 4242 port: 4242

21
.editorconfig Normal file
View File

@ -0,0 +1,21 @@
root = true # false
[*]
# overrides perettier's useTabs
indent_style = tab # space
# overrides perettier's tabWidth
# indent_size = 4 # whole number
# overrides perettier's tabWidth
tab_width = 1 # whole number
end_of_line = lf # cr | crlf
charset = utf-8 # latin1 | utf-8-bom | utf-16be | utf-16le
trim_trailing_whitespace = true # false
insert_final_newline = true # false
# overrides perettier's printWidth
max_line_length = 80

1
.gitattributes vendored Normal file
View File

@ -0,0 +1 @@
* text=auto eol=lf

7
.prettierrc Normal file
View File

@ -0,0 +1,7 @@
{
"singleQuote": true,
"trailingComma": "none",
"requirePragma": false,
"insertPragma": false,
"proseWrap": "always"
}

10
.vscode/extensions.json vendored Normal file
View File

@ -0,0 +1,10 @@
{
"recommendations": [
"golang.go",
"graphql.vscode-graphql-syntax",
"mtxr.sqltools",
"mtxr.sqltools-driver-sqlite",
"streetsidesoftware.code-spell-checker",
"editorconfig.editorconfig"
]
}

11
.vscode/settings.json vendored Normal file
View File

@ -0,0 +1,11 @@
{
"sqltools.useNodeRuntime": true,
"sqltools.connections": [
{
"previewLimit": 50,
"driver": "SQLite",
"database": "${workspaceFolder:YetAnotherToDoList}/YetAnotherToDoList.sqlite3",
"name": "development"
}
]
}

View File

@ -5,10 +5,13 @@ Commands were run in the order listed below on a debian based system.
## Initial setup ## Initial setup
- Initialize go module - Initialize go module
```bash ```bash
go mod init somepi.ddns.net/gitea/gilex-dev/YetAnotherToDoList go mod init somepi.ddns.net/gitea/gilex-dev/YetAnotherToDoList
``` ```
- Install cobra-cli (try `~/go/bin/cobra-cli` if `cobra-cli` can not be found in your `PATH`)
- Install cobra-cli (try `~/go/bin/cobra-cli` if `cobra-cli` can not be found in
your `PATH`)
```bash ```bash
go install github.com/spf13/cobra-cli@latest go install github.com/spf13/cobra-cli@latest
@ -16,14 +19,19 @@ Commands were run in the order listed below on a debian based system.
``` ```
- Add missing modules - Add missing modules
```bash ```bash
go mod tidy go mod tidy
``` ```
- Add license command - Add license command
```bash ```bash
cobra-cli add license cobra-cli add license
``` ```
- Add qglgen - Add qglgen
```bash ```bash
printf '// +build tools\npackage tools\nimport (_ "github.com/99designs/gqlgen"\n _ "github.com/99designs/gqlgen/graphql/introspection")' | gofmt > tools.go printf '// +build tools\npackage tools\nimport (_ "github.com/99designs/gqlgen"\n _ "github.com/99designs/gqlgen/graphql/introspection")' | gofmt > tools.go
go mod tidy go mod tidy
@ -31,9 +39,11 @@ Commands were run in the order listed below on a debian based system.
go mod tidy go mod tidy
cobra-cli add server cobra-cli add server
``` ```
- Add go-sqlite3 - Add go-sqlite3
```bash ```bash
go get github.com/mattn/go-sqlite3 go get github.com/mattn/go-sqlite3
CGO_ENABLED=1 go install github.com/mattn/go-sqlite3 # you may need to install gcc if not already present CGO_ENABLED=1 go install github.com/mattn/go-sqlite3 # you may need to install gcc if not already present
go mod tidy go mod tidy
``` ```

127
CONTRIBUTIN.md Normal file
View File

@ -0,0 +1,127 @@
---
gitea: none
include_toc: true
---
# Contributing
This is a personal project to learn new languages and technics and thus does not
really have a future you could contribute to. You are however welcome to fork
and modify it while following the guidelines and licenses in
[COPYING.md](./COPYING.md).
## Environment
Preferred editor: [VSCodium](https://vscodium.com/) with some
[extensions](./.vscode/extensions.json).
For dependencies/tools, make sure to use the versions specified in
[INSTALL.md#requirements](./INSTALL.md#requirements).
## Coding conventions/formatting
There is a [.editorconfig](./.editorconfig) file to use with compatible editors
[1](https://editorconfig.org/#pre-installed), or with those who have plugins
available [2](https://editorconfig.org/#download).
Please use [prettier](https://prettier.io/) and the supplied
[configuration](./.prettierrc) to format the following file types:
- `.js`
- `.vue`
- `.css`
- `.md`
- `.yaml`
- `.graphqls`, `.graphql`
- `.json`
Use the following formatters with the following types:
- `.go` (use gofmt)
No formatter specified for the following types (adapt to existing style):
- `Makefile`
- `.sql`
- `.mod`, `.sum`
Do **not** change the formatting of license texts (e.g.
[COPYING.md](./COPYING.md)).
### General
- We indent using `tabs` (4 spaces wide).
- We use single-quotes `'` where possible.
- We use `LF` line endings (enforced by [.gitattributes](./.gitattributes)).
- We use `UTF-8` encoding where possible.
- We end files with an empty line.
- We use the string `TODO` to mark bits of code that need improvement.
- We use the string `DEBUG` to mark bits of code that are only for debugging
(remove before next commit).
- We add (if possible) the following header to files that contain a reasonable
amount of self-written code or are essential to the project:
```text
/*
YetAnotherToDoList
Copyright © YYYY name your@email
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, version 3.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
```
### File specific rules
#### Markdown (.md)
- We add a single `h1` element per document (as a title of the document).
- We use asterisks `*` for **bold** and _italic_, not underscores `_` .
- We don't use citation blocks `>` for emphasis.
- We end sentences with a full stop `.` .
- We leave one space around backticks `` ` `` when used as inline code.
- We add new lines around codeblocks ` ``` ` .
- We indent using spaces (2 spaces wide).
- We add a table of content (toc) in gitea's style where necessary:
```
---
gitea: none
include_toc: true
---
```
#### YAML
We indent using spaces (1 space wide).
#### Bash (.sh)
We use `env` in the shebang: `#!/usr/bin/env bash`.
### File endings
#### .yaml and .yml
We use the `.yaml` file ending.
#### .graphql and .graphqls
- We use `.graphql` for writing client queries.
- We use `.graphqls` for defining our graph scheme.
## Commit messages
- We write in all lowercase except for special names, e.g. `update Makefile`
- We write in imperative mood, e.g. `add contribution guidelines`, not
`adding ... ` or `adds ... `.

View File

@ -1,12 +1,19 @@
# YetAnotherToDoList # YetAnotherToDoList
A simple To Do List Web Application with Go backend, Vue.js frontend and a GraphQL API. A simple To Do List Web Application with Go backend, Vue.js frontend and a
GraphQL API.
This is a simple project I created to learn the [Go](https://go.dev/) language, [GraphQL](https://graphql.org/) and [Vue.js](https://vuejs.org). This is a simple project I created to learn the [Go](https://go.dev/) language,
[GraphQL](https://graphql.org/) and [Vue.js](https://vuejs.org).
Instructions on how to install can be found in [INSTALL.md](./INSTALL.md). Instructions on how to install can be found in [INSTALL.md](./INSTALL.md).
Once installed, you might want to run the queries in [example.graphql](./example.graphql). Once installed, you might want to run the queries in
[example.graphql](./example.graphql).
## Contributing
For contributing see [CONTRIBUTING.md](./CONTRIBUTIN.md).
## License ## License

View File

@ -1,77 +1,77 @@
# you first have to add a user to create todos # you first have to add a user to create todos
query getUser { query getUser {
user(id: 1) { user(id: 1) {
id id
userName userName
fullName fullName
todos { todos {
id id
text text
done done
} }
} }
} }
query getTodo { query getTodo {
todo(id: 1) { todo(id: 1) {
id id
text text
done done
} }
} }
query getTodos { query getTodos {
todos { todos {
id id
text text
done done
user { user {
id id
userName userName
fullName fullName
todos { todos {
id # you could continue this id # you could continue this
} }
} }
} }
} }
query getUsers { query getUsers {
users { users {
id id
userName userName
fullName fullName
todos { todos {
id # ...and this too id # ...and this too
} }
} }
} }
mutation createTodo { mutation createTodo {
createTodo(input: { userId: 2, text: "adding a router and CSRF header" }) { createTodo(input: { userId: 2, text: "adding a router and CSRF header" }) {
id id
text text
done done
} }
} }
mutation updateTodo { mutation updateTodo {
updateTodo(id: 1, changes: { done: true }) { updateTodo(id: 1, changes: { done: true }) {
id id
text text
done done
} }
} }
mutation createUser { mutation createUser {
createUser(input: { userName: "1234Lorem", fullName: "Lorem I." }) { createUser(input: { userName: "1234Lorem", fullName: "Lorem I." }) {
id id
} }
} }
mutation updateUser { mutation updateUser {
updateUser(id: "1", changes: { fullName: "Lorem Ipsum" }) { updateUser(id: "1", changes: { fullName: "Lorem Ipsum" }) {
fullName fullName
} }
} }

View File

@ -15,12 +15,12 @@
# Where are all the schema files located? globs are supported eg src/**/*.graphqls # Where are all the schema files located? globs are supported eg src/**/*.graphqls
schema: schema:
- graph/*.graphqls - graph/*.graphqls
# Where should the generated server code go? # Where should the generated server code go?
exec: exec:
filename: graph/generated.go filename: graph/generated.go
package: graph package: graph
# Uncomment to enable federation # Uncomment to enable federation
# federation: # federation:
@ -29,17 +29,17 @@ exec:
# Where should any generated models go? # Where should any generated models go?
model: model:
filename: graph/model/models_gen.go filename: graph/model/models_gen.go
package: model package: model
# Where should the resolver implementations go? # Where should the resolver implementations go?
resolver: resolver:
layout: follow-schema layout: follow-schema
dir: graph dir: graph
package: graph package: graph
filename_template: "{name}.resolvers.go" filename_template: '{name}.resolvers.go'
# Optional: turn on to not generate template comments above resolvers # Optional: turn on to not generate template comments above resolvers
# omit_template_comment: false # omit_template_comment: false
# Optional: turn on use ` + "`" + `gqlgen:"fieldName"` + "`" + ` tags in your models # Optional: turn on use ` + "`" + `gqlgen:"fieldName"` + "`" + ` tags in your models
# struct_tag: json # struct_tag: json
@ -81,7 +81,7 @@ resolver:
# gqlgen will search for any type names in the schema in these go packages # gqlgen will search for any type names in the schema in these go packages
# if they match it will use them, otherwise it will generate them. # if they match it will use them, otherwise it will generate them.
autobind: autobind:
- "somepi.ddns.net/gitea/gilex-dev/YetAnotherToDoList/graph/model" - 'somepi.ddns.net/gitea/gilex-dev/YetAnotherToDoList/graph/model'
# This section declares type mapping between the GraphQL and go type systems # This section declares type mapping between the GraphQL and go type systems
# #
@ -89,22 +89,22 @@ autobind:
# modelgen, the others will be allowed when binding to fields. Configure them to # modelgen, the others will be allowed when binding to fields. Configure them to
# your liking # your liking
models: models:
ID: ID:
model: model:
- github.com/99designs/gqlgen/graphql.ID - github.com/99designs/gqlgen/graphql.ID
- github.com/99designs/gqlgen/graphql.Int - github.com/99designs/gqlgen/graphql.Int
- github.com/99designs/gqlgen/graphql.Int64 - github.com/99designs/gqlgen/graphql.Int64
- github.com/99designs/gqlgen/graphql.Int32 - github.com/99designs/gqlgen/graphql.Int32
Int: Int:
model: model:
- github.com/99designs/gqlgen/graphql.Int - github.com/99designs/gqlgen/graphql.Int
- github.com/99designs/gqlgen/graphql.Int64 - github.com/99designs/gqlgen/graphql.Int64
- github.com/99designs/gqlgen/graphql.Int32 - github.com/99designs/gqlgen/graphql.Int32
Todo: Todo:
fields: fields:
user: user:
resolver: true resolver: true
User: User:
fields: fields:
todos: todos:
resolver: true resolver: true

View File

@ -18,51 +18,51 @@
# https://gqlgen.com/getting-started/ # https://gqlgen.com/getting-started/
type Todo { type Todo {
id: ID! id: ID!
text: String! text: String!
done: Boolean! done: Boolean!
user: User! user: User!
} }
type User { type User {
id: ID! id: ID!
userName: String! userName: String!
fullName: String! fullName: String!
todos: [Todo!]! todos: [Todo!]!
} }
type Query { type Query {
todos: [Todo!]! todos: [Todo!]!
users: [User!]! users: [User!]!
user(id: ID!): User! user(id: ID!): User!
todo(id: ID!): Todo! todo(id: ID!): Todo!
} }
input NewUser { input NewUser {
userName: String! userName: String!
fullName: String! fullName: String!
} }
input NewTodo { input NewTodo {
text: String! text: String!
userId: ID! userId: ID!
} }
input updateTodo { input updateTodo {
text: String text: String
done: Boolean done: Boolean
} }
input updateUser { input updateUser {
userName: String userName: String
fullName: String fullName: String
} }
type Mutation { type Mutation {
createUser(input: NewUser!): User! createUser(input: NewUser!): User!
createTodo(input: NewTodo!): Todo! createTodo(input: NewTodo!): Todo!
updateTodo(id: ID!, changes: updateTodo!): Todo! updateTodo(id: ID!, changes: updateTodo!): Todo!
updateUser(id: ID!, changes: updateUser!): User! updateUser(id: ID!, changes: updateUser!): User!
deleteUser(id: ID!): ID deleteUser(id: ID!): ID
deleteTodo(id: ID!): ID deleteTodo(id: ID!): ID
} }