Implement rough architecture
This commit is contained in:
2
.gitignore
vendored
2
.gitignore
vendored
@ -0,0 +1,2 @@
|
|||||||
|
api/api_server/
|
||||||
|
.vscode
|
||||||
|
|||||||
104
api/dash_api.yaml
Normal file
104
api/dash_api.yaml
Normal file
@ -0,0 +1,104 @@
|
|||||||
|
openapi: '3.0.2'
|
||||||
|
info:
|
||||||
|
title: Dash API
|
||||||
|
version: '0.1'
|
||||||
|
servers:
|
||||||
|
- url: http://localhost:18010/api/v1
|
||||||
|
- url: http://localhost:8080/api/v1
|
||||||
|
- url: https://dash.pander.me/api/v1
|
||||||
|
paths:
|
||||||
|
/journal/entry/{date}:
|
||||||
|
get:
|
||||||
|
operationId: getJournalEntryForDate
|
||||||
|
responses:
|
||||||
|
'200':
|
||||||
|
description: A journal entry for a specific day.
|
||||||
|
content:
|
||||||
|
application/json:
|
||||||
|
schema:
|
||||||
|
$ref: '#/components/schemas/JournalEntry'
|
||||||
|
parameters:
|
||||||
|
- name: date
|
||||||
|
in: path
|
||||||
|
required: true
|
||||||
|
schema:
|
||||||
|
type: string
|
||||||
|
format: date
|
||||||
|
example: 2022-02-18
|
||||||
|
post:
|
||||||
|
operationId: writeJournalEntryForDate
|
||||||
|
requestBody:
|
||||||
|
content:
|
||||||
|
application/json:
|
||||||
|
schema:
|
||||||
|
$ref: '#/components/schemas/JournalEntry'
|
||||||
|
responses:
|
||||||
|
'200':
|
||||||
|
description: Journal entry successfully written.
|
||||||
|
parameters:
|
||||||
|
- name: date
|
||||||
|
in: path
|
||||||
|
required: true
|
||||||
|
schema:
|
||||||
|
type: string
|
||||||
|
format: date
|
||||||
|
example: 2022-02-18
|
||||||
|
delete:
|
||||||
|
operationId: deleteJournalEntryForDate
|
||||||
|
responses:
|
||||||
|
'200':
|
||||||
|
description: Journal entry successfully deleted.
|
||||||
|
parameters:
|
||||||
|
- name: date
|
||||||
|
in: path
|
||||||
|
required: true
|
||||||
|
schema:
|
||||||
|
type: string
|
||||||
|
format: date
|
||||||
|
example: 2022-02-18
|
||||||
|
components:
|
||||||
|
schemas:
|
||||||
|
JournalEntry:
|
||||||
|
type: object
|
||||||
|
required:
|
||||||
|
- date
|
||||||
|
properties:
|
||||||
|
date:
|
||||||
|
type: string
|
||||||
|
format: date
|
||||||
|
example: 2022-02-18
|
||||||
|
thankful:
|
||||||
|
type: array
|
||||||
|
items:
|
||||||
|
type: string
|
||||||
|
example:
|
||||||
|
- "thankful 1"
|
||||||
|
- "thankful 2"
|
||||||
|
- "thankful 3"
|
||||||
|
looking_forward:
|
||||||
|
type: array
|
||||||
|
items:
|
||||||
|
type: string
|
||||||
|
example:
|
||||||
|
- "looking forward 1"
|
||||||
|
- "looking forward 2"
|
||||||
|
- "looking forward 3"
|
||||||
|
been_great:
|
||||||
|
type: array
|
||||||
|
items:
|
||||||
|
type: string
|
||||||
|
example:
|
||||||
|
- "been great 1"
|
||||||
|
- "been great 2"
|
||||||
|
- "been great 3"
|
||||||
|
do_better:
|
||||||
|
type: array
|
||||||
|
items:
|
||||||
|
type: string
|
||||||
|
example:
|
||||||
|
- "do better 1"
|
||||||
|
- "do better 2"
|
||||||
|
- "do better 3"
|
||||||
|
journal:
|
||||||
|
type: string
|
||||||
|
example: "journal entry 1"
|
||||||
19
api/generate_go_server.sh
Executable file
19
api/generate_go_server.sh
Executable file
@ -0,0 +1,19 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
shopt -s extglob
|
||||||
|
|
||||||
|
docker run --rm -v "${PWD}:/local" openapitools/openapi-generator-cli generate \
|
||||||
|
-i /local/dash_api.yaml \
|
||||||
|
--git-host=github.com \
|
||||||
|
--git-user-id=moustachioed \
|
||||||
|
--git-repo-id=dash \
|
||||||
|
--api-package dashapi \
|
||||||
|
--artifact-id dashapi \
|
||||||
|
--invoker-package dashapi \
|
||||||
|
--package-name dashapi \
|
||||||
|
-g go-server \
|
||||||
|
-p packageName=dashapi,featureCORS=true,outputAsLibrary=true,sourceFolder=dashapi \
|
||||||
|
-o /local/api_server
|
||||||
|
# -p packageName=dashapi,featureCORS=true,outputAsLibrary=true \
|
||||||
|
|
||||||
|
rm -rf ../backend/dashapi
|
||||||
|
cp -r ./api_server/dashapi ../backend/
|
||||||
BIN
backend/__debug_bin
Executable file
BIN
backend/__debug_bin
Executable file
Binary file not shown.
104
backend/dash_api.yaml
Normal file
104
backend/dash_api.yaml
Normal file
@ -0,0 +1,104 @@
|
|||||||
|
openapi: '3.0.2'
|
||||||
|
info:
|
||||||
|
title: Dash API
|
||||||
|
version: '0.1'
|
||||||
|
servers:
|
||||||
|
- url: http://localhost:18010/api/v1
|
||||||
|
- url: http://localhost:8080/api/v1
|
||||||
|
- url: https://dash.pander.me/api/v1
|
||||||
|
paths:
|
||||||
|
/journal/entry/{date}:
|
||||||
|
get:
|
||||||
|
operationId: getJournalEntryForDate
|
||||||
|
responses:
|
||||||
|
'200':
|
||||||
|
description: A journal entry for a specific day.
|
||||||
|
content:
|
||||||
|
application/json:
|
||||||
|
schema:
|
||||||
|
$ref: '#/components/schemas/JournalEntry'
|
||||||
|
parameters:
|
||||||
|
- name: date
|
||||||
|
in: path
|
||||||
|
required: true
|
||||||
|
schema:
|
||||||
|
type: string
|
||||||
|
format: date
|
||||||
|
example: 2022-02-18
|
||||||
|
post:
|
||||||
|
operationId: writeJournalEntryForDate
|
||||||
|
requestBody:
|
||||||
|
content:
|
||||||
|
application/json:
|
||||||
|
schema:
|
||||||
|
$ref: '#/components/schemas/JournalEntry'
|
||||||
|
responses:
|
||||||
|
'200':
|
||||||
|
description: Journal entry successfully written.
|
||||||
|
parameters:
|
||||||
|
- name: date
|
||||||
|
in: path
|
||||||
|
required: true
|
||||||
|
schema:
|
||||||
|
type: string
|
||||||
|
format: date
|
||||||
|
example: 2022-02-18
|
||||||
|
delete:
|
||||||
|
operationId: deleteJournalEntryForDate
|
||||||
|
responses:
|
||||||
|
'200':
|
||||||
|
description: Journal entry successfully deleted.
|
||||||
|
parameters:
|
||||||
|
- name: date
|
||||||
|
in: path
|
||||||
|
required: true
|
||||||
|
schema:
|
||||||
|
type: string
|
||||||
|
format: date
|
||||||
|
example: 2022-02-18
|
||||||
|
components:
|
||||||
|
schemas:
|
||||||
|
JournalEntry:
|
||||||
|
type: object
|
||||||
|
required:
|
||||||
|
- date
|
||||||
|
properties:
|
||||||
|
date:
|
||||||
|
type: string
|
||||||
|
format: date
|
||||||
|
example: 2022-02-18
|
||||||
|
thankful:
|
||||||
|
type: array
|
||||||
|
items:
|
||||||
|
type: string
|
||||||
|
example:
|
||||||
|
- "thankful 1"
|
||||||
|
- "thankful 2"
|
||||||
|
- "thankful 3"
|
||||||
|
looking_forward:
|
||||||
|
type: array
|
||||||
|
items:
|
||||||
|
type: string
|
||||||
|
example:
|
||||||
|
- "looking forward 1"
|
||||||
|
- "looking forward 2"
|
||||||
|
- "looking forward 3"
|
||||||
|
been_great:
|
||||||
|
type: array
|
||||||
|
items:
|
||||||
|
type: string
|
||||||
|
example:
|
||||||
|
- "been great 1"
|
||||||
|
- "been great 2"
|
||||||
|
- "been great 3"
|
||||||
|
do_better:
|
||||||
|
type: array
|
||||||
|
items:
|
||||||
|
type: string
|
||||||
|
example:
|
||||||
|
- "do better 1"
|
||||||
|
- "do better 2"
|
||||||
|
- "do better 3"
|
||||||
|
journal:
|
||||||
|
type: string
|
||||||
|
example: "journal entry 1"
|
||||||
37
backend/dash_backend.go
Normal file
37
backend/dash_backend.go
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
// package main
|
||||||
|
|
||||||
|
// import "fmt"
|
||||||
|
|
||||||
|
// func main() {
|
||||||
|
// fmt.Println("Hello!")
|
||||||
|
// }
|
||||||
|
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"log"
|
||||||
|
"net/http"
|
||||||
|
|
||||||
|
dashapi "github.com/moustachioed/dash/backend/dashapi"
|
||||||
|
database "github.com/moustachioed/dash/backend/database"
|
||||||
|
mapping "github.com/moustachioed/dash/backend/mapping"
|
||||||
|
service "github.com/moustachioed/dash/backend/service"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
db, err := database.NewPgDatabase("localhost", "dash", "dash", "dash", 15432)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
mapper := mapping.NewMapperImpl()
|
||||||
|
|
||||||
|
// DefaultApiService := dashapi.NewDefaultApiService()
|
||||||
|
DefaultApiService := service.NewDefaultApiService(db, mapper)
|
||||||
|
DefaultApiController := dashapi.NewDefaultApiController(DefaultApiService)
|
||||||
|
|
||||||
|
router := dashapi.NewRouter(DefaultApiController)
|
||||||
|
|
||||||
|
log.Printf("Starting server.")
|
||||||
|
log.Fatal(http.ListenAndServe(":8080", router))
|
||||||
|
}
|
||||||
37
backend/dashapi/api.go
Normal file
37
backend/dashapi/api.go
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
/*
|
||||||
|
* Dash API
|
||||||
|
*
|
||||||
|
* No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
|
||||||
|
*
|
||||||
|
* API version: 0.1
|
||||||
|
* Generated by: OpenAPI Generator (https://openapi-generator.tech)
|
||||||
|
*/
|
||||||
|
|
||||||
|
package dashapi
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"net/http"
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// DefaultApiRouter defines the required methods for binding the api requests to a responses for the DefaultApi
|
||||||
|
// The DefaultApiRouter implementation should parse necessary information from the http request,
|
||||||
|
// pass the data to a DefaultApiServicer to perform the required actions, then write the service results to the http response.
|
||||||
|
type DefaultApiRouter interface {
|
||||||
|
DeleteJournalEntryForDate(http.ResponseWriter, *http.Request)
|
||||||
|
GetJournalEntryForDate(http.ResponseWriter, *http.Request)
|
||||||
|
WriteJournalEntryForDate(http.ResponseWriter, *http.Request)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// DefaultApiServicer defines the api actions for the DefaultApi service
|
||||||
|
// This interface intended to stay up to date with the openapi yaml used to generate it,
|
||||||
|
// while the service implementation can be ignored with the .openapi-generator-ignore file
|
||||||
|
// and updated with the logic required for the API.
|
||||||
|
type DefaultApiServicer interface {
|
||||||
|
DeleteJournalEntryForDate(context.Context, string) (ImplResponse, error)
|
||||||
|
GetJournalEntryForDate(context.Context, string) (ImplResponse, error)
|
||||||
|
WriteJournalEntryForDate(context.Context, string, JournalEntry) (ImplResponse, error)
|
||||||
|
}
|
||||||
131
backend/dashapi/api_default.go
Normal file
131
backend/dashapi/api_default.go
Normal file
@ -0,0 +1,131 @@
|
|||||||
|
/*
|
||||||
|
* Dash API
|
||||||
|
*
|
||||||
|
* No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
|
||||||
|
*
|
||||||
|
* API version: 0.1
|
||||||
|
* Generated by: OpenAPI Generator (https://openapi-generator.tech)
|
||||||
|
*/
|
||||||
|
|
||||||
|
package dashapi
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"net/http"
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"github.com/gorilla/mux"
|
||||||
|
)
|
||||||
|
|
||||||
|
// DefaultApiController binds http requests to an api service and writes the service results to the http response
|
||||||
|
type DefaultApiController struct {
|
||||||
|
service DefaultApiServicer
|
||||||
|
errorHandler ErrorHandler
|
||||||
|
}
|
||||||
|
|
||||||
|
// DefaultApiOption for how the controller is set up.
|
||||||
|
type DefaultApiOption func(*DefaultApiController)
|
||||||
|
|
||||||
|
// WithDefaultApiErrorHandler inject ErrorHandler into controller
|
||||||
|
func WithDefaultApiErrorHandler(h ErrorHandler) DefaultApiOption {
|
||||||
|
return func(c *DefaultApiController) {
|
||||||
|
c.errorHandler = h
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewDefaultApiController creates a default api controller
|
||||||
|
func NewDefaultApiController(s DefaultApiServicer, opts ...DefaultApiOption) Router {
|
||||||
|
controller := &DefaultApiController{
|
||||||
|
service: s,
|
||||||
|
errorHandler: DefaultErrorHandler,
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, opt := range opts {
|
||||||
|
opt(controller)
|
||||||
|
}
|
||||||
|
|
||||||
|
return controller
|
||||||
|
}
|
||||||
|
|
||||||
|
// Routes returns all the api routes for the DefaultApiController
|
||||||
|
func (c *DefaultApiController) Routes() Routes {
|
||||||
|
return Routes{
|
||||||
|
{
|
||||||
|
"DeleteJournalEntryForDate",
|
||||||
|
strings.ToUpper("Delete"),
|
||||||
|
"/api/v1/journal/entry/{date}",
|
||||||
|
c.DeleteJournalEntryForDate,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"GetJournalEntryForDate",
|
||||||
|
strings.ToUpper("Get"),
|
||||||
|
"/api/v1/journal/entry/{date}",
|
||||||
|
c.GetJournalEntryForDate,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"WriteJournalEntryForDate",
|
||||||
|
strings.ToUpper("Post"),
|
||||||
|
"/api/v1/journal/entry/{date}",
|
||||||
|
c.WriteJournalEntryForDate,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// DeleteJournalEntryForDate -
|
||||||
|
func (c *DefaultApiController) DeleteJournalEntryForDate(w http.ResponseWriter, r *http.Request) {
|
||||||
|
params := mux.Vars(r)
|
||||||
|
dateParam := params["date"]
|
||||||
|
|
||||||
|
result, err := c.service.DeleteJournalEntryForDate(r.Context(), dateParam)
|
||||||
|
// If an error occurred, encode the error with the status code
|
||||||
|
if err != nil {
|
||||||
|
c.errorHandler(w, r, err, &result)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
// If no error, encode the body and the result code
|
||||||
|
EncodeJSONResponse(result.Body, &result.Code, w)
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetJournalEntryForDate -
|
||||||
|
func (c *DefaultApiController) GetJournalEntryForDate(w http.ResponseWriter, r *http.Request) {
|
||||||
|
params := mux.Vars(r)
|
||||||
|
dateParam := params["date"]
|
||||||
|
|
||||||
|
result, err := c.service.GetJournalEntryForDate(r.Context(), dateParam)
|
||||||
|
// If an error occurred, encode the error with the status code
|
||||||
|
if err != nil {
|
||||||
|
c.errorHandler(w, r, err, &result)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
// If no error, encode the body and the result code
|
||||||
|
EncodeJSONResponse(result.Body, &result.Code, w)
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// WriteJournalEntryForDate -
|
||||||
|
func (c *DefaultApiController) WriteJournalEntryForDate(w http.ResponseWriter, r *http.Request) {
|
||||||
|
params := mux.Vars(r)
|
||||||
|
dateParam := params["date"]
|
||||||
|
|
||||||
|
journalEntryParam := JournalEntry{}
|
||||||
|
d := json.NewDecoder(r.Body)
|
||||||
|
d.DisallowUnknownFields()
|
||||||
|
if err := d.Decode(&journalEntryParam); err != nil {
|
||||||
|
c.errorHandler(w, r, &ParsingError{Err: err}, nil)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if err := AssertJournalEntryRequired(journalEntryParam); err != nil {
|
||||||
|
c.errorHandler(w, r, err, nil)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
result, err := c.service.WriteJournalEntryForDate(r.Context(), dateParam, journalEntryParam)
|
||||||
|
// If an error occurred, encode the error with the status code
|
||||||
|
if err != nil {
|
||||||
|
c.errorHandler(w, r, err, &result)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
// If no error, encode the body and the result code
|
||||||
|
EncodeJSONResponse(result.Body, &result.Code, w)
|
||||||
|
|
||||||
|
}
|
||||||
60
backend/dashapi/api_default_service.go
Normal file
60
backend/dashapi/api_default_service.go
Normal file
@ -0,0 +1,60 @@
|
|||||||
|
/*
|
||||||
|
* Dash API
|
||||||
|
*
|
||||||
|
* No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
|
||||||
|
*
|
||||||
|
* API version: 0.1
|
||||||
|
* Generated by: OpenAPI Generator (https://openapi-generator.tech)
|
||||||
|
*/
|
||||||
|
|
||||||
|
package dashapi
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"net/http"
|
||||||
|
"errors"
|
||||||
|
)
|
||||||
|
|
||||||
|
// DefaultApiService is a service that implements the logic for the DefaultApiServicer
|
||||||
|
// This service should implement the business logic for every endpoint for the DefaultApi API.
|
||||||
|
// Include any external packages or services that will be required by this service.
|
||||||
|
type DefaultApiService struct {
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewDefaultApiService creates a default api service
|
||||||
|
func NewDefaultApiService() DefaultApiServicer {
|
||||||
|
return &DefaultApiService{}
|
||||||
|
}
|
||||||
|
|
||||||
|
// DeleteJournalEntryForDate -
|
||||||
|
func (s *DefaultApiService) DeleteJournalEntryForDate(ctx context.Context, date string) (ImplResponse, error) {
|
||||||
|
// TODO - update DeleteJournalEntryForDate with the required logic for this service method.
|
||||||
|
// Add api_default_service.go to the .openapi-generator-ignore to avoid overwriting this service implementation when updating open api generation.
|
||||||
|
|
||||||
|
//TODO: Uncomment the next line to return response Response(200, {}) or use other options such as http.Ok ...
|
||||||
|
//return Response(200, nil),nil
|
||||||
|
|
||||||
|
return Response(http.StatusNotImplemented, nil), errors.New("DeleteJournalEntryForDate method not implemented")
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetJournalEntryForDate -
|
||||||
|
func (s *DefaultApiService) GetJournalEntryForDate(ctx context.Context, date string) (ImplResponse, error) {
|
||||||
|
// TODO - update GetJournalEntryForDate with the required logic for this service method.
|
||||||
|
// Add api_default_service.go to the .openapi-generator-ignore to avoid overwriting this service implementation when updating open api generation.
|
||||||
|
|
||||||
|
//TODO: Uncomment the next line to return response Response(200, JournalEntry{}) or use other options such as http.Ok ...
|
||||||
|
//return Response(200, JournalEntry{}), nil
|
||||||
|
|
||||||
|
return Response(http.StatusNotImplemented, nil), errors.New("GetJournalEntryForDate method not implemented")
|
||||||
|
}
|
||||||
|
|
||||||
|
// WriteJournalEntryForDate -
|
||||||
|
func (s *DefaultApiService) WriteJournalEntryForDate(ctx context.Context, date string, journalEntry JournalEntry) (ImplResponse, error) {
|
||||||
|
// TODO - update WriteJournalEntryForDate with the required logic for this service method.
|
||||||
|
// Add api_default_service.go to the .openapi-generator-ignore to avoid overwriting this service implementation when updating open api generation.
|
||||||
|
|
||||||
|
//TODO: Uncomment the next line to return response Response(200, {}) or use other options such as http.Ok ...
|
||||||
|
//return Response(200, nil),nil
|
||||||
|
|
||||||
|
return Response(http.StatusNotImplemented, nil), errors.New("WriteJournalEntryForDate method not implemented")
|
||||||
|
}
|
||||||
62
backend/dashapi/error.go
Normal file
62
backend/dashapi/error.go
Normal file
@ -0,0 +1,62 @@
|
|||||||
|
/*
|
||||||
|
* Dash API
|
||||||
|
*
|
||||||
|
* No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
|
||||||
|
*
|
||||||
|
* API version: 0.1
|
||||||
|
* Generated by: OpenAPI Generator (https://openapi-generator.tech)
|
||||||
|
*/
|
||||||
|
|
||||||
|
package dashapi
|
||||||
|
|
||||||
|
import (
|
||||||
|
"errors"
|
||||||
|
"fmt"
|
||||||
|
"net/http"
|
||||||
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
// ErrTypeAssertionError is thrown when type an interface does not match the asserted type
|
||||||
|
ErrTypeAssertionError = errors.New("unable to assert type")
|
||||||
|
)
|
||||||
|
|
||||||
|
// ParsingError indicates that an error has occurred when parsing request parameters
|
||||||
|
type ParsingError struct {
|
||||||
|
Err error
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e *ParsingError) Unwrap() error {
|
||||||
|
return e.Err
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e *ParsingError) Error() string {
|
||||||
|
return e.Err.Error()
|
||||||
|
}
|
||||||
|
|
||||||
|
// RequiredError indicates that an error has occurred when parsing request parameters
|
||||||
|
type RequiredError struct {
|
||||||
|
Field string
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e *RequiredError) Error() string {
|
||||||
|
return fmt.Sprintf("required field '%s' is zero value.", e.Field)
|
||||||
|
}
|
||||||
|
|
||||||
|
// ErrorHandler defines the required method for handling error. You may implement it and inject this into a controller if
|
||||||
|
// you would like errors to be handled differently from the DefaultErrorHandler
|
||||||
|
type ErrorHandler func(w http.ResponseWriter, r *http.Request, err error, result *ImplResponse)
|
||||||
|
|
||||||
|
// DefaultErrorHandler defines the default logic on how to handle errors from the controller. Any errors from parsing
|
||||||
|
// request params will return a StatusBadRequest. Otherwise, the error code originating from the servicer will be used.
|
||||||
|
func DefaultErrorHandler(w http.ResponseWriter, r *http.Request, err error, result *ImplResponse) {
|
||||||
|
if _, ok := err.(*ParsingError); ok {
|
||||||
|
// Handle parsing errors
|
||||||
|
EncodeJSONResponse(err.Error(), func(i int) *int { return &i }(http.StatusBadRequest), w)
|
||||||
|
} else if _, ok := err.(*RequiredError); ok {
|
||||||
|
// Handle missing required errors
|
||||||
|
EncodeJSONResponse(err.Error(), func(i int) *int { return &i }(http.StatusUnprocessableEntity), w)
|
||||||
|
} else {
|
||||||
|
// Handle all other errors
|
||||||
|
EncodeJSONResponse(err.Error(), &result.Code, w)
|
||||||
|
}
|
||||||
|
}
|
||||||
54
backend/dashapi/helpers.go
Normal file
54
backend/dashapi/helpers.go
Normal file
@ -0,0 +1,54 @@
|
|||||||
|
/*
|
||||||
|
* Dash API
|
||||||
|
*
|
||||||
|
* No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
|
||||||
|
*
|
||||||
|
* API version: 0.1
|
||||||
|
* Generated by: OpenAPI Generator (https://openapi-generator.tech)
|
||||||
|
*/
|
||||||
|
|
||||||
|
package dashapi
|
||||||
|
|
||||||
|
import (
|
||||||
|
"reflect"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Response return a ImplResponse struct filled
|
||||||
|
func Response(code int, body interface{}) ImplResponse {
|
||||||
|
return ImplResponse {
|
||||||
|
Code: code,
|
||||||
|
Body: body,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// IsZeroValue checks if the val is the zero-ed value.
|
||||||
|
func IsZeroValue(val interface{}) bool {
|
||||||
|
return val == nil || reflect.DeepEqual(val, reflect.Zero(reflect.TypeOf(val)).Interface())
|
||||||
|
}
|
||||||
|
|
||||||
|
// AssertRecurseInterfaceRequired recursively checks each struct in a slice against the callback.
|
||||||
|
// This method traverse nested slices in a preorder fashion.
|
||||||
|
func AssertRecurseInterfaceRequired(obj interface{}, callback func(interface{}) error) error {
|
||||||
|
return AssertRecurseValueRequired(reflect.ValueOf(obj), callback)
|
||||||
|
}
|
||||||
|
|
||||||
|
// AssertRecurseValueRequired checks each struct in the nested slice against the callback.
|
||||||
|
// This method traverse nested slices in a preorder fashion.
|
||||||
|
func AssertRecurseValueRequired(value reflect.Value, callback func(interface{}) error) error {
|
||||||
|
switch value.Kind() {
|
||||||
|
// If it is a struct we check using callback
|
||||||
|
case reflect.Struct:
|
||||||
|
if err := callback(value.Interface()); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// If it is a slice we continue recursion
|
||||||
|
case reflect.Slice:
|
||||||
|
for i := 0; i < value.Len(); i += 1 {
|
||||||
|
if err := AssertRecurseValueRequired(value.Index(i), callback); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
16
backend/dashapi/impl.go
Normal file
16
backend/dashapi/impl.go
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
/*
|
||||||
|
* Dash API
|
||||||
|
*
|
||||||
|
* No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
|
||||||
|
*
|
||||||
|
* API version: 0.1
|
||||||
|
* Generated by: OpenAPI Generator (https://openapi-generator.tech)
|
||||||
|
*/
|
||||||
|
|
||||||
|
package dashapi
|
||||||
|
|
||||||
|
// ImplResponse response defines an error code with the associated body
|
||||||
|
type ImplResponse struct {
|
||||||
|
Code int
|
||||||
|
Body interface{}
|
||||||
|
}
|
||||||
32
backend/dashapi/logger.go
Normal file
32
backend/dashapi/logger.go
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
/*
|
||||||
|
* Dash API
|
||||||
|
*
|
||||||
|
* No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
|
||||||
|
*
|
||||||
|
* API version: 0.1
|
||||||
|
* Generated by: OpenAPI Generator (https://openapi-generator.tech)
|
||||||
|
*/
|
||||||
|
|
||||||
|
package dashapi
|
||||||
|
|
||||||
|
import (
|
||||||
|
"log"
|
||||||
|
"net/http"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
func Logger(inner http.Handler, name string) http.Handler {
|
||||||
|
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||||
|
start := time.Now()
|
||||||
|
|
||||||
|
inner.ServeHTTP(w, r)
|
||||||
|
|
||||||
|
log.Printf(
|
||||||
|
"%s %s %s %s",
|
||||||
|
r.Method,
|
||||||
|
r.RequestURI,
|
||||||
|
name,
|
||||||
|
time.Since(start),
|
||||||
|
)
|
||||||
|
})
|
||||||
|
}
|
||||||
51
backend/dashapi/model_journal_entry.go
Normal file
51
backend/dashapi/model_journal_entry.go
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
/*
|
||||||
|
* Dash API
|
||||||
|
*
|
||||||
|
* No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
|
||||||
|
*
|
||||||
|
* API version: 0.1
|
||||||
|
* Generated by: OpenAPI Generator (https://openapi-generator.tech)
|
||||||
|
*/
|
||||||
|
|
||||||
|
package dashapi
|
||||||
|
|
||||||
|
type JournalEntry struct {
|
||||||
|
|
||||||
|
Date string `json:"date"`
|
||||||
|
|
||||||
|
Thankful []string `json:"thankful,omitempty"`
|
||||||
|
|
||||||
|
LookingForward []string `json:"looking_forward,omitempty"`
|
||||||
|
|
||||||
|
BeenGreat []string `json:"been_great,omitempty"`
|
||||||
|
|
||||||
|
DoBetter []string `json:"do_better,omitempty"`
|
||||||
|
|
||||||
|
Journal string `json:"journal,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// AssertJournalEntryRequired checks if the required fields are not zero-ed
|
||||||
|
func AssertJournalEntryRequired(obj JournalEntry) error {
|
||||||
|
elements := map[string]interface{}{
|
||||||
|
"date": obj.Date,
|
||||||
|
}
|
||||||
|
for name, el := range elements {
|
||||||
|
if isZero := IsZeroValue(el); isZero {
|
||||||
|
return &RequiredError{Field: name}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// AssertRecurseJournalEntryRequired recursively checks if required fields are not zero-ed in a nested slice.
|
||||||
|
// Accepts only nested slice of JournalEntry (e.g. [][]JournalEntry), otherwise ErrTypeAssertionError is thrown.
|
||||||
|
func AssertRecurseJournalEntryRequired(objSlice interface{}) error {
|
||||||
|
return AssertRecurseInterfaceRequired(objSlice, func(obj interface{}) error {
|
||||||
|
aJournalEntry, ok := obj.(JournalEntry)
|
||||||
|
if !ok {
|
||||||
|
return ErrTypeAssertionError
|
||||||
|
}
|
||||||
|
return AssertJournalEntryRequired(aJournalEntry)
|
||||||
|
})
|
||||||
|
}
|
||||||
219
backend/dashapi/routers.go
Normal file
219
backend/dashapi/routers.go
Normal file
@ -0,0 +1,219 @@
|
|||||||
|
/*
|
||||||
|
* Dash API
|
||||||
|
*
|
||||||
|
* No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
|
||||||
|
*
|
||||||
|
* API version: 0.1
|
||||||
|
* Generated by: OpenAPI Generator (https://openapi-generator.tech)
|
||||||
|
*/
|
||||||
|
|
||||||
|
package dashapi
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"errors"
|
||||||
|
"github.com/gorilla/mux"
|
||||||
|
"github.com/gorilla/handlers"
|
||||||
|
"io/ioutil"
|
||||||
|
"mime/multipart"
|
||||||
|
"net/http"
|
||||||
|
"os"
|
||||||
|
"strconv"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
// A Route defines the parameters for an api endpoint
|
||||||
|
type Route struct {
|
||||||
|
Name string
|
||||||
|
Method string
|
||||||
|
Pattern string
|
||||||
|
HandlerFunc http.HandlerFunc
|
||||||
|
}
|
||||||
|
|
||||||
|
// Routes are a collection of defined api endpoints
|
||||||
|
type Routes []Route
|
||||||
|
|
||||||
|
// Router defines the required methods for retrieving api routes
|
||||||
|
type Router interface {
|
||||||
|
Routes() Routes
|
||||||
|
}
|
||||||
|
|
||||||
|
const errMsgRequiredMissing = "required parameter is missing"
|
||||||
|
|
||||||
|
// NewRouter creates a new router for any number of api routers
|
||||||
|
func NewRouter(routers ...Router) *mux.Router {
|
||||||
|
router := mux.NewRouter().StrictSlash(true)
|
||||||
|
for _, api := range routers {
|
||||||
|
for _, route := range api.Routes() {
|
||||||
|
var handler http.Handler
|
||||||
|
handler = route.HandlerFunc
|
||||||
|
handler = Logger(handler, route.Name)
|
||||||
|
handler = handlers.CORS()(handler)
|
||||||
|
|
||||||
|
router.
|
||||||
|
Methods(route.Method).
|
||||||
|
Path(route.Pattern).
|
||||||
|
Name(route.Name).
|
||||||
|
Handler(handler)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return router
|
||||||
|
}
|
||||||
|
|
||||||
|
// EncodeJSONResponse uses the json encoder to write an interface to the http response with an optional status code
|
||||||
|
func EncodeJSONResponse(i interface{}, status *int, w http.ResponseWriter) error {
|
||||||
|
w.Header().Set("Content-Type", "application/json; charset=UTF-8")
|
||||||
|
if status != nil {
|
||||||
|
w.WriteHeader(*status)
|
||||||
|
} else {
|
||||||
|
w.WriteHeader(http.StatusOK)
|
||||||
|
}
|
||||||
|
|
||||||
|
return json.NewEncoder(w).Encode(i)
|
||||||
|
}
|
||||||
|
|
||||||
|
// ReadFormFileToTempFile reads file data from a request form and writes it to a temporary file
|
||||||
|
func ReadFormFileToTempFile(r *http.Request, key string) (*os.File, error) {
|
||||||
|
_, fileHeader, err := r.FormFile(key)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return readFileHeaderToTempFile(fileHeader)
|
||||||
|
}
|
||||||
|
|
||||||
|
// ReadFormFilesToTempFiles reads files array data from a request form and writes it to a temporary files
|
||||||
|
func ReadFormFilesToTempFiles(r *http.Request, key string) ([]*os.File, error) {
|
||||||
|
if err := r.ParseMultipartForm(32 << 20); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
files := make([]*os.File, 0, len(r.MultipartForm.File[key]))
|
||||||
|
|
||||||
|
for _, fileHeader := range r.MultipartForm.File[key] {
|
||||||
|
file, err := readFileHeaderToTempFile(fileHeader)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
files = append(files, file)
|
||||||
|
}
|
||||||
|
|
||||||
|
return files, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// readFileHeaderToTempFile reads multipart.FileHeader and writes it to a temporary file
|
||||||
|
func readFileHeaderToTempFile(fileHeader *multipart.FileHeader) (*os.File, error) {
|
||||||
|
formFile, err := fileHeader.Open()
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
defer formFile.Close()
|
||||||
|
|
||||||
|
fileBytes, err := ioutil.ReadAll(formFile)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
file, err := ioutil.TempFile("", fileHeader.Filename)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
defer file.Close()
|
||||||
|
|
||||||
|
file.Write(fileBytes)
|
||||||
|
|
||||||
|
return file, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// parseInt64Parameter parses a string parameter to an int64.
|
||||||
|
func parseInt64Parameter(param string, required bool) (int64, error) {
|
||||||
|
if param == "" {
|
||||||
|
if required {
|
||||||
|
return 0, errors.New(errMsgRequiredMissing)
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
return strconv.ParseInt(param, 10, 64)
|
||||||
|
}
|
||||||
|
|
||||||
|
// parseInt32Parameter parses a string parameter to an int32.
|
||||||
|
func parseInt32Parameter(param string, required bool) (int32, error) {
|
||||||
|
if param == "" {
|
||||||
|
if required {
|
||||||
|
return 0, errors.New(errMsgRequiredMissing)
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
val, err := strconv.ParseInt(param, 10, 32)
|
||||||
|
if err != nil {
|
||||||
|
return -1, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return int32(val), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// parseBoolParameter parses a string parameter to a bool
|
||||||
|
func parseBoolParameter(param string) (bool, error) {
|
||||||
|
val, err := strconv.ParseBool(param)
|
||||||
|
if err != nil {
|
||||||
|
return false, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return bool(val), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// parseInt64ArrayParameter parses a string parameter containing array of values to []int64.
|
||||||
|
func parseInt64ArrayParameter(param, delim string, required bool) ([]int64, error) {
|
||||||
|
if param == "" {
|
||||||
|
if required {
|
||||||
|
return nil, errors.New(errMsgRequiredMissing)
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
str := strings.Split(param, delim)
|
||||||
|
ints := make([]int64, len(str))
|
||||||
|
|
||||||
|
for i, s := range str {
|
||||||
|
if v, err := strconv.ParseInt(s, 10, 64); err != nil {
|
||||||
|
return nil, err
|
||||||
|
} else {
|
||||||
|
ints[i] = v
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return ints, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// parseInt32ArrayParameter parses a string parameter containing array of values to []int32.
|
||||||
|
func parseInt32ArrayParameter(param, delim string, required bool) ([]int32, error) {
|
||||||
|
if param == "" {
|
||||||
|
if required {
|
||||||
|
return nil, errors.New(errMsgRequiredMissing)
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
str := strings.Split(param, delim)
|
||||||
|
ints := make([]int32, len(str))
|
||||||
|
|
||||||
|
for i, s := range str {
|
||||||
|
if v, err := strconv.ParseInt(s, 10, 32); err != nil {
|
||||||
|
return nil, err
|
||||||
|
} else {
|
||||||
|
ints[i] = int32(v)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return ints, nil
|
||||||
|
}
|
||||||
12
backend/database/database.go
Normal file
12
backend/database/database.go
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
package database
|
||||||
|
|
||||||
|
import (
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/moustachioed/dash/backend/database/models"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Database interface {
|
||||||
|
WriteJournalEntry(dbmodel models.Journal) error
|
||||||
|
GetJournalEntryForDate(date time.Time) (models.Journal, error)
|
||||||
|
}
|
||||||
14
backend/database/models/journal.go
Normal file
14
backend/database/models/journal.go
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
package models
|
||||||
|
|
||||||
|
import (
|
||||||
|
"gorm.io/datatypes"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Journal struct {
|
||||||
|
Date datatypes.Date `gorm:"primaryKey"`
|
||||||
|
Thankful datatypes.JSON
|
||||||
|
LookingForward datatypes.JSON
|
||||||
|
BeenGreat datatypes.JSON
|
||||||
|
DoBetter datatypes.JSON
|
||||||
|
Journal string
|
||||||
|
}
|
||||||
47
backend/database/pgDatabase.go
Normal file
47
backend/database/pgDatabase.go
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
package database
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"log"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"gorm.io/driver/postgres"
|
||||||
|
"gorm.io/gorm"
|
||||||
|
|
||||||
|
"github.com/moustachioed/dash/backend/database/models"
|
||||||
|
)
|
||||||
|
|
||||||
|
type PgDatabase struct {
|
||||||
|
Db *gorm.DB
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewPgDatabase(host string, user string, password string, database string, port uint16) (Database, error) {
|
||||||
|
db := &PgDatabase{}
|
||||||
|
|
||||||
|
dsn := fmt.Sprintf("host=%s user=%s password=%s dbname=%s port=%d sslmode=disable", host, user, password, database, port)
|
||||||
|
gdb, err := gorm.Open(postgres.Open(dsn), &gorm.Config{})
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
log.Print(err.Error())
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
log.Printf("Connected to database.")
|
||||||
|
|
||||||
|
db.Db = gdb
|
||||||
|
|
||||||
|
db.migrate()
|
||||||
|
|
||||||
|
return db, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (db *PgDatabase) migrate() {
|
||||||
|
db.Db.AutoMigrate(&models.Journal{})
|
||||||
|
}
|
||||||
|
|
||||||
|
func (db *PgDatabase) WriteJournalEntry(dbmodel models.Journal) error {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (db *PgDatabase) GetJournalEntryForDate(date time.Time) (models.Journal, error) {
|
||||||
|
return models.Journal{}, nil
|
||||||
|
}
|
||||||
28
backend/go.mod
Normal file
28
backend/go.mod
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
module github.com/moustachioed/dash/backend
|
||||||
|
|
||||||
|
go 1.19
|
||||||
|
|
||||||
|
require github.com/gorilla/mux v1.7.3
|
||||||
|
|
||||||
|
require github.com/gorilla/handlers v1.5.1
|
||||||
|
|
||||||
|
require (
|
||||||
|
github.com/felixge/httpsnoop v1.0.1 // indirect
|
||||||
|
github.com/go-sql-driver/mysql v1.6.0 // indirect
|
||||||
|
github.com/jackc/chunkreader/v2 v2.0.1 // indirect
|
||||||
|
github.com/jackc/pgconn v1.13.0 // indirect
|
||||||
|
github.com/jackc/pgio v1.0.0 // indirect
|
||||||
|
github.com/jackc/pgpassfile v1.0.0 // indirect
|
||||||
|
github.com/jackc/pgproto3/v2 v2.3.1 // indirect
|
||||||
|
github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b // indirect
|
||||||
|
github.com/jackc/pgtype v1.12.0 // indirect
|
||||||
|
github.com/jackc/pgx/v4 v4.17.2 // indirect
|
||||||
|
github.com/jinzhu/inflection v1.0.0 // indirect
|
||||||
|
github.com/jinzhu/now v1.1.5 // indirect
|
||||||
|
golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa // indirect
|
||||||
|
golang.org/x/text v0.3.7 // indirect
|
||||||
|
gorm.io/datatypes v1.0.7 // indirect
|
||||||
|
gorm.io/driver/mysql v1.3.2 // indirect
|
||||||
|
gorm.io/driver/postgres v1.4.4 // indirect
|
||||||
|
gorm.io/gorm v1.24.0 // indirect
|
||||||
|
)
|
||||||
228
backend/go.sum
Normal file
228
backend/go.sum
Normal file
@ -0,0 +1,228 @@
|
|||||||
|
github.com/Azure/azure-sdk-for-go/sdk/azcore v0.19.0/go.mod h1:h6H6c8enJmmocHUbLiiGY6sx7f9i+X3m1CHdd5c6Rdw=
|
||||||
|
github.com/Azure/azure-sdk-for-go/sdk/azidentity v0.11.0/go.mod h1:HcM1YX14R7CJcghJGOYCgdezslRSVzqwLf/q+4Y2r/0=
|
||||||
|
github.com/Azure/azure-sdk-for-go/sdk/internal v0.7.0/go.mod h1:yqy467j36fJxcRV2TzfVZ1pCb5vxm4BtZPUdYWe/Xo8=
|
||||||
|
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
|
||||||
|
github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs=
|
||||||
|
github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ=
|
||||||
|
github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
|
||||||
|
github.com/coreos/go-systemd v0.0.0-20190719114852-fd7a80b32e1f/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
|
||||||
|
github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY=
|
||||||
|
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
|
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
|
github.com/denisenkom/go-mssqldb v0.12.0/go.mod h1:iiK0YP1ZeepvmBQk/QpLEhhTNJgfzrpArPY/aFvc9yU=
|
||||||
|
github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ=
|
||||||
|
github.com/felixge/httpsnoop v1.0.1 h1:lvB5Jl89CsZtGIWuTcDM1E/vkVs49/Ml7JJe07l8SPQ=
|
||||||
|
github.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U=
|
||||||
|
github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY=
|
||||||
|
github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A=
|
||||||
|
github.com/go-sql-driver/mysql v1.6.0 h1:BCTh4TKNUYmOmMUcQ3IipzF5prigylS7XXjEkfCHuOE=
|
||||||
|
github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
|
||||||
|
github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
|
||||||
|
github.com/gofrs/uuid v4.0.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM=
|
||||||
|
github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0=
|
||||||
|
github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0=
|
||||||
|
github.com/golang-sql/sqlexp v0.0.0-20170517235910-f1bb20e5a188/go.mod h1:vXjM/+wXQnTPR4KqTKDgJukSZ6amVRtWMPEjE6sQoK8=
|
||||||
|
github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
|
||||||
|
github.com/gorilla/handlers v1.5.1 h1:9lRY6j8DEeeBT10CvO9hGW0gmky0BprnvDI5vfhUHH4=
|
||||||
|
github.com/gorilla/handlers v1.5.1/go.mod h1:t8XrUpc4KVXb7HGyJ4/cEnwQiaxrX/hz1Zv/4g96P1Q=
|
||||||
|
github.com/gorilla/mux v1.7.3 h1:gnP5JzjVOuiZD07fKKToCAOjS0yOpj/qPETTXCCS6hw=
|
||||||
|
github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs=
|
||||||
|
github.com/jackc/chunkreader v1.0.0 h1:4s39bBR8ByfqH+DKm8rQA3E1LHZWB9XWcrz8fqaZbe0=
|
||||||
|
github.com/jackc/chunkreader v1.0.0/go.mod h1:RT6O25fNZIuasFJRyZ4R/Y2BbhasbmZXF9QQ7T3kePo=
|
||||||
|
github.com/jackc/chunkreader/v2 v2.0.0/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk=
|
||||||
|
github.com/jackc/chunkreader/v2 v2.0.1 h1:i+RDz65UE+mmpjTfyz0MoVTnzeYxroil2G82ki7MGG8=
|
||||||
|
github.com/jackc/chunkreader/v2 v2.0.1/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk=
|
||||||
|
github.com/jackc/pgconn v0.0.0-20190420214824-7e0022ef6ba3/go.mod h1:jkELnwuX+w9qN5YIfX0fl88Ehu4XC3keFuOJJk9pcnA=
|
||||||
|
github.com/jackc/pgconn v0.0.0-20190824142844-760dd75542eb/go.mod h1:lLjNuW/+OfW9/pnVKPazfWOgNfH2aPem8YQ7ilXGvJE=
|
||||||
|
github.com/jackc/pgconn v0.0.0-20190831204454-2fabfa3c18b7/go.mod h1:ZJKsE/KZfsUgOEh9hBm+xYTstcNHg7UPMVJqRfQxq4s=
|
||||||
|
github.com/jackc/pgconn v1.8.0/go.mod h1:1C2Pb36bGIP9QHGBYCjnyhqu7Rv3sGshaQUvmfGIB/o=
|
||||||
|
github.com/jackc/pgconn v1.9.0/go.mod h1:YctiPyvzfU11JFxoXokUOOKQXQmDMoJL9vJzHH8/2JY=
|
||||||
|
github.com/jackc/pgconn v1.9.1-0.20210724152538-d89c8390a530/go.mod h1:4z2w8XhRbP1hYxkpTuBjTS3ne3J48K83+u0zoyvg2pI=
|
||||||
|
github.com/jackc/pgconn v1.11.0/go.mod h1:4z2w8XhRbP1hYxkpTuBjTS3ne3J48K83+u0zoyvg2pI=
|
||||||
|
github.com/jackc/pgconn v1.13.0 h1:3L1XMNV2Zvca/8BYhzcRFS70Lr0WlDg16Di6SFGAbys=
|
||||||
|
github.com/jackc/pgconn v1.13.0/go.mod h1:AnowpAqO4CMIIJNZl2VJp+KrkAZciAkhEl0W0JIobpI=
|
||||||
|
github.com/jackc/pgio v1.0.0 h1:g12B9UwVnzGhueNavwioyEEpAmqMe1E/BN9ES+8ovkE=
|
||||||
|
github.com/jackc/pgio v1.0.0/go.mod h1:oP+2QK2wFfUWgr+gxjoBH9KGBb31Eio69xUb0w5bYf8=
|
||||||
|
github.com/jackc/pgmock v0.0.0-20190831213851-13a1b77aafa2/go.mod h1:fGZlG77KXmcq05nJLRkk0+p82V8B8Dw8KN2/V9c/OAE=
|
||||||
|
github.com/jackc/pgmock v0.0.0-20201204152224-4fe30f7445fd/go.mod h1:hrBW0Enj2AZTNpt/7Y5rr2xe/9Mn757Wtb2xeBzPv2c=
|
||||||
|
github.com/jackc/pgmock v0.0.0-20210724152146-4ad1a8207f65/go.mod h1:5R2h2EEX+qri8jOWMbJCtaPWkrrNc7OHwsp2TCqp7ak=
|
||||||
|
github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM=
|
||||||
|
github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg=
|
||||||
|
github.com/jackc/pgproto3 v1.1.0 h1:FYYE4yRw+AgI8wXIinMlNjBbp/UitDJwfj5LqqewP1A=
|
||||||
|
github.com/jackc/pgproto3 v1.1.0/go.mod h1:eR5FA3leWg7p9aeAqi37XOTgTIbkABlvcPB3E5rlc78=
|
||||||
|
github.com/jackc/pgproto3/v2 v2.0.0-alpha1.0.20190420180111-c116219b62db/go.mod h1:bhq50y+xrl9n5mRYyCBFKkpRVTLYJVWeCc+mEAI3yXA=
|
||||||
|
github.com/jackc/pgproto3/v2 v2.0.0-alpha1.0.20190609003834-432c2951c711/go.mod h1:uH0AWtUmuShn0bcesswc4aBTWGvw0cAxIJp+6OB//Wg=
|
||||||
|
github.com/jackc/pgproto3/v2 v2.0.0-rc3/go.mod h1:ryONWYqW6dqSg1Lw6vXNMXoBJhpzvWKnT95C46ckYeM=
|
||||||
|
github.com/jackc/pgproto3/v2 v2.0.0-rc3.0.20190831210041-4c03ce451f29/go.mod h1:ryONWYqW6dqSg1Lw6vXNMXoBJhpzvWKnT95C46ckYeM=
|
||||||
|
github.com/jackc/pgproto3/v2 v2.0.6/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA=
|
||||||
|
github.com/jackc/pgproto3/v2 v2.1.1/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA=
|
||||||
|
github.com/jackc/pgproto3/v2 v2.2.0/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA=
|
||||||
|
github.com/jackc/pgproto3/v2 v2.3.1 h1:nwj7qwf0S+Q7ISFfBndqeLwSwxs+4DPsbRFjECT1Y4Y=
|
||||||
|
github.com/jackc/pgproto3/v2 v2.3.1/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA=
|
||||||
|
github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b h1:C8S2+VttkHFdOOCXJe+YGfa4vHYwlt4Zx+IVXQ97jYg=
|
||||||
|
github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b/go.mod h1:vsD4gTJCa9TptPL8sPkXrLZ+hDuNrZCnj29CQpr4X1E=
|
||||||
|
github.com/jackc/pgtype v0.0.0-20190421001408-4ed0de4755e0/go.mod h1:hdSHsc1V01CGwFsrv11mJRHWJ6aifDLfdV3aVjFF0zg=
|
||||||
|
github.com/jackc/pgtype v0.0.0-20190824184912-ab885b375b90/go.mod h1:KcahbBH1nCMSo2DXpzsoWOAfFkdEtEJpPbVLq8eE+mc=
|
||||||
|
github.com/jackc/pgtype v0.0.0-20190828014616-a8802b16cc59/go.mod h1:MWlu30kVJrUS8lot6TQqcg7mtthZ9T0EoIBFiJcmcyw=
|
||||||
|
github.com/jackc/pgtype v1.8.1-0.20210724151600-32e20a603178/go.mod h1:C516IlIV9NKqfsMCXTdChteoXmwgUceqaLfjg2e3NlM=
|
||||||
|
github.com/jackc/pgtype v1.10.0/go.mod h1:LUMuVrfsFfdKGLw+AFFVv6KtHOFMwRgDDzBt76IqCA4=
|
||||||
|
github.com/jackc/pgtype v1.12.0 h1:Dlq8Qvcch7kiehm8wPGIW0W3KsCCHJnRacKW0UM8n5w=
|
||||||
|
github.com/jackc/pgtype v1.12.0/go.mod h1:LUMuVrfsFfdKGLw+AFFVv6KtHOFMwRgDDzBt76IqCA4=
|
||||||
|
github.com/jackc/pgx/v4 v4.0.0-20190420224344-cc3461e65d96/go.mod h1:mdxmSJJuR08CZQyj1PVQBHy9XOp5p8/SHH6a0psbY9Y=
|
||||||
|
github.com/jackc/pgx/v4 v4.0.0-20190421002000-1b8f0016e912/go.mod h1:no/Y67Jkk/9WuGR0JG/JseM9irFbnEPbuWV2EELPNuM=
|
||||||
|
github.com/jackc/pgx/v4 v4.0.0-pre1.0.20190824185557-6972a5742186/go.mod h1:X+GQnOEnf1dqHGpw7JmHqHc1NxDoalibchSk9/RWuDc=
|
||||||
|
github.com/jackc/pgx/v4 v4.12.1-0.20210724153913-640aa07df17c/go.mod h1:1QD0+tgSXP7iUjYm9C1NxKhny7lq6ee99u/z+IHFcgs=
|
||||||
|
github.com/jackc/pgx/v4 v4.15.0/go.mod h1:D/zyOyXiaM1TmVWnOM18p0xdDtdakRBa0RsVGI3U3bw=
|
||||||
|
github.com/jackc/pgx/v4 v4.17.2 h1:0Ut0rpeKwvIVbMQ1KbMBU4h6wxehBI535LK6Flheh8E=
|
||||||
|
github.com/jackc/pgx/v4 v4.17.2/go.mod h1:lcxIZN44yMIrWI78a5CpucdD14hX0SBDbNRvjDBItsw=
|
||||||
|
github.com/jackc/puddle v0.0.0-20190413234325-e4ced69a3a2b/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk=
|
||||||
|
github.com/jackc/puddle v0.0.0-20190608224051-11cab39313c9/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk=
|
||||||
|
github.com/jackc/puddle v1.1.3/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk=
|
||||||
|
github.com/jackc/puddle v1.2.1/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk=
|
||||||
|
github.com/jackc/puddle v1.3.0/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk=
|
||||||
|
github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=
|
||||||
|
github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=
|
||||||
|
github.com/jinzhu/now v1.1.4 h1:tHnRBy1i5F2Dh8BAFxqFzxKqqvezXrL2OW1TnX+Mlas=
|
||||||
|
github.com/jinzhu/now v1.1.4/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=
|
||||||
|
github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ=
|
||||||
|
github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=
|
||||||
|
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
|
||||||
|
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
|
||||||
|
github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
|
||||||
|
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
|
||||||
|
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
|
||||||
|
github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw=
|
||||||
|
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
|
||||||
|
github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
|
||||||
|
github.com/lib/pq v1.1.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
|
||||||
|
github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
|
||||||
|
github.com/lib/pq v1.10.2/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
|
||||||
|
github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ=
|
||||||
|
github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
|
||||||
|
github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
|
||||||
|
github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
|
||||||
|
github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
|
||||||
|
github.com/mattn/go-sqlite3 v1.14.9/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU=
|
||||||
|
github.com/mattn/go-sqlite3 v1.14.12/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU=
|
||||||
|
github.com/modocache/gover v0.0.0-20171022184752-b58185e213c5/go.mod h1:caMODM3PzxT8aQXRPkAt8xlV/e7d7w8GM5g0fa5F0D8=
|
||||||
|
github.com/pkg/browser v0.0.0-20180916011732-0a3d74bf9ce4/go.mod h1:4OwLy04Bl9Ef3GJJCoec+30X3LQs/0/m4HFRt/2LUSA=
|
||||||
|
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||||
|
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||||
|
github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
|
||||||
|
github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ=
|
||||||
|
github.com/rs/zerolog v1.13.0/go.mod h1:YbFCdg8HfsridGWAh22vktObvhZbQsZXe4/zB0OKkWU=
|
||||||
|
github.com/rs/zerolog v1.15.0/go.mod h1:xYTKnLHcpfU2225ny5qZjxnj9NvkumZYjJHlAThCjNc=
|
||||||
|
github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0=
|
||||||
|
github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4=
|
||||||
|
github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o=
|
||||||
|
github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q=
|
||||||
|
github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
|
||||||
|
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||||
|
github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||||
|
github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE=
|
||||||
|
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
|
||||||
|
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
|
||||||
|
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
|
||||||
|
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
|
||||||
|
github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
|
||||||
|
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
||||||
|
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
||||||
|
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
|
||||||
|
github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q=
|
||||||
|
go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
|
||||||
|
go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
|
||||||
|
go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ=
|
||||||
|
go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ=
|
||||||
|
go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0=
|
||||||
|
go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4=
|
||||||
|
go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU=
|
||||||
|
go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA=
|
||||||
|
go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
|
||||||
|
go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
|
||||||
|
go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM=
|
||||||
|
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
||||||
|
golang.org/x/crypto v0.0.0-20190411191339-88737f569e3a/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE=
|
||||||
|
golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||||
|
golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||||
|
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||||
|
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||||
|
golang.org/x/crypto v0.0.0-20201016220609-9e8e0b390897/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||||
|
golang.org/x/crypto v0.0.0-20201203163018-be400aefbc4c/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I=
|
||||||
|
golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
|
||||||
|
golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
|
||||||
|
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
|
||||||
|
golang.org/x/crypto v0.0.0-20220214200702-86341886e292/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
|
||||||
|
golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa h1:zuSxTR4o9y82ebqCUJYNGJbGPo6sKVl54f/TVDObg1c=
|
||||||
|
golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
|
||||||
|
golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
|
||||||
|
golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=
|
||||||
|
golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
|
||||||
|
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||||
|
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||||
|
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
|
golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
|
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
|
||||||
|
golang.org/x/net v0.0.0-20210610132358-84b48f89b13b/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
||||||
|
golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
||||||
|
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
|
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
|
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
|
golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
|
golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
|
golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
|
||||||
|
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
||||||
|
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||||
|
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
|
||||||
|
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||||
|
golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||||
|
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||||
|
golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk=
|
||||||
|
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
|
||||||
|
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||||
|
golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
|
||||||
|
golang.org/x/tools v0.0.0-20190425163242-31fd60d6bfdc/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
|
||||||
|
golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
|
||||||
|
golang.org/x/tools v0.0.0-20190823170909-c4a336ef6a2f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||||
|
golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||||
|
golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||||
|
golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
|
||||||
|
golang.org/x/xerrors v0.0.0-20190410155217-1f06c39b4373/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||||
|
golang.org/x/xerrors v0.0.0-20190513163551-3ee3066db522/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||||
|
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||||
|
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||||
|
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||||
|
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
|
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
|
gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
|
||||||
|
gopkg.in/inconshreveable/log15.v2 v2.0.0-20180818164646-67afb5ed74ec/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s=
|
||||||
|
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||||
|
gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||||
|
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
|
||||||
|
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||||
|
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||||
|
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||||
|
gorm.io/datatypes v1.0.7 h1:8NhJN4+annFjwV1WufDhFiPjdUvV1lSGUdg1UCjQIWY=
|
||||||
|
gorm.io/datatypes v1.0.7/go.mod h1:l9qkCuy0CdzDEop9HKUdcnC9gHC2sRlaFtHkTzsZRqg=
|
||||||
|
gorm.io/driver/mysql v1.3.2 h1:QJryWiqQ91EvZ0jZL48NOpdlPdMjdip1hQ8bTgo4H7I=
|
||||||
|
gorm.io/driver/mysql v1.3.2/go.mod h1:ChK6AHbHgDCFZyJp0F+BmVGb06PSIoh9uVYKAlRbb2U=
|
||||||
|
gorm.io/driver/postgres v1.3.4/go.mod h1:y0vEuInFKJtijuSGu9e5bs5hzzSzPK+LancpKpvbRBw=
|
||||||
|
gorm.io/driver/postgres v1.4.4 h1:zt1fxJ+C+ajparn0SteEnkoPg0BQ6wOWXEQ99bteAmw=
|
||||||
|
gorm.io/driver/postgres v1.4.4/go.mod h1:whNfh5WhhHs96honoLjBAMwJGYEuA3m1hvgUbNXhPCw=
|
||||||
|
gorm.io/driver/sqlite v1.3.1/go.mod h1:wJx0hJspfycZ6myN38x1O/AqLtNS6c5o9TndewFbELg=
|
||||||
|
gorm.io/driver/sqlserver v1.3.1/go.mod h1:w25Vrx2BG+CJNUu/xKbFhaKlGxT/nzRkhWCCoptX8tQ=
|
||||||
|
gorm.io/gorm v1.23.1/go.mod h1:l2lP/RyAtc1ynaTjFksBde/O8v9oOGIApu2/xRitmZk=
|
||||||
|
gorm.io/gorm v1.23.6/go.mod h1:l2lP/RyAtc1ynaTjFksBde/O8v9oOGIApu2/xRitmZk=
|
||||||
|
gorm.io/gorm v1.23.7 h1:ww+9Mu5WwHKDSOQZFC4ipu/sgpKMr9EtrJ0uwBqNtB0=
|
||||||
|
gorm.io/gorm v1.23.7/go.mod h1:l2lP/RyAtc1ynaTjFksBde/O8v9oOGIApu2/xRitmZk=
|
||||||
|
gorm.io/gorm v1.24.0 h1:j/CoiSm6xpRpmzbFJsQHYj+I8bGYWLXVHeYEyyKlF74=
|
||||||
|
gorm.io/gorm v1.24.0/go.mod h1:DVrVomtaYTbqs7gB/x2uVvqnXzv0nqjB396B8cG4dBA=
|
||||||
|
honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=
|
||||||
11
backend/mapping/mapper.go
Normal file
11
backend/mapping/mapper.go
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
package mapping
|
||||||
|
|
||||||
|
import (
|
||||||
|
api "github.com/moustachioed/dash/backend/dashapi"
|
||||||
|
db "github.com/moustachioed/dash/backend/database/models"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Mapper interface {
|
||||||
|
JournalApiToDb(api.JournalEntry) db.Journal
|
||||||
|
JournalDbToApi(db.Journal) api.JournalEntry
|
||||||
|
}
|
||||||
37
backend/mapping/mapperImpl.go
Normal file
37
backend/mapping/mapperImpl.go
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
package mapping
|
||||||
|
|
||||||
|
import (
|
||||||
|
"log"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"gorm.io/datatypes"
|
||||||
|
|
||||||
|
api "github.com/moustachioed/dash/backend/dashapi"
|
||||||
|
db "github.com/moustachioed/dash/backend/database/models"
|
||||||
|
)
|
||||||
|
|
||||||
|
type MapperImpl struct{}
|
||||||
|
|
||||||
|
func NewMapperImpl() Mapper {
|
||||||
|
return MapperImpl{}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (mapper MapperImpl) JournalApiToDb(apimodel api.JournalEntry) db.Journal {
|
||||||
|
date, err := time.Parse("2006-01-02", apimodel.Date)
|
||||||
|
if err != nil {
|
||||||
|
log.Printf("[ERROR] Could not parse date `%s`", apimodel.Date)
|
||||||
|
}
|
||||||
|
|
||||||
|
dbmodel := db.Journal{
|
||||||
|
Date: datatypes.Date(date),
|
||||||
|
// Thankful: datatypes.JSON([]byte(api.Thankful)),
|
||||||
|
}
|
||||||
|
|
||||||
|
return dbmodel
|
||||||
|
}
|
||||||
|
|
||||||
|
func (mapper MapperImpl) JournalDbToApi(db.Journal) api.JournalEntry {
|
||||||
|
apimodel := api.JournalEntry{}
|
||||||
|
|
||||||
|
return apimodel
|
||||||
|
}
|
||||||
62
backend/service/api_service.go
Normal file
62
backend/service/api_service.go
Normal file
@ -0,0 +1,62 @@
|
|||||||
|
/*
|
||||||
|
* Dash API
|
||||||
|
*
|
||||||
|
* No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
|
||||||
|
*
|
||||||
|
* API version: 0.1
|
||||||
|
* Generated by: OpenAPI Generator (https://openapi-generator.tech)
|
||||||
|
*/
|
||||||
|
|
||||||
|
package service
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"errors"
|
||||||
|
"net/http"
|
||||||
|
|
||||||
|
"github.com/moustachioed/dash/backend/dashapi"
|
||||||
|
"github.com/moustachioed/dash/backend/database"
|
||||||
|
"github.com/moustachioed/dash/backend/mapping"
|
||||||
|
)
|
||||||
|
|
||||||
|
// DefaultApiService is a service that implements the logic for the DefaultApiServicer
|
||||||
|
// This service should implement the business logic for every endpoint for the DefaultApi API.
|
||||||
|
// Include any external packages or services that will be required by this service.
|
||||||
|
type DefaultApiService struct {
|
||||||
|
db database.Database
|
||||||
|
mapper mapping.Mapper
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewDefaultApiService creates a default api service
|
||||||
|
func NewDefaultApiService(db database.Database, mapper mapping.Mapper) dashapi.DefaultApiServicer {
|
||||||
|
return &DefaultApiService{}
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetJournalEntryForDate -
|
||||||
|
func (s *DefaultApiService) GetJournalEntryForDate(ctx context.Context, date string) (dashapi.ImplResponse, error) {
|
||||||
|
// TODO - update GetJournalEntryForDate with the required logic for this service method.
|
||||||
|
// Add api_default_service.go to the .openapi-generator-ignore to avoid overwriting this service implementation when updating open api generation.
|
||||||
|
|
||||||
|
//TODO: Uncomment the next line to return response Response(200, JournalEntry{}) or use other options such as http.Ok ...
|
||||||
|
//return Response(200, JournalEntry{}), nil
|
||||||
|
|
||||||
|
return dashapi.Response(http.StatusNotImplemented, nil), errors.New("GetJournalEntryForDate method not implemented")
|
||||||
|
}
|
||||||
|
|
||||||
|
// WriteJournalEntryForDate -
|
||||||
|
func (s *DefaultApiService) WriteJournalEntryForDate(ctx context.Context, date string, journalEntry dashapi.JournalEntry) (dashapi.ImplResponse, error) {
|
||||||
|
// TODO - update WriteJournalEntryForDate with the required logic for this service method.
|
||||||
|
// Add api_default_service.go to the .openapi-generator-ignore to avoid overwriting this service implementation when updating open api generation.
|
||||||
|
|
||||||
|
//TODO: Uncomment the next line to return response Response(200, {}) or use other options such as http.Ok ...
|
||||||
|
//return Response(200, nil),nil
|
||||||
|
journal := s.mapper.JournalApiToDb(journalEntry)
|
||||||
|
s.db.WriteJournalEntry(journal)
|
||||||
|
// log.Printf(journal.Thankful)
|
||||||
|
|
||||||
|
return dashapi.Response(http.StatusNotImplemented, nil), errors.New("WriteJournalEntryForDate method not implemented")
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *DefaultApiService) DeleteJournalEntryForDate(ctx context.Context, date string) (dashapi.ImplResponse, error) {
|
||||||
|
return dashapi.Response(http.StatusNotImplemented, nil), errors.New("DeleteJournalEntryForDate method not implemented")
|
||||||
|
}
|
||||||
35
docs/diagrams/components.puml
Normal file
35
docs/diagrams/components.puml
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
@startuml
|
||||||
|
package "Service" {
|
||||||
|
component "API Service" as apiservice
|
||||||
|
}
|
||||||
|
|
||||||
|
package "Mapping" {
|
||||||
|
interface "Mapper Interface" as mapperint
|
||||||
|
component "Mapper" as mapper
|
||||||
|
}
|
||||||
|
|
||||||
|
package "DashAPI" {
|
||||||
|
component "API Models" as apimodels
|
||||||
|
}
|
||||||
|
|
||||||
|
package "Database" {
|
||||||
|
interface "Database Interface" as dbint
|
||||||
|
component "Database Implementation" as dbimp
|
||||||
|
component "Database Model" as dbmodel
|
||||||
|
}
|
||||||
|
|
||||||
|
apiservice --> apimodels
|
||||||
|
apiservice --> dbint
|
||||||
|
apiservice --> mapperint
|
||||||
|
|
||||||
|
dbimp .up.> dbint
|
||||||
|
dbimp --> dbmodel
|
||||||
|
|
||||||
|
|
||||||
|
mapper .up.> mapperint
|
||||||
|
mapper --> apimodels
|
||||||
|
mapper --> dbmodel
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@enduml
|
||||||
Reference in New Issue
Block a user