Skip to content

Commit 93eb67c

Browse files
authored
Merge pull request #1 from rtmelsov/develop
init
2 parents a0290ab + a846f52 commit 93eb67c

File tree

35 files changed

+1634
-24
lines changed

35 files changed

+1634
-24
lines changed

.gitignore

Lines changed: 15 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,24 @@
1-
# If you prefer the allow list template instead of the deny list, see community template:
2-
# https://github.com/github/gitignore/blob/main/community/Golang/Go.AllowList.gitignore
3-
#
4-
# Binaries for programs and plugins
1+
# Go
2+
bin/
3+
dist/
4+
build/
55
*.exe
6-
*.exe~
76
*.dll
87
*.so
98
*.dylib
10-
11-
# Test binary, built with `go test -c`
129
*.test
13-
14-
# Code coverage profiles and other test artifacts
15-
*.out
1610
coverage.*
17-
*.coverprofile
18-
profile.cov
19-
20-
# Dependency directories (remove the comment below to include it)
21-
# vendor/
11+
*.out
2212

23-
# Go workspace file
24-
go.work
25-
go.work.sum
13+
# Генерация
14+
gen/
15+
internal/db/sqlc.yml # если приватный
16+
db/migrations/*.sql-journal
2617

27-
# env file
18+
# Локальные конфиги
2819
.env
29-
30-
# Editor/IDE
31-
# .idea/
32-
# .vscode/
20+
*.local.*
21+
/.idea/
22+
/.vscode/
23+
.DS_Store
24+
/var/

Makefile

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
SERVER_PKG ?= ./cmd/server
2+
3+
GRPC_ADDR ?= 127.0.0.1:8080
4+
DB_DSN ?= mem://
5+
6+
.PHONY: run build tidy help
7+
8+
help:
9+
@echo "make run - run server via 'go run'"
10+
@echo "make build -build server binary into ./bin/server"
11+
@echo "env overrides: GRPC_ADDR (default: $(GRPC_ADDR)), DB_DSN (default: $(DB_DSN))"
12+
@echo "example: make run GRPC_ADDR=:9090 DB_DSN='postgres://...@localhost:5432/vault?sslmode=disable"
13+
14+
run:
15+
@echo "===> go run $(SERVER_PKG) (DB_DSN=$(GRPC_ADDR), DB_DSN=$(DB_DSN))"
16+
@GRPC_ADDR=$(GRPC_ADDR) DB_DSN=$(DB_DSN) go run $(SERVER_PKG)
17+
18+
build:
19+
@mkdir -p bin
20+
@echo "===> go build ./cmd/server -> ./bin/server"
21+
@go build -o bin/server $(SERVER_PKG)
22+
23+
tidy:
24+
@go mod tidy

README.md

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +0,0 @@
1-
# adv-keeper

api/buf.gen.yaml

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
version: v2
2+
plugins:
3+
- local: protoc-gen-go
4+
out: ../gen/go
5+
opt: paths=source_relative
6+
- local: protoc-gen-go-grpc
7+
out: ../gen/go
8+
opt:
9+
- paths=source_relative
10+
- require_unimplemented_servers=false
11+

api/proto/common/v1/common.proto

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
syntax = "proto3";
2+
package common.v1;
3+
option go_package = "github.com/rtmelsov/adv-keeper/gen/go/common/v1;commonv1";
4+
5+
message DeviceInfo {
6+
string device_id = 1; // клиентский идентификатор устройства
7+
}
8+
9+
service AuthService {
10+
rpc Register(RegisterRequest) returns (RegisterResponse);
11+
rpc Login(LoginRequest) returns (LoginResponse);
12+
}
13+
14+
message RegisterRequest {
15+
string email = 1;
16+
string password = 2;
17+
DeviceInfo device = 3;
18+
}
19+
20+
message RegisterResponse {
21+
string user_id = 1;
22+
string device_id = 2; // вернём то, что прислал клиент
23+
string email = 3;
24+
}
25+
26+
message LoginRequest {
27+
string email = 1;
28+
string password = 2;
29+
DeviceInfo device = 3;
30+
}
31+
32+
message LoginResponse {
33+
string user_id = 1;
34+
string device_id = 2; // вернём то, что прислал клиент
35+
string email = 3;
36+
}

api/proto/file/v1/file.proto

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
syntax = "proto3";
2+
3+
package file.v1;
4+
option go_package = "github.com/rtmelsov/adv-keeper/gen/go/file/v1;filev1";
5+
6+
service FileService {
7+
// Клиент шлёт поток кусков, сервер в конце отвечает сводкой
8+
rpc Upload(stream UploadRequest) returns (UploadResponse);
9+
}
10+
11+
message UploadRequest {
12+
oneof payload {
13+
FileInfo info = 1; // ПЕРВОЕ сообщение — мета-инфа
14+
FileChunk chunk = 2; // Далее — куски файла
15+
}
16+
}
17+
18+
message FileInfo {
19+
string filename = 1; // исходное имя (без путей)
20+
int64 size = 2; // опционально: общий размер
21+
}
22+
23+
message FileChunk {
24+
bytes content = 1; // данные куска (< 4 MiB — лимит gRPC на сообщение)
25+
int64 offset = 2; // сдвиг от начала файла (полезно для резюмации)
26+
}
27+
28+
message UploadResponse {
29+
string stored_as = 1; // путь/имя сохранённого файла на сервере
30+
int64 bytes_received = 2; // сколько байт приняли
31+
string sha256 = 3; // контрольная сумма принятого
32+
}

cmd/server/main.go

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
package main
2+
3+
import (
4+
"database/sql"
5+
"fmt"
6+
"log"
7+
"net"
8+
9+
commonv1 "github.com/rtmelsov/adv-keeper/gen/go/proto/common/v1"
10+
filev1 "github.com/rtmelsov/adv-keeper/gen/go/proto/file/v1"
11+
"github.com/rtmelsov/adv-keeper/internal/auth"
12+
db "github.com/rtmelsov/adv-keeper/internal/db"
13+
"github.com/rtmelsov/adv-keeper/internal/file"
14+
15+
_ "github.com/jackc/pgx/v5/stdlib"
16+
"google.golang.org/grpc"
17+
)
18+
19+
func main() {
20+
// получаем урл бд
21+
dsn := "postgres://postgres@localhost:5432/dbname?sslmode=disable"
22+
23+
fmt.Println("dsn", dsn)
24+
25+
lis, err := net.Listen("tcp", "127.0.0.1:8080")
26+
if err != nil {
27+
log.Fatal(err)
28+
}
29+
30+
// Подключение к Postgres
31+
dbx, err := sql.Open("pgx", dsn)
32+
if err != nil {
33+
log.Fatal(err)
34+
}
35+
defer dbx.Close()
36+
37+
q := db.New(dbx)
38+
s := grpc.NewServer()
39+
commonv1.RegisterAuthServiceServer(s, auth.New(q))
40+
filev1.RegisterFileServiceServer(s, file.New(q))
41+
42+
log.Println("gRPC listening on", lis.Addr())
43+
if err := s.Serve(lis); err != nil {
44+
log.Fatal(err)
45+
}
46+
}

cmd/tui/main.go

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
package main
2+
3+
import (
4+
"flag"
5+
"fmt"
6+
"os"
7+
"sort"
8+
9+
tea "github.com/charmbracelet/bubbletea"
10+
11+
"github.com/rtmelsov/adv-keeper/internal/tui"
12+
)
13+
14+
var (
15+
version = "dev"
16+
buildDate = "-"
17+
)
18+
19+
func main() {
20+
21+
showVersion := flag.Bool("version", false, "print version and exit")
22+
flag.Parse()
23+
if *showVersion {
24+
fmt.Printf("adv-keeper %s (built %s)\n", version, buildDate)
25+
return
26+
}
27+
p := tea.NewProgram(tui.InitialModel())
28+
final, err := p.Run()
29+
if err != nil {
30+
fmt.Printf("Alas, there's been an error: %v\n", err)
31+
os.Exit(1)
32+
}
33+
34+
// После выхода выведем список выбранных покупок
35+
m := final.(tui.TuiModel)
36+
if len(m.Selected) == 0 {
37+
fmt.Println("Ничего не выбрано.")
38+
return
39+
}
40+
41+
// Соберём в стабильном порядке
42+
idxs := make([]int, 0, len(m.Selected))
43+
for i := range m.Selected {
44+
idxs = append(idxs, i)
45+
}
46+
sort.Ints(idxs)
47+
48+
fmt.Println("Вы выбрали:")
49+
for _, i := range idxs {
50+
fmt.Printf(" • %s\n", m.Choices[i])
51+
}
52+
}

db/queries/auth.sql

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
-- name: RegisterWithDevice :one
2+
WITH u AS (
3+
INSERT INTO users (email, pwd_phc, e2ee_pub)
4+
VALUES ($1, $2, $3)
5+
RETURNING id
6+
),
7+
d AS (
8+
INSERT INTO devices (user_id, device_id)
9+
SELECT u.id, $4
10+
FROM u
11+
RETURNING device_id
12+
)
13+
SELECT
14+
(SELECT id FROM u) AS user_id,
15+
(SELECT device_id FROM d) AS device_id;
16+

debug.log

Whitespace-only changes.

0 commit comments

Comments
 (0)