major step to connectrpc

This commit is contained in:
Tigor Hutasuhut 2024-08-04 20:18:54 +07:00
parent 15002b4e18
commit fb44efec56
17 changed files with 219 additions and 32 deletions

View file

@ -15,9 +15,11 @@ export REDMAGE_RUNTIME_VERSION=$(shell echo "$${REDMAGE_RUNTIME_VERSION:-unknown
export GCO_ENABLED=0
generate:
rm -rf ./gen/grpc
rm -rf ./gen
cd proto
buf generate
cd ..
goverter gen -g 'output:file ../gen/converter/generated.go' -g 'output:package github.com/tigorlazuardi/redmage/gen/converter' ./converts
start: dev-dependencies web-dependencies migrate-up
REDMAGE_RUNTIME_VERSION=$(shell git describe --tags --abbrev=0) air

23
converts/converts.go Normal file
View file

@ -0,0 +1,23 @@
package main
import (
device "github.com/tigorlazuardi/redmage/gen/proto/device/v1"
"github.com/tigorlazuardi/redmage/models"
)
// goverter:converter
// goverter:extend BoolToInt32
type Converter interface {
// goverter:map Nsfw NSFW
// goverter:ignore CreatedAt
// goverter:ignore UpdatedAt
// goverter:ignore R
ConvertCreateDeviceRequestToModelsDevice(source device.CreateDeviceRequest) *models.Device
}
func BoolToInt32(input bool) int32 {
if input {
return 1
}
return 0
}

View file

@ -9,6 +9,29 @@
system = "x86_64-linux";
templPkg = templ.packages.${system}.templ;
pkgs = inputs.nixpkgs.legacyPackages.${system};
goverter = pkgs.buildGoModule rec {
name = "goverter";
version = "1.5.0";
src = pkgs.fetchFromGitHub {
owner = "jmattheis";
repo = "goverter";
rev = "v${version}";
sha256 = "sha256-J0PS4ZxGtOa+0QOOSjfg0WeVYGyf757WuTnpQTWIV1w=";
};
nativeBuildInputs = [ pkgs.go ];
buildPhase = ''
runHook preBuild
go build -o goverter ./cmd/goverter
runHook postBuild
'';
installPhase = ''
runHook preInstall
mkdir -p $out/bin
cp goverter $out/bin
runHook postInstall
'';
vendorHash = "sha256-uQ1qKZLRwsgXKqSAERSqf+1cYKp6MTeVbfGs+qcdakE=";
};
in
{
devShell.${system} = pkgs.mkShell {
@ -26,6 +49,8 @@
protoc-gen-go
protoc-gen-go-grpc
protoc-gen-connect-go
protoc-gen-validate
goverter
];
};
};

8
go.mod
View file

@ -3,12 +3,15 @@ module github.com/tigorlazuardi/redmage
go 1.22.1
require (
buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.34.2-20240717164558-a6c49f84cc0f.2
connectrpc.com/connect v1.16.2
github.com/ThreeDotsLabs/watermill v1.3.5
github.com/ThreeDotsLabs/watermill-bolt v1.1.0
github.com/a-h/templ v0.2.663
github.com/aarondl/opt v0.0.0-20240108180805-338d04d857dc
github.com/adrg/xdg v0.4.0
github.com/alecthomas/units v0.0.0-20231202071711-9a357b53e9c9
github.com/bufbuild/protovalidate-go v0.6.3
github.com/fatih/color v1.16.0
github.com/go-chi/chi/v5 v5.0.12
github.com/gosimple/slug v1.14.0
@ -35,12 +38,15 @@ require (
github.com/tidwall/pretty v1.2.1
go.etcd.io/bbolt v1.3.9
golang.org/x/net v0.24.0
google.golang.org/protobuf v1.34.2
)
require (
github.com/aarondl/json v0.0.0-20221020222930-8b0db17ef1bf // indirect
github.com/antlr4-go/antlr/v4 v4.13.0 // indirect
github.com/boreq/errors v0.1.0 // indirect
github.com/cenkalti/backoff/v4 v4.3.0 // indirect
github.com/google/cel-go v0.20.1 // indirect
github.com/google/uuid v1.6.0 // indirect
github.com/gosimple/unidecode v1.0.1 // indirect
github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.1 // indirect
@ -50,6 +56,7 @@ require (
github.com/qdm12/reprint v0.0.0-20200326205758-722754a53494 // indirect
github.com/samber/lo v1.39.0 // indirect
github.com/stephenafamo/scan v0.5.0 // indirect
github.com/stoewer/go-strcase v1.3.0 // indirect
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.26.0 // indirect
go.opentelemetry.io/proto/otlp v1.2.0 // indirect
golang.org/x/image v0.15.0 // indirect
@ -57,7 +64,6 @@ require (
google.golang.org/genproto/googleapis/api v0.0.0-20240415180920-8c6c420018be // indirect
google.golang.org/genproto/googleapis/rpc v0.0.0-20240415180920-8c6c420018be // indirect
google.golang.org/grpc v1.63.2 // indirect
google.golang.org/protobuf v1.33.0 // indirect
)
require (

18
go.sum
View file

@ -1,3 +1,5 @@
buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.34.2-20240717164558-a6c49f84cc0f.2 h1:SZRVx928rbYZ6hEKUIN+vtGDkl7uotABRWGY4OAg5gM=
buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.34.2-20240717164558-a6c49f84cc0f.2/go.mod h1:ylS4c28ACSI59oJrOdW4pHS4n0Hw4TgSPHn8rpHl4Yw=
cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU=
@ -31,6 +33,8 @@ cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0Zeo
cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk=
cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs=
cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0=
connectrpc.com/connect v1.16.2 h1:ybd6y+ls7GOlb7Bh5C8+ghA6SvCBajHwxssO2CGFjqE=
connectrpc.com/connect v1.16.2/go.mod h1:n2kgwskMHXC+lVqb18wngEpF95ldBHXjZYJussz5FRc=
dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
@ -64,11 +68,15 @@ github.com/alecthomas/units v0.0.0-20231202071711-9a357b53e9c9 h1:ez/4by2iGztzR4
github.com/alecthomas/units v0.0.0-20231202071711-9a357b53e9c9/go.mod h1:OMCwj8VM1Kc9e19TLln2VL61YJF0x1XFtfdL4JdbSyE=
github.com/antlr/antlr4/runtime/Go/antlr/v4 v4.0.0-20230321174746-8dcc6526cfb1 h1:X8MJ0fnN5FPdcGF5Ij2/OW+HgiJrRg3AfHAx1PJtIzM=
github.com/antlr/antlr4/runtime/Go/antlr/v4 v4.0.0-20230321174746-8dcc6526cfb1/go.mod h1:pSwJ0fSY5KhvocuWSx4fz3BA8OrA1bQn+K1Eli3BRwM=
github.com/antlr4-go/antlr/v4 v4.13.0 h1:lxCg3LAv+EUK6t1i0y1V6/SLeUi0eKEKdhQAlS8TVTI=
github.com/antlr4-go/antlr/v4 v4.13.0/go.mod h1:pfChB/xh/Unjila75QW7+VU4TSnWnnk9UTnmpPaOR2g=
github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
github.com/boreq/errors v0.1.0 h1:aJIXv9JnyR5KtxFpQ8/AiblH3nfYmr1e1yoTze/5A1k=
github.com/boreq/errors v0.1.0/go.mod h1:B3dsXzhYvfgUXp7ViU/moPYM4PojgQ9MiQ21uvY6qqQ=
github.com/bufbuild/protovalidate-go v0.6.3 h1:wxQyzW035zM16Binbaz/nWAzS12dRIXhZdSUWRY7Fv0=
github.com/bufbuild/protovalidate-go v0.6.3/go.mod h1:J4PtwP9Z2YAGgB0+o+tTWEDtLtXvz/gfhFZD8pbzM/U=
github.com/cenkalti/backoff/v3 v3.2.2/go.mod h1:cIeZDE3IrqwwJl6VUwCN6trj1oXrTS4rc0ij+ULvLYs=
github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8=
github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE=
@ -94,6 +102,8 @@ github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymF
github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=
github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
github.com/envoyproxy/protoc-gen-validate v1.0.4 h1:gVPz/FMfvh57HdSJQyvBtF00j8JU4zdyUgIUNhlgg0A=
github.com/envoyproxy/protoc-gen-validate v1.0.4/go.mod h1:qys6tmnRsYrQqIhm2bvKZH4Blx/1gTIZ2UKVY1M+Yew=
github.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM=
github.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE=
github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg=
@ -154,6 +164,8 @@ github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaS
github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
github.com/google/cel-go v0.20.1 h1:nDx9r8S3L4pE61eDdt8igGj8rf5kjYR3ILxWIpWNi84=
github.com/google/cel-go v0.20.1/go.mod h1:kWcIzTsPX0zmQ+H3TirHstLLf9ep5QTsZBN9u4dOYLg=
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
@ -358,6 +370,8 @@ github.com/stephenafamo/scan v0.5.0 h1:1zDlY1PFnLB8MErWVil/vywAoZxGIdQS/y8nDiGU+
github.com/stephenafamo/scan v0.5.0/go.mod h1:FhIUJ8pLNyex36xGFiazDJJ5Xry0UkAi+RkWRrEcRMg=
github.com/stephenafamo/sqlparser v0.0.0-20230326220333-c2adaf4c30e8 h1:HR6pFkWHsRRVm+VUSjltpaI56XFl2hdwxdGw7hHIPDk=
github.com/stephenafamo/sqlparser v0.0.0-20230326220333-c2adaf4c30e8/go.mod h1:hOw+0TLAWETjE8UJG+q5bdj7EArbIombNBnEUoF7XwM=
github.com/stoewer/go-strcase v1.3.0 h1:g0eASXYtp+yvN9fK8sH94oCIk0fau9uV1/ZdJ0AVEzs=
github.com/stoewer/go-strcase v1.3.0/go.mod h1:fAH5hQ5pehh+j3nZfvwdk2RgEgQjAoM8wodgtPmh1xo=
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.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
@ -717,8 +731,8 @@ google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp0
google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI=
google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=
google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg=
google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw=
gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
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=

View file

@ -11,6 +11,8 @@ import (
"github.com/joho/godotenv"
"github.com/tigorlazuardi/redmage/cli"
"github.com/tigorlazuardi/redmage/db"
_ "github.com/tigorlazuardi/redmage/tools"
)
//go:embed db/migrations/*.sql

View file

@ -1,8 +1,8 @@
version: v2
plugins:
- local: protoc-gen-go
out: ../gen/grpc
out: ../gen/proto
opt: paths=source_relative
- local: protoc-gen-connect-go
out: ../gen/grpc
out: ../gen/proto
opt: paths=source_relative

6
proto/buf.lock Normal file
View file

@ -0,0 +1,6 @@
# Generated by buf. DO NOT EDIT.
version: v2
deps:
- name: buf.build/bufbuild/protovalidate
commit: a6c49f84cc0f4e038680d390392e2ab0
digest: b5:e968392e88ff7915adcbd1635d670b45bff8836ec2415d81fc559ca5470a695dbdc30030bad8bc5764647c731079e9e7bba0023ea25c4e4a1672a7d2561d4a19

View file

@ -1 +1,3 @@
version: v2
deps:
- buf.build/bufbuild/protovalidate

View file

@ -0,0 +1,88 @@
syntax = "proto3";
package device.v1;
import "buf/validate/validate.proto";
option go_package = "github.com/tigorlazuardi/redmage/gen/proto/device/v1";
service DeviceService {
// CreateDevice creates a new device.
rpc CreateDevice(CreateDeviceRequest) returns (CreateDeviceResponse) {}
}
message CreateDeviceRequest {
// The `slug` is a unique identifier for the device, used to identify the device within the system.
// Each `slug` must be unique across all devices.
string slug = 1 [(buf.validate.field).string.min_len = 1];
// `enable` is a flag to set if a device is enabled upon creation. Default false.
bool enable = 2;
// The name of the device. This is used for display purposes.
string name = 3;
// The display x resolution of the device.
double resolution_x = 4;
// The display y resolution of the device.
double resolution_y = 5;
// aspect_ratio_tolerance is a tolerance for aspect ratio images to be accepted.
//
// The bigger the aspect_ratio_tolerance, the more images will be fetched, but it also means more likely
// for images that will look stretched if you set the device wallpaper view as stretched or
// will overfill if you set the device wallpaper view as fill.
//
// if a device has resolution_x = 1920, resolution_y = 1080, it has an aspect ratio of 1.777~ (1920 divided by 1080).
//
// an aspect_ratio_tolerance of 0.2 means that the device will accept images with aspect ratio between 1.577~ and 1.977~.
//
// THIS IS NOT A FILTER FOR IMAGE SIZE. This filter will take images that are far bigger or smaller than the device resolution
// as long as the aspect ratio is within the tolerance. Like example above, if an image has resolution of 3840x2160, it will be
// accepted by the device even though it is 2 times bigger than the device resolution.
//
// If you want to filter image size, use min_x, min_y, max_x, max_y fields.
//
double aspect_ratio_tolerance = 6;
// The minimum x resolution required for an image to be accepted by the device.
//
// A value of 0 indicates no minimum x resolution.
//
// The default value is 0.
int32 min_x = 7;
// The minimum y resolution required for an image to be accepted by the device.
//
// A value of 0 indicates no minimum y resolution.
//
// The default value is 0.
int32 min_y = 8;
// The maximum x resolution allowed for an image to be accepted by the device.
//
// A value of 0 indicates no maximum x resolution.
//
// The default value is 0.
int32 max_x = 9;
// The maximum y resolution allowed for an image to be accepted by the device.
//
// A value of 0 indicates no maximum y resolution.
//
// The default value is 0.
int32 max_y = 10;
// The `nsfw` parameter allows the device to accept NSFW (Not Safe For Work) images when set to true.
bool nsfw = 11;
// `windows_wallpaper_mode` when set to true, downloaded images will be put on single folder location
// instead of inside folders separated by subreddit names.
bool windows_wallpaper_mode = 12;
}
message CreateDeviceResponse {
// `slug` is the slug of the created device.
string slug = 1;
}

View file

@ -1,25 +0,0 @@
syntax = "proto3";
package redmage;
// option go_package = "google.golang.org/grpc/examples/helloworld/helloworld";
option go_package = "github.com/tigorlazuardi/redmage/gen/grpc/redmage";
option java_multiple_files = true;
option java_outer_classname = "HelloWorldProto";
option java_package = "io.grpc.examples.helloworld";
// The greeting service definition.
service Greeter {
// Sends a greeting
rpc SayHello(HelloRequest) returns (HelloReply) {}
}
// The request message containing the user's name.
message HelloRequest {
string name = 1;
}
// The response message containing the greetings
message HelloReply {
string message = 1;
}

3
server/grpc/grpc.go Normal file
View file

@ -0,0 +1,3 @@
package grpc
type Server struct{}

View file

@ -0,0 +1,25 @@
package handlers
import (
"context"
"connectrpc.com/connect"
"github.com/tigorlazuardi/redmage/api"
device "github.com/tigorlazuardi/redmage/gen/proto/device/v1"
deviceConnect "github.com/tigorlazuardi/redmage/gen/proto/device/v1/v1connect"
)
var _ deviceConnect.DeviceServiceHandler = (*Device)(nil)
type Device struct {
deviceConnect.UnimplementedDeviceServiceHandler
API *api.API
}
func (de *Device) CreateDevice(ctx context.Context, req *connect.Request[device.CreateDeviceRequest]) (*connect.Response[device.CreateDeviceResponse], error) {
ctx, span := tracer.Start(ctx, "Device.CreateDevice")
defer span.End()
panic("not implemented") // TODO: Implement
}

View file

@ -0,0 +1,5 @@
package handlers
import "go.opentelemetry.io/otel"
var tracer = otel.Tracer("handlers")

5
tools/connectrpc.go Normal file
View file

@ -0,0 +1,5 @@
package tools
import (
_ "connectrpc.com/connect"
)

View file

@ -1 +0,0 @@
package tools

7
tools/protobuf.go Normal file
View file

@ -0,0 +1,7 @@
package tools
import (
_ "github.com/bufbuild/protovalidate-go"
_ "google.golang.org/protobuf/reflect/protoreflect"
_ "google.golang.org/protobuf/runtime/protoimpl"
)