style: license headers + gofmt

This commit is contained in:
2024-03-27 11:12:43 +00:00
parent e9a1653c4e
commit 4d9a7a4856
109 changed files with 2059 additions and 530 deletions

View File

@@ -1,3 +1,17 @@
// Copyright 2023 Declan Teevan
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
syntax = "proto3";
package panels.auth.v1;

View File

@@ -1,3 +1,17 @@
// Copyright 2023 Declan Teevan
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
syntax = "proto3";
package panels.comment.v1;
@@ -6,59 +20,59 @@ import "google/protobuf/empty.proto";
import "google/protobuf/timestamp.proto";
service CommentService {
rpc CreateComment(CreateCommentRequest) returns (Comment) {}
rpc UpdateComment(UpdateCommentRequest) returns (Comment) {}
rpc DeleteComment(DeleteCommentRequest) returns (google.protobuf.Empty) {}
rpc CreateComment(CreateCommentRequest) returns (Comment) {}
rpc UpdateComment(UpdateCommentRequest) returns (Comment) {}
rpc DeleteComment(DeleteCommentRequest) returns (google.protobuf.Empty) {}
rpc GetComment(GetCommentRequest) returns (Comment) {}
rpc GetPostComments(GetPostCommentsRequest) returns (PostComments) {}
rpc GetComment(GetCommentRequest) returns (Comment) {}
rpc GetPostComments(GetPostCommentsRequest) returns (PostComments) {}
}
message Comment {
string id = 1;
string id = 1;
string post_id = 2; // External Ref: Post Id
string author_id = 3; // External Ref: User Id
string post_id = 2; // External Ref: Post Id
string author_id = 3; // External Ref: User Id
string message = 4;
string message = 4;
google.protobuf.Timestamp created_at = 5;
google.protobuf.Timestamp updated_at = 6;
google.protobuf.Timestamp created_at = 5;
google.protobuf.Timestamp updated_at = 6;
}
message CommentMutable {
string message = 1;
string message = 1;
}
message CreateCommentRequest {
string post_id = 1; // External Ref: Post Id
string author_id = 2; // External Ref: User Id
CommentMutable data = 3;
string post_id = 1; // External Ref: Post Id
string author_id = 2; // External Ref: User Id
CommentMutable data = 3;
}
message UpdateCommentRequest {
string id = 1;
CommentMutable data = 2;
string id = 1;
CommentMutable data = 2;
}
message DeleteCommentRequest {
string id = 1;
string id = 1;
}
message GetCommentRequest {
string id = 1;
string id = 1;
}
message GetPostCommentsRequest {
string post_id = 1;
string post_id = 1;
}
message PostComments {
repeated Comment comments = 1;
repeated Comment comments = 1;
}
// Kafka Event Schema
message CommentEvent {
string type = 1;
Comment data = 2;
string type = 1;
Comment data = 2;
}

View File

@@ -1,3 +1,17 @@
// Copyright 2023 Declan Teevan
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
syntax = "proto3";
package panels.panel.v1;
@@ -6,64 +20,64 @@ import "google/protobuf/empty.proto";
import "google/protobuf/timestamp.proto";
service PanelService {
rpc CreatePanel(CreatePanelRequest) returns (Panel) {}
rpc CreatePanel(CreatePanelRequest) returns (Panel) {}
rpc GetPanel(GetPanelByIdRequest) returns (Panel) {}
rpc GetPanelByName(GetPanelByNameRequest) returns (Panel) {}
rpc GetPanel(GetPanelByIdRequest) returns (Panel) {}
rpc GetPanelByName(GetPanelByNameRequest) returns (Panel) {}
rpc UpdatePanel(UpdatePanelByIdRequest) returns (Panel) {}
rpc UpdatePanelByName(UpdatePanelByNameRequest) returns (Panel) {}
rpc UpdatePanel(UpdatePanelByIdRequest) returns (Panel) {}
rpc UpdatePanelByName(UpdatePanelByNameRequest) returns (Panel) {}
rpc DeletePanel(DeletePanelByIdRequest) returns (google.protobuf.Empty) {}
rpc DeletePanelByName(DeletePanelByNameRequest) returns (google.protobuf.Empty) {}
rpc DeletePanel(DeletePanelByIdRequest) returns (google.protobuf.Empty) {}
rpc DeletePanelByName(DeletePanelByNameRequest) returns (google.protobuf.Empty) {}
}
message Panel {
string id = 1;
string name = 2;
string description = 3;
string id = 1;
string name = 2;
string description = 3;
google.protobuf.Timestamp created_at = 4;
google.protobuf.Timestamp updated_at = 5;
google.protobuf.Timestamp created_at = 4;
google.protobuf.Timestamp updated_at = 5;
}
message PanelMutable {
optional string name = 1;
optional string description = 2;
optional string name = 1;
optional string description = 2;
}
message CreatePanelRequest {
PanelMutable data = 1;
PanelMutable data = 1;
}
message GetPanelByIdRequest {
string id = 1;
string id = 1;
}
message GetPanelByNameRequest {
string name = 1;
string name = 1;
}
message UpdatePanelByIdRequest {
string id = 1;
PanelMutable data = 2;
string id = 1;
PanelMutable data = 2;
}
message UpdatePanelByNameRequest {
string name = 1;
PanelMutable data = 2;
string name = 1;
PanelMutable data = 2;
}
message DeletePanelByIdRequest {
string id = 1;
string id = 1;
}
message DeletePanelByNameRequest {
string name = 1;
string name = 1;
}
// Kafka Event Schema
message PanelEvent {
string type = 1;
Panel data = 2;
string type = 1;
Panel data = 2;
}

View File

@@ -1,3 +1,17 @@
// Copyright 2023 Declan Teevan
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
syntax = "proto3";
package panels.post.v1;
@@ -6,88 +20,86 @@ import "google/protobuf/empty.proto";
import "google/protobuf/timestamp.proto";
service PostService {
rpc CreatePost(CreatePostRequest) returns (Post) {}
rpc CreatePost(CreatePostRequest) returns (Post) {}
rpc GetPost(GetPostRequest) returns (Post) {}
rpc GetPanelPost(GetPanelPostRequest) returns (Post) {}
rpc GetPost(GetPostRequest) returns (Post) {}
rpc GetPanelPost(GetPanelPostRequest) returns (Post) {}
rpc UpdatePost(UpdatePostRequest) returns (Post) {}
rpc UpdatePost(UpdatePostRequest) returns (Post) {}
rpc DeletePost(DeletePostRequest) returns (google.protobuf.Empty) {}
rpc DeletePost(DeletePostRequest) returns (google.protobuf.Empty) {}
rpc GetFeedPosts(GetFeedPostsRequest) returns (FeedPosts) {}
rpc GetUserPosts(GetUserPostsRequest) returns (UserPosts) {}
rpc GetPanelPosts(GetPanelPostsRequest) returns (PanelPosts) {}
rpc GetFeedPosts(GetFeedPostsRequest) returns (FeedPosts) {}
rpc GetUserPosts(GetUserPostsRequest) returns (UserPosts) {}
rpc GetPanelPosts(GetPanelPostsRequest) returns (PanelPosts) {}
}
message Post {
string id = 1;
string id = 1;
string panel_id = 2; // External Ref: Panel Id
string author_id = 3; // External Ref: User Id
string panel_id = 2; // External Ref: Panel Id
string author_id = 3; // External Ref: User Id
string title = 4;
string content = 5;
string title = 4;
string content = 5;
google.protobuf.Timestamp created_at = 6;
google.protobuf.Timestamp updated_at = 7;
google.protobuf.Timestamp created_at = 6;
google.protobuf.Timestamp updated_at = 7;
}
message PostMutable {
optional string title = 1;
optional string content = 2;
optional string title = 1;
optional string content = 2;
}
message CreatePostRequest {
string panel_id = 1; // External Ref: Panel Id
string user_id = 2; // External Ref: User Id
PostMutable data = 3;
string panel_id = 1; // External Ref: Panel Id
string user_id = 2; // External Ref: User Id
PostMutable data = 3;
}
message GetPostRequest {
string id = 1;
string id = 1;
}
message GetPanelPostRequest {
string panel_id = 1; // External Ref: Panel Id
string id = 2;
string panel_id = 1; // External Ref: Panel Id
string id = 2;
}
message UpdatePostRequest {
string id = 1;
PostMutable data = 2;
string id = 1;
PostMutable data = 2;
}
message DeletePostRequest {
string id = 1;
string id = 1;
}
message GetFeedPostsRequest {
}
message GetFeedPostsRequest {}
message FeedPosts {
repeated Post posts = 1;
repeated Post posts = 1;
}
message GetUserPostsRequest {
string user_id = 1; // External Ref: User Id
string user_id = 1; // External Ref: User Id
}
message UserPosts {
repeated Post posts = 1;
repeated Post posts = 1;
}
message GetPanelPostsRequest {
string panel_id = 1; // External Ref: Panel Id
string panel_id = 1; // External Ref: Panel Id
}
message PanelPosts {
repeated Post posts = 1;
repeated Post posts = 1;
}
// Kafka Event Schema
message PostEvent {
string type = 1;
Post data = 2;
string type = 1;
Post data = 2;
}

View File

@@ -1,3 +1,17 @@
// Copyright 2023 Declan Teevan
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
syntax = "proto3";
package panels.user.v1;
@@ -6,63 +20,63 @@ import "google/protobuf/empty.proto";
import "google/protobuf/timestamp.proto";
service UserService {
rpc CreateUser(CreateUserRequest) returns (User) {}
rpc CreateUser(CreateUserRequest) returns (User) {}
rpc GetUser(GetUserByIdRequest) returns (User) {}
rpc GetUserByName(GetUserByNameRequest) returns (User) {}
rpc GetUser(GetUserByIdRequest) returns (User) {}
rpc GetUserByName(GetUserByNameRequest) returns (User) {}
rpc UpdateUser(UpdateUserByIdRequest) returns (User) {}
rpc UpdateUserByName(UpdateUserByNameRequest) returns (User) {}
rpc UpdateUser(UpdateUserByIdRequest) returns (User) {}
rpc UpdateUserByName(UpdateUserByNameRequest) returns (User) {}
rpc DeleteUser(DeleteUserByIdRequest) returns (google.protobuf.Empty) {}
rpc DeleteUserByName(DeleteUserByNameRequest) returns (google.protobuf.Empty) {}
rpc DeleteUser(DeleteUserByIdRequest) returns (google.protobuf.Empty) {}
rpc DeleteUserByName(DeleteUserByNameRequest) returns (google.protobuf.Empty) {}
}
message User {
string id = 1;
string username = 2;
bool is_admin = 3;
string id = 1;
string username = 2;
bool is_admin = 3;
google.protobuf.Timestamp created_at = 4;
google.protobuf.Timestamp updated_at = 5;
google.protobuf.Timestamp created_at = 4;
google.protobuf.Timestamp updated_at = 5;
}
message UserMutable {
optional string username = 1;
optional string username = 1;
}
message CreateUserRequest {
UserMutable data = 1;
UserMutable data = 1;
}
message GetUserByIdRequest {
string id = 1;
string id = 1;
}
message GetUserByNameRequest {
string username = 1;
string username = 1;
}
message UpdateUserByIdRequest {
string id = 1;
UserMutable data = 2;
string id = 1;
UserMutable data = 2;
}
message UpdateUserByNameRequest {
string username = 1;
UserMutable data = 2;
string username = 1;
UserMutable data = 2;
}
message DeleteUserByIdRequest {
string id = 1;
string id = 1;
}
message DeleteUserByNameRequest {
string username = 1;
string username = 1;
}
// Kafka Event Schema
message UserEvent {
string type = 1;
User data = 2;
string type = 1;
User data = 2;
}

View File

@@ -1,3 +1,17 @@
# Copyright 2023 Declan Teevan
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import logging
from typing import Type

View File

@@ -1,3 +1,17 @@
# Copyright 2023 Declan Teevan
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
from typing import Type
from auth_service.models.config import Config

View File

@@ -1,3 +1,17 @@
# Copyright 2023 Declan Teevan
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import logging
from auth_service.models.proto import user_pb2

View File

@@ -1,3 +1,17 @@
# Copyright 2023 Declan Teevan
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import asyncio
import logging
from sys import stdout

View File

@@ -1,3 +1,17 @@
# Copyright 2023 Declan Teevan
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import base64
from typing import Any, List

View File

@@ -1,3 +1,17 @@
# Copyright 2023 Declan Teevan
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
from enum import Enum, auto
from grpc import RpcContext, StatusCode

View File

@@ -1,3 +1,17 @@
# Copyright 2023 Declan Teevan
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
from time import time
from typing import Optional
from datetime import timedelta

View File

@@ -1,3 +1,17 @@
# Copyright 2023 Declan Teevan
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
from typing import Optional
from databases import Database

View File

@@ -1,3 +1,17 @@
# Copyright 2023 Declan Teevan
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import logging
from databases import Database

View File

@@ -1,3 +1,17 @@
# Copyright 2023 Declan Teevan
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import logging
import traceback
from typing import Type

View File

@@ -1,3 +1,17 @@
# Copyright 2023 Declan Teevan
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import logging
from typing import Type

View File

@@ -1,3 +1,17 @@
# Copyright 2023 Declan Teevan
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import hmac
import hashlib
from typing import Type

View File

@@ -5,7 +5,7 @@ description = "Panels - Auth Service"
license = "Apache-2.0"
readme = "README.md"
repository = "https://github.com/hexolan/panels"
authors = ["Declan <declan@hexolan.dev>"]
authors = ["Declan Teevan <dt@hexolan.com>"]
[tool.poetry.dependencies]
python = "^3.9"

View File

@@ -1,3 +1,17 @@
# Copyright 2023 Declan Teevan
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import logging
from typing import Type

View File

@@ -1,3 +1,17 @@
# Copyright 2023 Declan Teevan
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import logging
from comment_service.models.proto import post_pb2

View File

@@ -1,3 +1,17 @@
# Copyright 2023 Declan Teevan
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import asyncio
from aiokafka import AIOKafkaProducer

View File

@@ -1,3 +1,17 @@
# Copyright 2023 Declan Teevan
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import asyncio
from typing import Type

View File

@@ -1,3 +1,17 @@
# Copyright 2023 Declan Teevan
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import logging
from comment_service.models.proto import user_pb2

View File

@@ -1,3 +1,17 @@
# Copyright 2023 Declan Teevan
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import asyncio
import logging
from sys import stdout

View File

@@ -1,3 +1,17 @@
# Copyright 2023 Declan Teevan
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
from typing import Any, List
from pydantic import computed_field

View File

@@ -1,3 +1,17 @@
# Copyright 2023 Declan Teevan
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
from enum import Enum, auto
from grpc import RpcContext, StatusCode

View File

@@ -1,3 +1,17 @@
# Copyright 2023 Declan Teevan
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
from datetime import datetime
from typing import List, Optional

View File

@@ -1,3 +1,17 @@
# Copyright 2023 Declan Teevan
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
from typing import List
from databases import Database

View File

@@ -1,3 +1,17 @@
# Copyright 2023 Declan Teevan
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import logging
from databases import Database

View File

@@ -1,3 +1,17 @@
# Copyright 2023 Declan Teevan
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import pickle
import logging
from typing import Type, List

View File

@@ -1,3 +1,17 @@
# Copyright 2023 Declan Teevan
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
from typing import Type
import redis.asyncio as redis

View File

@@ -1,3 +1,17 @@
# Copyright 2023 Declan Teevan
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import logging
import traceback
from typing import Type

View File

@@ -1,3 +1,17 @@
# Copyright 2023 Declan Teevan
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import logging
from typing import Type

View File

@@ -1,3 +1,17 @@
# Copyright 2023 Declan Teevan
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
from typing import Type, List
from comment_service.models.service import CommentRepository, Comment, CommentCreate, CommentUpdate

View File

@@ -5,7 +5,7 @@ description = "Panels - Comment Service"
license = "Apache-2.0"
readme = "README.md"
repository = "https://github.com/hexolan/panels"
authors = ["Declan <declan@hexolan.dev>"]
authors = ["Declan Teevan <dt@hexolan.com>"]
[tool.poetry.dependencies]
python = "^3.9"

View File

@@ -2,7 +2,7 @@
"name": "frontend",
"description": "Panels - Frontend Site",
"version": "1.0.0",
"author": "Declan <declan@hexolan.dev>",
"author": "Declan Teevan <dt@hexolan.com>",
"license": "Apache-2.0",
"type": "module",
"scripts": {

View File

@@ -1,3 +1,17 @@
// Copyright 2023 Declan Teevan
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package main
import (

View File

@@ -1,8 +1,23 @@
//go:build tools
// Copyright 2023 Declan Teevan
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package main
import (
// Protobuf Generation
_ "google.golang.org/protobuf/cmd/protoc-gen-go"
_ "google.golang.org/grpc/cmd/protoc-gen-go-grpc"
_ "google.golang.org/protobuf/cmd/protoc-gen-go"
)

View File

@@ -1,3 +1,17 @@
// Copyright 2023 Declan Teevan
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package api
import (
@@ -14,7 +28,7 @@ import (
func NewAPIApp(cfg internal.Config) *fiber.App {
app := fiber.New(fiber.Config{
AppName: "Panels REST Gateway",
AppName: "Panels REST Gateway",
ErrorHandler: handlers.ErrorHandler,
// Swap out the JSON encoder for faster marshaling

View File

@@ -1,11 +1,25 @@
// Copyright 2023 Declan Teevan
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package handlers
import (
"crypto/rsa"
"github.com/golang-jwt/jwt/v5"
"github.com/gofiber/fiber/v2"
"github.com/gofiber/fiber/v2/middleware/keyauth"
"github.com/golang-jwt/jwt/v5"
"github.com/hexolan/panels/gateway-service/internal"
)
@@ -24,7 +38,7 @@ func NewAuthMiddleware(cfg internal.Config) {
tokenValidator := tokenValidator{pubKey: cfg.JWTPubKey}
AuthMiddleware = keyauth.New(keyauth.Config{
AuthScheme: "Bearer",
Validator: tokenValidator.ValidateToken,
Validator: tokenValidator.ValidateToken,
})
}

View File

@@ -1,3 +1,17 @@
// Copyright 2023 Declan Teevan
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package handlers
import (
@@ -10,15 +24,15 @@ import (
)
func ErrorHandler(c *fiber.Ctx, err error) error {
c.Set(fiber.HeaderContentType, fiber.MIMEApplicationJSONCharsetUTF8)
code := fiber.StatusInternalServerError
c.Set(fiber.HeaderContentType, fiber.MIMEApplicationJSONCharsetUTF8)
code := fiber.StatusInternalServerError
msg := err.Error()
// Retrieval of codes from fiber.Errors
var e *fiber.Error
if errors.As(err, &e) {
code = e.Code
} else {
// Retrieval of codes from fiber.Errors
var e *fiber.Error
if errors.As(err, &e) {
code = e.Code
} else {
// Retrival of codes from gRPC errors.
status, ok := status.FromError(err)
if ok {
@@ -51,5 +65,5 @@ func ErrorHandler(c *fiber.Ctx, err error) error {
}
}
return c.Status(code).JSON(fiber.Map{"status": "failure", "msg": msg})
return c.Status(code).JSON(fiber.Map{"status": "failure", "msg": msg})
}

View File

@@ -1,10 +1,24 @@
// Copyright 2023 Declan Teevan
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package api
import (
"github.com/gofiber/fiber/v2"
"github.com/hexolan/panels/gateway-service/internal/api/v1"
"github.com/hexolan/panels/gateway-service/internal/api/handlers"
"github.com/hexolan/panels/gateway-service/internal/api/v1"
)
func RegisterRoutes(app *fiber.App) {

View File

@@ -1,8 +1,22 @@
// Copyright 2023 Declan Teevan
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package v1
import (
"time"
"context"
"time"
"github.com/gofiber/fiber/v2"
@@ -21,7 +35,7 @@ func setAuthMethod(userId string, password string) error {
_, err := rpc.Svcs.GetAuthSvc().SetPasswordAuth(
ctx,
&authv1.SetPasswordAuthMethod{
UserId: userId,
UserId: userId,
Password: password,
},
)
@@ -34,7 +48,7 @@ func authWithPassword(userId string, password string) (*authv1.AuthToken, error)
token, err := rpc.Svcs.GetAuthSvc().AuthWithPassword(
ctx,
&authv1.PasswordAuthRequest{
UserId: userId,
UserId: userId,
Password: password,
},
)
@@ -63,7 +77,7 @@ func LoginWithPassword(c *fiber.Ctx) error {
return c.JSON(fiber.Map{
"status": "success",
"data": fiber.Map{
"user": user,
"user": user,
"token": token,
},
})

View File

@@ -1,3 +1,17 @@
// Copyright 2023 Declan Teevan
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package v1
import (
@@ -48,7 +62,7 @@ func UpdateComment(c *fiber.Ctx) error {
return err
}
if (comment.AuthorId != currentUser.Id) {
if comment.AuthorId != currentUser.Id {
return fiber.NewError(fiber.StatusForbidden, "no permissions to update that comment")
}
@@ -64,7 +78,7 @@ func UpdateComment(c *fiber.Ctx) error {
comment, err = rpc.Svcs.GetCommentSvc().UpdateComment(
ctx,
&commentv1.UpdateCommentRequest{
Id: c.Params("id"),
Id: c.Params("id"),
Data: updatedComment,
},
)
@@ -87,7 +101,7 @@ func DeleteComment(c *fiber.Ctx) error {
return err
}
if (comment.AuthorId != currentUser.Id && !currentUser.IsAdmin) {
if comment.AuthorId != currentUser.Id && !currentUser.IsAdmin {
return fiber.NewError(fiber.StatusForbidden, "no permissions to delete that comment")
}
@@ -130,9 +144,9 @@ func CreateComment(c *fiber.Ctx) error {
comment, err := rpc.Svcs.GetCommentSvc().CreateComment(
ctx,
&commentv1.CreateCommentRequest{
PostId: post.Id,
PostId: post.Id,
AuthorId: tokenClaims.Subject,
Data: newComment,
Data: newComment,
},
)
if err != nil {

View File

@@ -1,8 +1,22 @@
// Copyright 2023 Declan Teevan
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package v1
import (
"time"
"context"
"time"
"github.com/gofiber/fiber/v2"

View File

@@ -1,14 +1,28 @@
// Copyright 2023 Declan Teevan
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package v1
import (
"time"
"context"
"time"
"github.com/gofiber/fiber/v2"
"github.com/hexolan/panels/gateway-service/internal/api/handlers"
"github.com/hexolan/panels/gateway-service/internal/rpc"
"github.com/hexolan/panels/gateway-service/internal/rpc/postv1"
"github.com/hexolan/panels/gateway-service/internal/api/handlers"
)
func getPostById(postId string) (*postv1.Post, error) {
@@ -155,7 +169,7 @@ func UpdatePost(c *fiber.Ctx) error {
return err
}
if (post.AuthorId != currentUser.Id) {
if post.AuthorId != currentUser.Id {
return fiber.NewError(fiber.StatusForbidden, "no permissions to update that post")
}
@@ -191,7 +205,7 @@ func DeletePost(c *fiber.Ctx) error {
return err
}
if (post.AuthorId != currentUser.Id && !currentUser.IsAdmin) {
if post.AuthorId != currentUser.Id && !currentUser.IsAdmin {
return fiber.NewError(fiber.StatusForbidden, "no permissions to delete that post")
}
@@ -235,8 +249,8 @@ func CreatePanelPostFromId(c *fiber.Ctx) error {
ctx,
&postv1.CreatePostRequest{
PanelId: panel.Id,
UserId: tokenClaims.Subject,
Data: newPost,
UserId: tokenClaims.Subject,
Data: newPost,
},
)
if err != nil {
@@ -272,8 +286,8 @@ func CreatePanelPostFromName(c *fiber.Ctx) error {
ctx,
&postv1.CreatePostRequest{
PanelId: panelId,
UserId: tokenClaims.Subject,
Data: newPost,
UserId: tokenClaims.Subject,
Data: newPost,
},
)
if err != nil {

View File

@@ -1,14 +1,28 @@
// Copyright 2023 Declan Teevan
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package v1
import (
"time"
"context"
"time"
"github.com/gofiber/fiber/v2"
"github.com/hexolan/panels/gateway-service/internal/api/handlers"
"github.com/hexolan/panels/gateway-service/internal/rpc"
"github.com/hexolan/panels/gateway-service/internal/rpc/userv1"
"github.com/hexolan/panels/gateway-service/internal/api/handlers"
)
type userSignupForm struct {
@@ -189,7 +203,7 @@ func UserSignup(c *fiber.Ctx) error {
return c.JSON(fiber.Map{
"status": "success",
"data": fiber.Map{
"user": user,
"user": user,
"token": token,
},
})

View File

@@ -1,12 +1,26 @@
// Copyright 2023 Declan Teevan
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package internal
import (
"os"
"crypto/rsa"
"encoding/base64"
"os"
"github.com/golang-jwt/jwt/v5"
"github.com/gofiber/fiber/v2/log"
"github.com/golang-jwt/jwt/v5"
)
func NewConfig() Config {
@@ -21,10 +35,10 @@ func NewConfig() Config {
}
return Config{
PanelSvcAddr: optFromEnvRequire("PANEL_SVC_ADDR"),
PostSvcAddr: optFromEnvRequire("POST_SVC_ADDR"),
UserSvcAddr: optFromEnvRequire("USER_SVC_ADDR"),
AuthSvcAddr: optFromEnvRequire("AUTH_SVC_ADDR"),
PanelSvcAddr: optFromEnvRequire("PANEL_SVC_ADDR"),
PostSvcAddr: optFromEnvRequire("POST_SVC_ADDR"),
UserSvcAddr: optFromEnvRequire("USER_SVC_ADDR"),
AuthSvcAddr: optFromEnvRequire("AUTH_SVC_ADDR"),
CommentSvcAddr: optFromEnvRequire("COMMENT_SVC_ADDR"),
JWTPubKey: jwtPubKey,
@@ -40,10 +54,10 @@ func optFromEnvRequire(opt string) string {
}
type Config struct {
PostSvcAddr string
PanelSvcAddr string
UserSvcAddr string
AuthSvcAddr string
PostSvcAddr string
PanelSvcAddr string
UserSvcAddr string
AuthSvcAddr string
CommentSvcAddr string
JWTPubKey *rsa.PublicKey

View File

@@ -1,6 +1,20 @@
// Copyright 2023 Declan Teevan
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// protoc-gen-go v1.28.1
// protoc-gen-go v1.31.0
// protoc v4.23.4
// source: auth.proto

View File

@@ -1,6 +1,20 @@
// Copyright 2023 Declan Teevan
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// Code generated by protoc-gen-go-grpc. DO NOT EDIT.
// versions:
// - protoc-gen-go-grpc v1.2.0
// - protoc-gen-go-grpc v1.3.0
// - protoc v4.23.4
// source: auth.proto
@@ -19,6 +33,12 @@ import (
// Requires gRPC-Go v1.32.0 or later.
const _ = grpc.SupportPackageIsVersion7
const (
AuthService_AuthWithPassword_FullMethodName = "/panels.auth.v1.AuthService/AuthWithPassword"
AuthService_SetPasswordAuth_FullMethodName = "/panels.auth.v1.AuthService/SetPasswordAuth"
AuthService_DeletePasswordAuth_FullMethodName = "/panels.auth.v1.AuthService/DeletePasswordAuth"
)
// AuthServiceClient is the client API for AuthService service.
//
// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.
@@ -38,7 +58,7 @@ func NewAuthServiceClient(cc grpc.ClientConnInterface) AuthServiceClient {
func (c *authServiceClient) AuthWithPassword(ctx context.Context, in *PasswordAuthRequest, opts ...grpc.CallOption) (*AuthToken, error) {
out := new(AuthToken)
err := c.cc.Invoke(ctx, "/panels.auth.v1.AuthService/AuthWithPassword", in, out, opts...)
err := c.cc.Invoke(ctx, AuthService_AuthWithPassword_FullMethodName, in, out, opts...)
if err != nil {
return nil, err
}
@@ -47,7 +67,7 @@ func (c *authServiceClient) AuthWithPassword(ctx context.Context, in *PasswordAu
func (c *authServiceClient) SetPasswordAuth(ctx context.Context, in *SetPasswordAuthMethod, opts ...grpc.CallOption) (*emptypb.Empty, error) {
out := new(emptypb.Empty)
err := c.cc.Invoke(ctx, "/panels.auth.v1.AuthService/SetPasswordAuth", in, out, opts...)
err := c.cc.Invoke(ctx, AuthService_SetPasswordAuth_FullMethodName, in, out, opts...)
if err != nil {
return nil, err
}
@@ -56,7 +76,7 @@ func (c *authServiceClient) SetPasswordAuth(ctx context.Context, in *SetPassword
func (c *authServiceClient) DeletePasswordAuth(ctx context.Context, in *DeletePasswordAuthMethod, opts ...grpc.CallOption) (*emptypb.Empty, error) {
out := new(emptypb.Empty)
err := c.cc.Invoke(ctx, "/panels.auth.v1.AuthService/DeletePasswordAuth", in, out, opts...)
err := c.cc.Invoke(ctx, AuthService_DeletePasswordAuth_FullMethodName, in, out, opts...)
if err != nil {
return nil, err
}
@@ -109,7 +129,7 @@ func _AuthService_AuthWithPassword_Handler(srv interface{}, ctx context.Context,
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/panels.auth.v1.AuthService/AuthWithPassword",
FullMethod: AuthService_AuthWithPassword_FullMethodName,
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(AuthServiceServer).AuthWithPassword(ctx, req.(*PasswordAuthRequest))
@@ -127,7 +147,7 @@ func _AuthService_SetPasswordAuth_Handler(srv interface{}, ctx context.Context,
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/panels.auth.v1.AuthService/SetPasswordAuth",
FullMethod: AuthService_SetPasswordAuth_FullMethodName,
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(AuthServiceServer).SetPasswordAuth(ctx, req.(*SetPasswordAuthMethod))
@@ -145,7 +165,7 @@ func _AuthService_DeletePasswordAuth_Handler(srv interface{}, ctx context.Contex
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/panels.auth.v1.AuthService/DeletePasswordAuth",
FullMethod: AuthService_DeletePasswordAuth_FullMethodName,
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(AuthServiceServer).DeletePasswordAuth(ctx, req.(*DeletePasswordAuthMethod))

View File

@@ -1,6 +1,20 @@
// Copyright 2023 Declan Teevan
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// protoc-gen-go v1.28.1
// protoc-gen-go v1.31.0
// protoc v4.23.4
// source: comment.proto

View File

@@ -1,6 +1,20 @@
// Copyright 2023 Declan Teevan
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// Code generated by protoc-gen-go-grpc. DO NOT EDIT.
// versions:
// - protoc-gen-go-grpc v1.2.0
// - protoc-gen-go-grpc v1.3.0
// - protoc v4.23.4
// source: comment.proto
@@ -19,6 +33,14 @@ import (
// Requires gRPC-Go v1.32.0 or later.
const _ = grpc.SupportPackageIsVersion7
const (
CommentService_CreateComment_FullMethodName = "/panels.comment.v1.CommentService/CreateComment"
CommentService_UpdateComment_FullMethodName = "/panels.comment.v1.CommentService/UpdateComment"
CommentService_DeleteComment_FullMethodName = "/panels.comment.v1.CommentService/DeleteComment"
CommentService_GetComment_FullMethodName = "/panels.comment.v1.CommentService/GetComment"
CommentService_GetPostComments_FullMethodName = "/panels.comment.v1.CommentService/GetPostComments"
)
// CommentServiceClient is the client API for CommentService service.
//
// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.
@@ -40,7 +62,7 @@ func NewCommentServiceClient(cc grpc.ClientConnInterface) CommentServiceClient {
func (c *commentServiceClient) CreateComment(ctx context.Context, in *CreateCommentRequest, opts ...grpc.CallOption) (*Comment, error) {
out := new(Comment)
err := c.cc.Invoke(ctx, "/panels.comment.v1.CommentService/CreateComment", in, out, opts...)
err := c.cc.Invoke(ctx, CommentService_CreateComment_FullMethodName, in, out, opts...)
if err != nil {
return nil, err
}
@@ -49,7 +71,7 @@ func (c *commentServiceClient) CreateComment(ctx context.Context, in *CreateComm
func (c *commentServiceClient) UpdateComment(ctx context.Context, in *UpdateCommentRequest, opts ...grpc.CallOption) (*Comment, error) {
out := new(Comment)
err := c.cc.Invoke(ctx, "/panels.comment.v1.CommentService/UpdateComment", in, out, opts...)
err := c.cc.Invoke(ctx, CommentService_UpdateComment_FullMethodName, in, out, opts...)
if err != nil {
return nil, err
}
@@ -58,7 +80,7 @@ func (c *commentServiceClient) UpdateComment(ctx context.Context, in *UpdateComm
func (c *commentServiceClient) DeleteComment(ctx context.Context, in *DeleteCommentRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) {
out := new(emptypb.Empty)
err := c.cc.Invoke(ctx, "/panels.comment.v1.CommentService/DeleteComment", in, out, opts...)
err := c.cc.Invoke(ctx, CommentService_DeleteComment_FullMethodName, in, out, opts...)
if err != nil {
return nil, err
}
@@ -67,7 +89,7 @@ func (c *commentServiceClient) DeleteComment(ctx context.Context, in *DeleteComm
func (c *commentServiceClient) GetComment(ctx context.Context, in *GetCommentRequest, opts ...grpc.CallOption) (*Comment, error) {
out := new(Comment)
err := c.cc.Invoke(ctx, "/panels.comment.v1.CommentService/GetComment", in, out, opts...)
err := c.cc.Invoke(ctx, CommentService_GetComment_FullMethodName, in, out, opts...)
if err != nil {
return nil, err
}
@@ -76,7 +98,7 @@ func (c *commentServiceClient) GetComment(ctx context.Context, in *GetCommentReq
func (c *commentServiceClient) GetPostComments(ctx context.Context, in *GetPostCommentsRequest, opts ...grpc.CallOption) (*PostComments, error) {
out := new(PostComments)
err := c.cc.Invoke(ctx, "/panels.comment.v1.CommentService/GetPostComments", in, out, opts...)
err := c.cc.Invoke(ctx, CommentService_GetPostComments_FullMethodName, in, out, opts...)
if err != nil {
return nil, err
}
@@ -137,7 +159,7 @@ func _CommentService_CreateComment_Handler(srv interface{}, ctx context.Context,
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/panels.comment.v1.CommentService/CreateComment",
FullMethod: CommentService_CreateComment_FullMethodName,
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(CommentServiceServer).CreateComment(ctx, req.(*CreateCommentRequest))
@@ -155,7 +177,7 @@ func _CommentService_UpdateComment_Handler(srv interface{}, ctx context.Context,
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/panels.comment.v1.CommentService/UpdateComment",
FullMethod: CommentService_UpdateComment_FullMethodName,
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(CommentServiceServer).UpdateComment(ctx, req.(*UpdateCommentRequest))
@@ -173,7 +195,7 @@ func _CommentService_DeleteComment_Handler(srv interface{}, ctx context.Context,
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/panels.comment.v1.CommentService/DeleteComment",
FullMethod: CommentService_DeleteComment_FullMethodName,
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(CommentServiceServer).DeleteComment(ctx, req.(*DeleteCommentRequest))
@@ -191,7 +213,7 @@ func _CommentService_GetComment_Handler(srv interface{}, ctx context.Context, de
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/panels.comment.v1.CommentService/GetComment",
FullMethod: CommentService_GetComment_FullMethodName,
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(CommentServiceServer).GetComment(ctx, req.(*GetCommentRequest))
@@ -209,7 +231,7 @@ func _CommentService_GetPostComments_Handler(srv interface{}, ctx context.Contex
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/panels.comment.v1.CommentService/GetPostComments",
FullMethod: CommentService_GetPostComments_FullMethodName,
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(CommentServiceServer).GetPostComments(ctx, req.(*GetPostCommentsRequest))

View File

@@ -1,6 +1,20 @@
// Copyright 2023 Declan Teevan
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// protoc-gen-go v1.28.1
// protoc-gen-go v1.31.0
// protoc v4.23.4
// source: panel.proto

View File

@@ -1,6 +1,20 @@
// Copyright 2023 Declan Teevan
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// Code generated by protoc-gen-go-grpc. DO NOT EDIT.
// versions:
// - protoc-gen-go-grpc v1.2.0
// - protoc-gen-go-grpc v1.3.0
// - protoc v4.23.4
// source: panel.proto
@@ -19,6 +33,16 @@ import (
// Requires gRPC-Go v1.32.0 or later.
const _ = grpc.SupportPackageIsVersion7
const (
PanelService_CreatePanel_FullMethodName = "/panels.panel.v1.PanelService/CreatePanel"
PanelService_GetPanel_FullMethodName = "/panels.panel.v1.PanelService/GetPanel"
PanelService_GetPanelByName_FullMethodName = "/panels.panel.v1.PanelService/GetPanelByName"
PanelService_UpdatePanel_FullMethodName = "/panels.panel.v1.PanelService/UpdatePanel"
PanelService_UpdatePanelByName_FullMethodName = "/panels.panel.v1.PanelService/UpdatePanelByName"
PanelService_DeletePanel_FullMethodName = "/panels.panel.v1.PanelService/DeletePanel"
PanelService_DeletePanelByName_FullMethodName = "/panels.panel.v1.PanelService/DeletePanelByName"
)
// PanelServiceClient is the client API for PanelService service.
//
// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.
@@ -42,7 +66,7 @@ func NewPanelServiceClient(cc grpc.ClientConnInterface) PanelServiceClient {
func (c *panelServiceClient) CreatePanel(ctx context.Context, in *CreatePanelRequest, opts ...grpc.CallOption) (*Panel, error) {
out := new(Panel)
err := c.cc.Invoke(ctx, "/panels.panel.v1.PanelService/CreatePanel", in, out, opts...)
err := c.cc.Invoke(ctx, PanelService_CreatePanel_FullMethodName, in, out, opts...)
if err != nil {
return nil, err
}
@@ -51,7 +75,7 @@ func (c *panelServiceClient) CreatePanel(ctx context.Context, in *CreatePanelReq
func (c *panelServiceClient) GetPanel(ctx context.Context, in *GetPanelByIdRequest, opts ...grpc.CallOption) (*Panel, error) {
out := new(Panel)
err := c.cc.Invoke(ctx, "/panels.panel.v1.PanelService/GetPanel", in, out, opts...)
err := c.cc.Invoke(ctx, PanelService_GetPanel_FullMethodName, in, out, opts...)
if err != nil {
return nil, err
}
@@ -60,7 +84,7 @@ func (c *panelServiceClient) GetPanel(ctx context.Context, in *GetPanelByIdReque
func (c *panelServiceClient) GetPanelByName(ctx context.Context, in *GetPanelByNameRequest, opts ...grpc.CallOption) (*Panel, error) {
out := new(Panel)
err := c.cc.Invoke(ctx, "/panels.panel.v1.PanelService/GetPanelByName", in, out, opts...)
err := c.cc.Invoke(ctx, PanelService_GetPanelByName_FullMethodName, in, out, opts...)
if err != nil {
return nil, err
}
@@ -69,7 +93,7 @@ func (c *panelServiceClient) GetPanelByName(ctx context.Context, in *GetPanelByN
func (c *panelServiceClient) UpdatePanel(ctx context.Context, in *UpdatePanelByIdRequest, opts ...grpc.CallOption) (*Panel, error) {
out := new(Panel)
err := c.cc.Invoke(ctx, "/panels.panel.v1.PanelService/UpdatePanel", in, out, opts...)
err := c.cc.Invoke(ctx, PanelService_UpdatePanel_FullMethodName, in, out, opts...)
if err != nil {
return nil, err
}
@@ -78,7 +102,7 @@ func (c *panelServiceClient) UpdatePanel(ctx context.Context, in *UpdatePanelByI
func (c *panelServiceClient) UpdatePanelByName(ctx context.Context, in *UpdatePanelByNameRequest, opts ...grpc.CallOption) (*Panel, error) {
out := new(Panel)
err := c.cc.Invoke(ctx, "/panels.panel.v1.PanelService/UpdatePanelByName", in, out, opts...)
err := c.cc.Invoke(ctx, PanelService_UpdatePanelByName_FullMethodName, in, out, opts...)
if err != nil {
return nil, err
}
@@ -87,7 +111,7 @@ func (c *panelServiceClient) UpdatePanelByName(ctx context.Context, in *UpdatePa
func (c *panelServiceClient) DeletePanel(ctx context.Context, in *DeletePanelByIdRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) {
out := new(emptypb.Empty)
err := c.cc.Invoke(ctx, "/panels.panel.v1.PanelService/DeletePanel", in, out, opts...)
err := c.cc.Invoke(ctx, PanelService_DeletePanel_FullMethodName, in, out, opts...)
if err != nil {
return nil, err
}
@@ -96,7 +120,7 @@ func (c *panelServiceClient) DeletePanel(ctx context.Context, in *DeletePanelByI
func (c *panelServiceClient) DeletePanelByName(ctx context.Context, in *DeletePanelByNameRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) {
out := new(emptypb.Empty)
err := c.cc.Invoke(ctx, "/panels.panel.v1.PanelService/DeletePanelByName", in, out, opts...)
err := c.cc.Invoke(ctx, PanelService_DeletePanelByName_FullMethodName, in, out, opts...)
if err != nil {
return nil, err
}
@@ -165,7 +189,7 @@ func _PanelService_CreatePanel_Handler(srv interface{}, ctx context.Context, dec
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/panels.panel.v1.PanelService/CreatePanel",
FullMethod: PanelService_CreatePanel_FullMethodName,
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(PanelServiceServer).CreatePanel(ctx, req.(*CreatePanelRequest))
@@ -183,7 +207,7 @@ func _PanelService_GetPanel_Handler(srv interface{}, ctx context.Context, dec fu
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/panels.panel.v1.PanelService/GetPanel",
FullMethod: PanelService_GetPanel_FullMethodName,
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(PanelServiceServer).GetPanel(ctx, req.(*GetPanelByIdRequest))
@@ -201,7 +225,7 @@ func _PanelService_GetPanelByName_Handler(srv interface{}, ctx context.Context,
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/panels.panel.v1.PanelService/GetPanelByName",
FullMethod: PanelService_GetPanelByName_FullMethodName,
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(PanelServiceServer).GetPanelByName(ctx, req.(*GetPanelByNameRequest))
@@ -219,7 +243,7 @@ func _PanelService_UpdatePanel_Handler(srv interface{}, ctx context.Context, dec
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/panels.panel.v1.PanelService/UpdatePanel",
FullMethod: PanelService_UpdatePanel_FullMethodName,
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(PanelServiceServer).UpdatePanel(ctx, req.(*UpdatePanelByIdRequest))
@@ -237,7 +261,7 @@ func _PanelService_UpdatePanelByName_Handler(srv interface{}, ctx context.Contex
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/panels.panel.v1.PanelService/UpdatePanelByName",
FullMethod: PanelService_UpdatePanelByName_FullMethodName,
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(PanelServiceServer).UpdatePanelByName(ctx, req.(*UpdatePanelByNameRequest))
@@ -255,7 +279,7 @@ func _PanelService_DeletePanel_Handler(srv interface{}, ctx context.Context, dec
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/panels.panel.v1.PanelService/DeletePanel",
FullMethod: PanelService_DeletePanel_FullMethodName,
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(PanelServiceServer).DeletePanel(ctx, req.(*DeletePanelByIdRequest))
@@ -273,7 +297,7 @@ func _PanelService_DeletePanelByName_Handler(srv interface{}, ctx context.Contex
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/panels.panel.v1.PanelService/DeletePanelByName",
FullMethod: PanelService_DeletePanelByName_FullMethodName,
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(PanelServiceServer).DeletePanelByName(ctx, req.(*DeletePanelByNameRequest))

View File

@@ -1,6 +1,20 @@
// Copyright 2023 Declan Teevan
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// protoc-gen-go v1.28.1
// protoc-gen-go v1.31.0
// protoc v4.23.4
// source: post.proto

View File

@@ -1,6 +1,20 @@
// Copyright 2023 Declan Teevan
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// Code generated by protoc-gen-go-grpc. DO NOT EDIT.
// versions:
// - protoc-gen-go-grpc v1.2.0
// - protoc-gen-go-grpc v1.3.0
// - protoc v4.23.4
// source: post.proto
@@ -19,6 +33,17 @@ import (
// Requires gRPC-Go v1.32.0 or later.
const _ = grpc.SupportPackageIsVersion7
const (
PostService_CreatePost_FullMethodName = "/panels.post.v1.PostService/CreatePost"
PostService_GetPost_FullMethodName = "/panels.post.v1.PostService/GetPost"
PostService_GetPanelPost_FullMethodName = "/panels.post.v1.PostService/GetPanelPost"
PostService_UpdatePost_FullMethodName = "/panels.post.v1.PostService/UpdatePost"
PostService_DeletePost_FullMethodName = "/panels.post.v1.PostService/DeletePost"
PostService_GetFeedPosts_FullMethodName = "/panels.post.v1.PostService/GetFeedPosts"
PostService_GetUserPosts_FullMethodName = "/panels.post.v1.PostService/GetUserPosts"
PostService_GetPanelPosts_FullMethodName = "/panels.post.v1.PostService/GetPanelPosts"
)
// PostServiceClient is the client API for PostService service.
//
// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.
@@ -43,7 +68,7 @@ func NewPostServiceClient(cc grpc.ClientConnInterface) PostServiceClient {
func (c *postServiceClient) CreatePost(ctx context.Context, in *CreatePostRequest, opts ...grpc.CallOption) (*Post, error) {
out := new(Post)
err := c.cc.Invoke(ctx, "/panels.post.v1.PostService/CreatePost", in, out, opts...)
err := c.cc.Invoke(ctx, PostService_CreatePost_FullMethodName, in, out, opts...)
if err != nil {
return nil, err
}
@@ -52,7 +77,7 @@ func (c *postServiceClient) CreatePost(ctx context.Context, in *CreatePostReques
func (c *postServiceClient) GetPost(ctx context.Context, in *GetPostRequest, opts ...grpc.CallOption) (*Post, error) {
out := new(Post)
err := c.cc.Invoke(ctx, "/panels.post.v1.PostService/GetPost", in, out, opts...)
err := c.cc.Invoke(ctx, PostService_GetPost_FullMethodName, in, out, opts...)
if err != nil {
return nil, err
}
@@ -61,7 +86,7 @@ func (c *postServiceClient) GetPost(ctx context.Context, in *GetPostRequest, opt
func (c *postServiceClient) GetPanelPost(ctx context.Context, in *GetPanelPostRequest, opts ...grpc.CallOption) (*Post, error) {
out := new(Post)
err := c.cc.Invoke(ctx, "/panels.post.v1.PostService/GetPanelPost", in, out, opts...)
err := c.cc.Invoke(ctx, PostService_GetPanelPost_FullMethodName, in, out, opts...)
if err != nil {
return nil, err
}
@@ -70,7 +95,7 @@ func (c *postServiceClient) GetPanelPost(ctx context.Context, in *GetPanelPostRe
func (c *postServiceClient) UpdatePost(ctx context.Context, in *UpdatePostRequest, opts ...grpc.CallOption) (*Post, error) {
out := new(Post)
err := c.cc.Invoke(ctx, "/panels.post.v1.PostService/UpdatePost", in, out, opts...)
err := c.cc.Invoke(ctx, PostService_UpdatePost_FullMethodName, in, out, opts...)
if err != nil {
return nil, err
}
@@ -79,7 +104,7 @@ func (c *postServiceClient) UpdatePost(ctx context.Context, in *UpdatePostReques
func (c *postServiceClient) DeletePost(ctx context.Context, in *DeletePostRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) {
out := new(emptypb.Empty)
err := c.cc.Invoke(ctx, "/panels.post.v1.PostService/DeletePost", in, out, opts...)
err := c.cc.Invoke(ctx, PostService_DeletePost_FullMethodName, in, out, opts...)
if err != nil {
return nil, err
}
@@ -88,7 +113,7 @@ func (c *postServiceClient) DeletePost(ctx context.Context, in *DeletePostReques
func (c *postServiceClient) GetFeedPosts(ctx context.Context, in *GetFeedPostsRequest, opts ...grpc.CallOption) (*FeedPosts, error) {
out := new(FeedPosts)
err := c.cc.Invoke(ctx, "/panels.post.v1.PostService/GetFeedPosts", in, out, opts...)
err := c.cc.Invoke(ctx, PostService_GetFeedPosts_FullMethodName, in, out, opts...)
if err != nil {
return nil, err
}
@@ -97,7 +122,7 @@ func (c *postServiceClient) GetFeedPosts(ctx context.Context, in *GetFeedPostsRe
func (c *postServiceClient) GetUserPosts(ctx context.Context, in *GetUserPostsRequest, opts ...grpc.CallOption) (*UserPosts, error) {
out := new(UserPosts)
err := c.cc.Invoke(ctx, "/panels.post.v1.PostService/GetUserPosts", in, out, opts...)
err := c.cc.Invoke(ctx, PostService_GetUserPosts_FullMethodName, in, out, opts...)
if err != nil {
return nil, err
}
@@ -106,7 +131,7 @@ func (c *postServiceClient) GetUserPosts(ctx context.Context, in *GetUserPostsRe
func (c *postServiceClient) GetPanelPosts(ctx context.Context, in *GetPanelPostsRequest, opts ...grpc.CallOption) (*PanelPosts, error) {
out := new(PanelPosts)
err := c.cc.Invoke(ctx, "/panels.post.v1.PostService/GetPanelPosts", in, out, opts...)
err := c.cc.Invoke(ctx, PostService_GetPanelPosts_FullMethodName, in, out, opts...)
if err != nil {
return nil, err
}
@@ -179,7 +204,7 @@ func _PostService_CreatePost_Handler(srv interface{}, ctx context.Context, dec f
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/panels.post.v1.PostService/CreatePost",
FullMethod: PostService_CreatePost_FullMethodName,
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(PostServiceServer).CreatePost(ctx, req.(*CreatePostRequest))
@@ -197,7 +222,7 @@ func _PostService_GetPost_Handler(srv interface{}, ctx context.Context, dec func
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/panels.post.v1.PostService/GetPost",
FullMethod: PostService_GetPost_FullMethodName,
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(PostServiceServer).GetPost(ctx, req.(*GetPostRequest))
@@ -215,7 +240,7 @@ func _PostService_GetPanelPost_Handler(srv interface{}, ctx context.Context, dec
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/panels.post.v1.PostService/GetPanelPost",
FullMethod: PostService_GetPanelPost_FullMethodName,
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(PostServiceServer).GetPanelPost(ctx, req.(*GetPanelPostRequest))
@@ -233,7 +258,7 @@ func _PostService_UpdatePost_Handler(srv interface{}, ctx context.Context, dec f
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/panels.post.v1.PostService/UpdatePost",
FullMethod: PostService_UpdatePost_FullMethodName,
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(PostServiceServer).UpdatePost(ctx, req.(*UpdatePostRequest))
@@ -251,7 +276,7 @@ func _PostService_DeletePost_Handler(srv interface{}, ctx context.Context, dec f
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/panels.post.v1.PostService/DeletePost",
FullMethod: PostService_DeletePost_FullMethodName,
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(PostServiceServer).DeletePost(ctx, req.(*DeletePostRequest))
@@ -269,7 +294,7 @@ func _PostService_GetFeedPosts_Handler(srv interface{}, ctx context.Context, dec
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/panels.post.v1.PostService/GetFeedPosts",
FullMethod: PostService_GetFeedPosts_FullMethodName,
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(PostServiceServer).GetFeedPosts(ctx, req.(*GetFeedPostsRequest))
@@ -287,7 +312,7 @@ func _PostService_GetUserPosts_Handler(srv interface{}, ctx context.Context, dec
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/panels.post.v1.PostService/GetUserPosts",
FullMethod: PostService_GetUserPosts_FullMethodName,
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(PostServiceServer).GetUserPosts(ctx, req.(*GetUserPostsRequest))
@@ -305,7 +330,7 @@ func _PostService_GetPanelPosts_Handler(srv interface{}, ctx context.Context, de
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/panels.post.v1.PostService/GetPanelPosts",
FullMethod: PostService_GetPanelPosts_FullMethodName,
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(PostServiceServer).GetPanelPosts(ctx, req.(*GetPanelPostsRequest))

View File

@@ -1,3 +1,17 @@
// Copyright 2023 Declan Teevan
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package rpc
import (
@@ -7,20 +21,20 @@ import (
"google.golang.org/grpc/credentials/insecure"
"github.com/hexolan/panels/gateway-service/internal"
"github.com/hexolan/panels/gateway-service/internal/rpc/authv1"
"github.com/hexolan/panels/gateway-service/internal/rpc/commentv1"
"github.com/hexolan/panels/gateway-service/internal/rpc/panelv1"
"github.com/hexolan/panels/gateway-service/internal/rpc/postv1"
"github.com/hexolan/panels/gateway-service/internal/rpc/userv1"
"github.com/hexolan/panels/gateway-service/internal/rpc/authv1"
"github.com/hexolan/panels/gateway-service/internal/rpc/commentv1"
)
var Svcs RPCServices
type RPCServices struct {
panelSvcConn *grpc.ClientConn
postSvcConn *grpc.ClientConn
userSvcConn *grpc.ClientConn
authSvcConn *grpc.ClientConn
panelSvcConn *grpc.ClientConn
postSvcConn *grpc.ClientConn
userSvcConn *grpc.ClientConn
authSvcConn *grpc.ClientConn
commentSvcConn *grpc.ClientConn
}
@@ -46,10 +60,10 @@ func (rpcSvcs RPCServices) GetCommentSvc() commentv1.CommentServiceClient {
func DialRPCServices(cfg internal.Config) {
Svcs = RPCServices{
panelSvcConn: dialRPC(cfg.PanelSvcAddr),
postSvcConn: dialRPC(cfg.PostSvcAddr),
userSvcConn: dialRPC(cfg.UserSvcAddr),
authSvcConn: dialRPC(cfg.AuthSvcAddr),
panelSvcConn: dialRPC(cfg.PanelSvcAddr),
postSvcConn: dialRPC(cfg.PostSvcAddr),
userSvcConn: dialRPC(cfg.UserSvcAddr),
authSvcConn: dialRPC(cfg.AuthSvcAddr),
commentSvcConn: dialRPC(cfg.CommentSvcAddr),
}
}

View File

@@ -1,6 +1,20 @@
// Copyright 2023 Declan Teevan
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// protoc-gen-go v1.28.1
// protoc-gen-go v1.31.0
// protoc v4.23.4
// source: user.proto

View File

@@ -1,6 +1,20 @@
// Copyright 2023 Declan Teevan
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// Code generated by protoc-gen-go-grpc. DO NOT EDIT.
// versions:
// - protoc-gen-go-grpc v1.2.0
// - protoc-gen-go-grpc v1.3.0
// - protoc v4.23.4
// source: user.proto
@@ -19,6 +33,16 @@ import (
// Requires gRPC-Go v1.32.0 or later.
const _ = grpc.SupportPackageIsVersion7
const (
UserService_CreateUser_FullMethodName = "/panels.user.v1.UserService/CreateUser"
UserService_GetUser_FullMethodName = "/panels.user.v1.UserService/GetUser"
UserService_GetUserByName_FullMethodName = "/panels.user.v1.UserService/GetUserByName"
UserService_UpdateUser_FullMethodName = "/panels.user.v1.UserService/UpdateUser"
UserService_UpdateUserByName_FullMethodName = "/panels.user.v1.UserService/UpdateUserByName"
UserService_DeleteUser_FullMethodName = "/panels.user.v1.UserService/DeleteUser"
UserService_DeleteUserByName_FullMethodName = "/panels.user.v1.UserService/DeleteUserByName"
)
// UserServiceClient is the client API for UserService service.
//
// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.
@@ -42,7 +66,7 @@ func NewUserServiceClient(cc grpc.ClientConnInterface) UserServiceClient {
func (c *userServiceClient) CreateUser(ctx context.Context, in *CreateUserRequest, opts ...grpc.CallOption) (*User, error) {
out := new(User)
err := c.cc.Invoke(ctx, "/panels.user.v1.UserService/CreateUser", in, out, opts...)
err := c.cc.Invoke(ctx, UserService_CreateUser_FullMethodName, in, out, opts...)
if err != nil {
return nil, err
}
@@ -51,7 +75,7 @@ func (c *userServiceClient) CreateUser(ctx context.Context, in *CreateUserReques
func (c *userServiceClient) GetUser(ctx context.Context, in *GetUserByIdRequest, opts ...grpc.CallOption) (*User, error) {
out := new(User)
err := c.cc.Invoke(ctx, "/panels.user.v1.UserService/GetUser", in, out, opts...)
err := c.cc.Invoke(ctx, UserService_GetUser_FullMethodName, in, out, opts...)
if err != nil {
return nil, err
}
@@ -60,7 +84,7 @@ func (c *userServiceClient) GetUser(ctx context.Context, in *GetUserByIdRequest,
func (c *userServiceClient) GetUserByName(ctx context.Context, in *GetUserByNameRequest, opts ...grpc.CallOption) (*User, error) {
out := new(User)
err := c.cc.Invoke(ctx, "/panels.user.v1.UserService/GetUserByName", in, out, opts...)
err := c.cc.Invoke(ctx, UserService_GetUserByName_FullMethodName, in, out, opts...)
if err != nil {
return nil, err
}
@@ -69,7 +93,7 @@ func (c *userServiceClient) GetUserByName(ctx context.Context, in *GetUserByName
func (c *userServiceClient) UpdateUser(ctx context.Context, in *UpdateUserByIdRequest, opts ...grpc.CallOption) (*User, error) {
out := new(User)
err := c.cc.Invoke(ctx, "/panels.user.v1.UserService/UpdateUser", in, out, opts...)
err := c.cc.Invoke(ctx, UserService_UpdateUser_FullMethodName, in, out, opts...)
if err != nil {
return nil, err
}
@@ -78,7 +102,7 @@ func (c *userServiceClient) UpdateUser(ctx context.Context, in *UpdateUserByIdRe
func (c *userServiceClient) UpdateUserByName(ctx context.Context, in *UpdateUserByNameRequest, opts ...grpc.CallOption) (*User, error) {
out := new(User)
err := c.cc.Invoke(ctx, "/panels.user.v1.UserService/UpdateUserByName", in, out, opts...)
err := c.cc.Invoke(ctx, UserService_UpdateUserByName_FullMethodName, in, out, opts...)
if err != nil {
return nil, err
}
@@ -87,7 +111,7 @@ func (c *userServiceClient) UpdateUserByName(ctx context.Context, in *UpdateUser
func (c *userServiceClient) DeleteUser(ctx context.Context, in *DeleteUserByIdRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) {
out := new(emptypb.Empty)
err := c.cc.Invoke(ctx, "/panels.user.v1.UserService/DeleteUser", in, out, opts...)
err := c.cc.Invoke(ctx, UserService_DeleteUser_FullMethodName, in, out, opts...)
if err != nil {
return nil, err
}
@@ -96,7 +120,7 @@ func (c *userServiceClient) DeleteUser(ctx context.Context, in *DeleteUserByIdRe
func (c *userServiceClient) DeleteUserByName(ctx context.Context, in *DeleteUserByNameRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) {
out := new(emptypb.Empty)
err := c.cc.Invoke(ctx, "/panels.user.v1.UserService/DeleteUserByName", in, out, opts...)
err := c.cc.Invoke(ctx, UserService_DeleteUserByName_FullMethodName, in, out, opts...)
if err != nil {
return nil, err
}
@@ -165,7 +189,7 @@ func _UserService_CreateUser_Handler(srv interface{}, ctx context.Context, dec f
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/panels.user.v1.UserService/CreateUser",
FullMethod: UserService_CreateUser_FullMethodName,
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(UserServiceServer).CreateUser(ctx, req.(*CreateUserRequest))
@@ -183,7 +207,7 @@ func _UserService_GetUser_Handler(srv interface{}, ctx context.Context, dec func
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/panels.user.v1.UserService/GetUser",
FullMethod: UserService_GetUser_FullMethodName,
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(UserServiceServer).GetUser(ctx, req.(*GetUserByIdRequest))
@@ -201,7 +225,7 @@ func _UserService_GetUserByName_Handler(srv interface{}, ctx context.Context, de
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/panels.user.v1.UserService/GetUserByName",
FullMethod: UserService_GetUserByName_FullMethodName,
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(UserServiceServer).GetUserByName(ctx, req.(*GetUserByNameRequest))
@@ -219,7 +243,7 @@ func _UserService_UpdateUser_Handler(srv interface{}, ctx context.Context, dec f
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/panels.user.v1.UserService/UpdateUser",
FullMethod: UserService_UpdateUser_FullMethodName,
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(UserServiceServer).UpdateUser(ctx, req.(*UpdateUserByIdRequest))
@@ -237,7 +261,7 @@ func _UserService_UpdateUserByName_Handler(srv interface{}, ctx context.Context,
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/panels.user.v1.UserService/UpdateUserByName",
FullMethod: UserService_UpdateUserByName_FullMethodName,
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(UserServiceServer).UpdateUserByName(ctx, req.(*UpdateUserByNameRequest))
@@ -255,7 +279,7 @@ func _UserService_DeleteUser_Handler(srv interface{}, ctx context.Context, dec f
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/panels.user.v1.UserService/DeleteUser",
FullMethod: UserService_DeleteUser_FullMethodName,
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(UserServiceServer).DeleteUser(ctx, req.(*DeleteUserByIdRequest))
@@ -273,7 +297,7 @@ func _UserService_DeleteUserByName_Handler(srv interface{}, ctx context.Context,
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/panels.user.v1.UserService/DeleteUserByName",
FullMethod: UserService_DeleteUserByName_FullMethodName,
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(UserServiceServer).DeleteUserByName(ctx, req.(*DeleteUserByNameRequest))

View File

@@ -1,3 +1,17 @@
// Copyright 2023 Declan Teevan
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package main
import (
@@ -6,9 +20,9 @@ import (
"github.com/rs/zerolog"
"github.com/hexolan/panels/panel-service/internal"
"github.com/hexolan/panels/panel-service/internal/kafka"
"github.com/hexolan/panels/panel-service/internal/postgres"
"github.com/hexolan/panels/panel-service/internal/redis"
"github.com/hexolan/panels/panel-service/internal/kafka"
"github.com/hexolan/panels/panel-service/internal/rpc"
"github.com/hexolan/panels/panel-service/internal/service"
)

View File

@@ -1,12 +1,27 @@
//go:build tools
// Copyright 2023 Declan Teevan
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package main
import (
// Protobuf Generation
_ "google.golang.org/protobuf/cmd/protoc-gen-go"
_ "google.golang.org/grpc/cmd/protoc-gen-go-grpc"
_ "google.golang.org/protobuf/cmd/protoc-gen-go"
// DB Migrations
_ "github.com/golang-migrate/migrate/v4"
_ "github.com/golang-migrate/migrate/v4/database/postgres"
_ "github.com/golang-migrate/migrate/v4"
_ "github.com/golang-migrate/migrate/v4/database/postgres"
)

View File

@@ -1,8 +1,22 @@
// Copyright 2023 Declan Teevan
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package internal
import (
"os"
"fmt"
"os"
"strings"
"github.com/rs/zerolog"
@@ -24,10 +38,10 @@ func NewConfig() Config {
// Create the config
cfg := Config{
RedisHost: optFromEnvRequire("REDIS_HOST"),
RedisPass: optFromEnvRequire("REDIS_PASS"),
RedisHost: optFromEnvRequire("REDIS_HOST"),
RedisPass: optFromEnvRequire("REDIS_PASS"),
KafkaBrokers: kafkaBrokers,
LogLevel: logLvl,
LogLevel: logLvl,
}
// Assemble the Config.PostgresURL

View File

@@ -1,3 +1,17 @@
// Copyright 2023 Declan Teevan
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package internal
import (
@@ -10,7 +24,7 @@ import (
func NewServiceError(code ErrorCode, msg string) error {
return &ServiceError{
code: code,
msg: msg,
msg: msg,
}
}
@@ -20,8 +34,8 @@ func NewServiceErrorf(code ErrorCode, msg string, args ...interface{}) error {
func WrapServiceError(original_err error, code ErrorCode, msg string) error {
return &ServiceError{
code: code,
msg: msg,
code: code,
msg: msg,
original_err: original_err,
}
}
@@ -39,12 +53,12 @@ const (
func (c ErrorCode) GRPCCode() codes.Code {
codeMap := map[ErrorCode]codes.Code{
UnknownErrorCode: codes.Unknown,
NotFoundErrorCode: codes.NotFound,
ConflictErrorCode: codes.AlreadyExists,
ForbiddenErrorCode: codes.PermissionDenied,
UnknownErrorCode: codes.Unknown,
NotFoundErrorCode: codes.NotFound,
ConflictErrorCode: codes.AlreadyExists,
ForbiddenErrorCode: codes.PermissionDenied,
InvalidArgumentErrorCode: codes.InvalidArgument,
ConnectionErrorCode: codes.Unavailable,
ConnectionErrorCode: codes.Unavailable,
}
grpcCode, mapped := codeMap[c]
@@ -55,8 +69,8 @@ func (c ErrorCode) GRPCCode() codes.Code {
}
type ServiceError struct {
code ErrorCode
msg string
code ErrorCode
msg string
original_err error
}

View File

@@ -1,3 +1,17 @@
// Copyright 2023 Declan Teevan
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package kafka
import (
@@ -17,8 +31,8 @@ type PanelEventProducer struct {
func NewPanelEventProducer(cfg internal.Config) PanelEventProducer {
writer := &kafka.Writer{
Addr: kafka.TCP(cfg.KafkaBrokers...),
Topic: "panel",
Addr: kafka.TCP(cfg.KafkaBrokers...),
Topic: "panel",
Balancer: &kafka.LeastBytes{},
}

View File

@@ -1,3 +1,17 @@
// Copyright 2023 Declan Teevan
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package internal
import (
@@ -13,7 +27,7 @@ import (
type Panel struct {
Id int64 `json:"id"`
Name string `json:"name"`
Name string `json:"name"`
Description string `json:"description"`
CreatedAt pgtype.Timestamp `json:"created_at"`
@@ -34,7 +48,7 @@ func DestringifyPanelId(reprId string) (int64, error) {
// Model for creating panels
type PanelCreate struct {
Name string `json:"name"`
Name string `json:"name"`
Description string `json:"description"`
}
@@ -48,7 +62,7 @@ func (p *PanelCreate) Validate() error {
// Model for updating a panel
type PanelUpdate struct {
Name *string `json:"name,omitempty"`
Name *string `json:"name,omitempty"`
Description *string `json:"description,omitempty"`
}

View File

@@ -1,18 +1,32 @@
// Copyright 2023 Declan Teevan
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package postgres
import (
"context"
"encoding/json"
"errors"
"strings"
"encoding/json"
"github.com/rs/zerolog/log"
"github.com/doug-martin/goqu/v9"
_ "github.com/doug-martin/goqu/v9/dialect/postgres"
"github.com/jackc/pgerrcode"
"github.com/jackc/pgx/v5"
"github.com/jackc/pgx/v5/pgconn"
"github.com/jackc/pgx/v5/pgxpool"
"github.com/rs/zerolog/log"
"github.com/hexolan/panels/panel-service/internal"
)
@@ -40,7 +54,7 @@ func (r panelDatabaseRepo) transformToPatchData(data internal.PanelUpdate) goqu.
func (r panelDatabaseRepo) GetPanelIdFromName(ctx context.Context, name string) (*int64, error) {
var id int64
err := r.db.QueryRow(ctx, "SELECT id FROM panels WHERE LOWER(name)=LOWER($1)", name).Scan(&id)
if err != nil {
if err != nil {
if err == pgx.ErrNoRows {
return nil, internal.WrapServiceError(err, internal.NotFoundErrorCode, "panel not found")
} else if strings.Contains(err.Error(), "failed to connect to") {
@@ -76,7 +90,7 @@ func (r panelDatabaseRepo) GetPanel(ctx context.Context, id int64) (*internal.Pa
var panel internal.Panel
row := r.db.QueryRow(ctx, "SELECT id, name, description, created_at, updated_at FROM panels WHERE id=$1", id)
err := row.Scan(&panel.Id, &panel.Name, &panel.Description, &panel.CreatedAt, &panel.UpdatedAt)
if err != nil {
if err != nil {
if err == pgx.ErrNoRows {
return nil, internal.WrapServiceError(err, internal.NotFoundErrorCode, "panel not found")
} else if strings.Contains(err.Error(), "failed to connect to") {

View File

@@ -1,10 +1,24 @@
// Copyright 2023 Declan Teevan
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package postgres
import (
"context"
"github.com/rs/zerolog/log"
"github.com/jackc/pgx/v5/pgxpool"
"github.com/rs/zerolog/log"
"github.com/hexolan/panels/panel-service/internal"
)

View File

@@ -1,12 +1,26 @@
// Copyright 2023 Declan Teevan
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package redis
import (
"time"
"context"
"encoding/json"
"time"
"github.com/rs/zerolog/log"
"github.com/redis/go-redis/v9"
"github.com/rs/zerolog/log"
"github.com/hexolan/panels/panel-service/internal"
)
@@ -19,7 +33,7 @@ type panelCacheRepo struct {
func NewPanelRepository(rdb *redis.Client, repo internal.PanelRepository) internal.PanelRepository {
return panelCacheRepo{
rdb: rdb,
rdb: rdb,
repo: repo,
}
}
@@ -57,7 +71,7 @@ func (r panelCacheRepo) cachePanel(ctx context.Context, panel *internal.Panel) {
return
}
err = r.rdb.Set(ctx, internal.StringifyPanelId(panel.Id), string(value), 5 * time.Minute).Err()
err = r.rdb.Set(ctx, internal.StringifyPanelId(panel.Id), string(value), 5*time.Minute).Err()
if err != nil {
log.Error().Err(err).Msg("failed to cache panel")
return

View File

@@ -1,24 +1,38 @@
// Copyright 2023 Declan Teevan
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package redis
import (
"time"
"context"
"time"
"github.com/rs/zerolog/log"
"github.com/redis/go-redis/v9"
"github.com/rs/zerolog/log"
"github.com/hexolan/panels/panel-service/internal"
)
func NewRedisInterface(ctx context.Context, cfg internal.Config) *redis.Client {
rdb := redis.NewClient(&redis.Options{
Addr: cfg.RedisHost,
Password: cfg.RedisPass,
DB: 0,
rdb := redis.NewClient(&redis.Options{
Addr: cfg.RedisHost,
Password: cfg.RedisPass,
DB: 0,
DialTimeout: time.Millisecond * 250,
ReadTimeout: time.Millisecond * 500,
})
})
_, err := rdb.Ping(ctx).Result()
if err != nil {

View File

@@ -1,3 +1,17 @@
// Copyright 2023 Declan Teevan
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package rpc
import (

View File

@@ -11,10 +11,10 @@ import (
// Panel -> Protobuf 'Panel'
func PanelToProto(panel *internal.Panel) *Panel {
proto := Panel{
Id: internal.StringifyPanelId(panel.Id),
Name: panel.Name,
Id: internal.StringifyPanelId(panel.Id),
Name: panel.Name,
Description: panel.Description,
CreatedAt: timestamppb.New(panel.CreatedAt.Time),
CreatedAt: timestamppb.New(panel.CreatedAt.Time),
}
// convert nullable attributes to PB form (if present)
@@ -44,7 +44,7 @@ func PanelFromProto(proto *Panel) (*internal.Panel, error) {
// Protobuf 'PanelMutable' -> PanelCreate
func PanelCreateFromProto(proto *PanelMutable) internal.PanelCreate {
return internal.PanelCreate{
Name: proto.GetName(),
Name: proto.GetName(),
Description: proto.GetDescription(),
}
}
@@ -52,7 +52,7 @@ func PanelCreateFromProto(proto *PanelMutable) internal.PanelCreate {
// Protobuf 'PanelMutable' -> PanelUpdate
func PanelUpdateFromProto(proto *PanelMutable) internal.PanelUpdate {
return internal.PanelUpdate{
Name: proto.Name,
Name: proto.Name,
Description: proto.Description,
}
}

View File

@@ -1,6 +1,20 @@
// Copyright 2023 Declan Teevan
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// protoc-gen-go v1.28.1
// protoc-gen-go v1.31.0
// protoc v4.23.4
// source: panel.proto

View File

@@ -1,6 +1,20 @@
// Copyright 2023 Declan Teevan
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// Code generated by protoc-gen-go-grpc. DO NOT EDIT.
// versions:
// - protoc-gen-go-grpc v1.2.0
// - protoc-gen-go-grpc v1.3.0
// - protoc v4.23.4
// source: panel.proto
@@ -19,6 +33,16 @@ import (
// Requires gRPC-Go v1.32.0 or later.
const _ = grpc.SupportPackageIsVersion7
const (
PanelService_CreatePanel_FullMethodName = "/panels.panel.v1.PanelService/CreatePanel"
PanelService_GetPanel_FullMethodName = "/panels.panel.v1.PanelService/GetPanel"
PanelService_GetPanelByName_FullMethodName = "/panels.panel.v1.PanelService/GetPanelByName"
PanelService_UpdatePanel_FullMethodName = "/panels.panel.v1.PanelService/UpdatePanel"
PanelService_UpdatePanelByName_FullMethodName = "/panels.panel.v1.PanelService/UpdatePanelByName"
PanelService_DeletePanel_FullMethodName = "/panels.panel.v1.PanelService/DeletePanel"
PanelService_DeletePanelByName_FullMethodName = "/panels.panel.v1.PanelService/DeletePanelByName"
)
// PanelServiceClient is the client API for PanelService service.
//
// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.
@@ -42,7 +66,7 @@ func NewPanelServiceClient(cc grpc.ClientConnInterface) PanelServiceClient {
func (c *panelServiceClient) CreatePanel(ctx context.Context, in *CreatePanelRequest, opts ...grpc.CallOption) (*Panel, error) {
out := new(Panel)
err := c.cc.Invoke(ctx, "/panels.panel.v1.PanelService/CreatePanel", in, out, opts...)
err := c.cc.Invoke(ctx, PanelService_CreatePanel_FullMethodName, in, out, opts...)
if err != nil {
return nil, err
}
@@ -51,7 +75,7 @@ func (c *panelServiceClient) CreatePanel(ctx context.Context, in *CreatePanelReq
func (c *panelServiceClient) GetPanel(ctx context.Context, in *GetPanelByIdRequest, opts ...grpc.CallOption) (*Panel, error) {
out := new(Panel)
err := c.cc.Invoke(ctx, "/panels.panel.v1.PanelService/GetPanel", in, out, opts...)
err := c.cc.Invoke(ctx, PanelService_GetPanel_FullMethodName, in, out, opts...)
if err != nil {
return nil, err
}
@@ -60,7 +84,7 @@ func (c *panelServiceClient) GetPanel(ctx context.Context, in *GetPanelByIdReque
func (c *panelServiceClient) GetPanelByName(ctx context.Context, in *GetPanelByNameRequest, opts ...grpc.CallOption) (*Panel, error) {
out := new(Panel)
err := c.cc.Invoke(ctx, "/panels.panel.v1.PanelService/GetPanelByName", in, out, opts...)
err := c.cc.Invoke(ctx, PanelService_GetPanelByName_FullMethodName, in, out, opts...)
if err != nil {
return nil, err
}
@@ -69,7 +93,7 @@ func (c *panelServiceClient) GetPanelByName(ctx context.Context, in *GetPanelByN
func (c *panelServiceClient) UpdatePanel(ctx context.Context, in *UpdatePanelByIdRequest, opts ...grpc.CallOption) (*Panel, error) {
out := new(Panel)
err := c.cc.Invoke(ctx, "/panels.panel.v1.PanelService/UpdatePanel", in, out, opts...)
err := c.cc.Invoke(ctx, PanelService_UpdatePanel_FullMethodName, in, out, opts...)
if err != nil {
return nil, err
}
@@ -78,7 +102,7 @@ func (c *panelServiceClient) UpdatePanel(ctx context.Context, in *UpdatePanelByI
func (c *panelServiceClient) UpdatePanelByName(ctx context.Context, in *UpdatePanelByNameRequest, opts ...grpc.CallOption) (*Panel, error) {
out := new(Panel)
err := c.cc.Invoke(ctx, "/panels.panel.v1.PanelService/UpdatePanelByName", in, out, opts...)
err := c.cc.Invoke(ctx, PanelService_UpdatePanelByName_FullMethodName, in, out, opts...)
if err != nil {
return nil, err
}
@@ -87,7 +111,7 @@ func (c *panelServiceClient) UpdatePanelByName(ctx context.Context, in *UpdatePa
func (c *panelServiceClient) DeletePanel(ctx context.Context, in *DeletePanelByIdRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) {
out := new(emptypb.Empty)
err := c.cc.Invoke(ctx, "/panels.panel.v1.PanelService/DeletePanel", in, out, opts...)
err := c.cc.Invoke(ctx, PanelService_DeletePanel_FullMethodName, in, out, opts...)
if err != nil {
return nil, err
}
@@ -96,7 +120,7 @@ func (c *panelServiceClient) DeletePanel(ctx context.Context, in *DeletePanelByI
func (c *panelServiceClient) DeletePanelByName(ctx context.Context, in *DeletePanelByNameRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) {
out := new(emptypb.Empty)
err := c.cc.Invoke(ctx, "/panels.panel.v1.PanelService/DeletePanelByName", in, out, opts...)
err := c.cc.Invoke(ctx, PanelService_DeletePanelByName_FullMethodName, in, out, opts...)
if err != nil {
return nil, err
}
@@ -165,7 +189,7 @@ func _PanelService_CreatePanel_Handler(srv interface{}, ctx context.Context, dec
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/panels.panel.v1.PanelService/CreatePanel",
FullMethod: PanelService_CreatePanel_FullMethodName,
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(PanelServiceServer).CreatePanel(ctx, req.(*CreatePanelRequest))
@@ -183,7 +207,7 @@ func _PanelService_GetPanel_Handler(srv interface{}, ctx context.Context, dec fu
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/panels.panel.v1.PanelService/GetPanel",
FullMethod: PanelService_GetPanel_FullMethodName,
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(PanelServiceServer).GetPanel(ctx, req.(*GetPanelByIdRequest))
@@ -201,7 +225,7 @@ func _PanelService_GetPanelByName_Handler(srv interface{}, ctx context.Context,
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/panels.panel.v1.PanelService/GetPanelByName",
FullMethod: PanelService_GetPanelByName_FullMethodName,
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(PanelServiceServer).GetPanelByName(ctx, req.(*GetPanelByNameRequest))
@@ -219,7 +243,7 @@ func _PanelService_UpdatePanel_Handler(srv interface{}, ctx context.Context, dec
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/panels.panel.v1.PanelService/UpdatePanel",
FullMethod: PanelService_UpdatePanel_FullMethodName,
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(PanelServiceServer).UpdatePanel(ctx, req.(*UpdatePanelByIdRequest))
@@ -237,7 +261,7 @@ func _PanelService_UpdatePanelByName_Handler(srv interface{}, ctx context.Contex
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/panels.panel.v1.PanelService/UpdatePanelByName",
FullMethod: PanelService_UpdatePanelByName_FullMethodName,
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(PanelServiceServer).UpdatePanelByName(ctx, req.(*UpdatePanelByNameRequest))
@@ -255,7 +279,7 @@ func _PanelService_DeletePanel_Handler(srv interface{}, ctx context.Context, dec
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/panels.panel.v1.PanelService/DeletePanel",
FullMethod: PanelService_DeletePanel_FullMethodName,
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(PanelServiceServer).DeletePanel(ctx, req.(*DeletePanelByIdRequest))
@@ -273,7 +297,7 @@ func _PanelService_DeletePanelByName_Handler(srv interface{}, ctx context.Contex
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/panels.panel.v1.PanelService/DeletePanelByName",
FullMethod: PanelService_DeletePanelByName_FullMethodName,
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(PanelServiceServer).DeletePanelByName(ctx, req.(*DeletePanelByNameRequest))

View File

@@ -1,15 +1,29 @@
// Copyright 2023 Declan Teevan
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package rpc
import (
"net"
"context"
"net"
"github.com/grpc-ecosystem/go-grpc-middleware/v2/interceptors/logging"
"github.com/rs/zerolog"
"github.com/rs/zerolog/log"
"google.golang.org/grpc"
"google.golang.org/grpc/health"
"google.golang.org/grpc/health/grpc_health_v1"
"github.com/rs/zerolog"
"github.com/rs/zerolog/log"
"github.com/grpc-ecosystem/go-grpc-middleware/v2/interceptors/logging"
"github.com/hexolan/panels/panel-service/internal"
"github.com/hexolan/panels/panel-service/internal/rpc/panelv1"
@@ -47,16 +61,16 @@ func loggingInterceptor(logger zerolog.Logger) logging.Logger {
logger := logger.With().Fields(fields).Logger()
switch lvl {
case logging.LevelError:
logger.Error().Msg(msg)
case logging.LevelWarn:
logger.Warn().Msg(msg)
case logging.LevelInfo:
logger.Info().Msg(msg)
case logging.LevelDebug:
logger.Debug().Msg(msg)
default:
logger.Debug().Interface("unknown-log-level", lvl).Msg(msg)
case logging.LevelError:
logger.Error().Msg(msg)
case logging.LevelWarn:
logger.Warn().Msg(msg)
case logging.LevelInfo:
logger.Info().Msg(msg)
case logging.LevelDebug:
logger.Debug().Msg(msg)
default:
logger.Debug().Interface("unknown-log-level", lvl).Msg(msg)
}
})
}

View File

@@ -1,3 +1,17 @@
// Copyright 2023 Declan Teevan
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package service
import (
@@ -16,7 +30,7 @@ type panelService struct {
func NewPanelService(events kafka.PanelEventProducer, repo internal.PanelRepository) internal.PanelService {
return panelService{
events: events,
repo: repo,
repo: repo,
}
}

View File

@@ -1,3 +1,17 @@
// Copyright 2023 Declan Teevan
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package main
import (
@@ -6,10 +20,10 @@ import (
"github.com/rs/zerolog"
"github.com/hexolan/panels/post-service/internal"
"github.com/hexolan/panels/post-service/internal/postgres"
"github.com/hexolan/panels/post-service/internal/redis"
"github.com/hexolan/panels/post-service/internal/kafka"
"github.com/hexolan/panels/post-service/internal/kafka/producer"
"github.com/hexolan/panels/post-service/internal/postgres"
"github.com/hexolan/panels/post-service/internal/redis"
"github.com/hexolan/panels/post-service/internal/rpc"
"github.com/hexolan/panels/post-service/internal/service"
)

View File

@@ -1,12 +1,27 @@
//go:build tools
// Copyright 2023 Declan Teevan
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package main
import (
// Protobuf Generation
_ "google.golang.org/protobuf/cmd/protoc-gen-go"
_ "google.golang.org/grpc/cmd/protoc-gen-go-grpc"
_ "google.golang.org/protobuf/cmd/protoc-gen-go"
// DB Migrations
_ "github.com/golang-migrate/migrate/v4"
_ "github.com/golang-migrate/migrate/v4/database/postgres"
_ "github.com/golang-migrate/migrate/v4"
_ "github.com/golang-migrate/migrate/v4/database/postgres"
)

View File

@@ -1,8 +1,22 @@
// Copyright 2023 Declan Teevan
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package internal
import (
"os"
"fmt"
"os"
"strings"
"github.com/rs/zerolog"
@@ -24,10 +38,10 @@ func NewConfig() Config {
// Create the config
cfg := Config{
RedisHost: optFromEnvRequire("REDIS_HOST"),
RedisPass: optFromEnvRequire("REDIS_PASS"),
RedisHost: optFromEnvRequire("REDIS_HOST"),
RedisPass: optFromEnvRequire("REDIS_PASS"),
KafkaBrokers: kafkaBrokers,
LogLevel: logLvl,
LogLevel: logLvl,
}
// Assemble the Config.PostgresURL

View File

@@ -1,3 +1,17 @@
// Copyright 2023 Declan Teevan
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package internal
import (
@@ -10,7 +24,7 @@ import (
func NewServiceError(code ErrorCode, msg string) error {
return &ServiceError{
code: code,
msg: msg,
msg: msg,
}
}
@@ -20,8 +34,8 @@ func NewServiceErrorf(code ErrorCode, msg string, args ...interface{}) error {
func WrapServiceError(original_err error, code ErrorCode, msg string) error {
return &ServiceError{
code: code,
msg: msg,
code: code,
msg: msg,
original_err: original_err,
}
}
@@ -39,12 +53,12 @@ const (
func (c ErrorCode) GRPCCode() codes.Code {
codeMap := map[ErrorCode]codes.Code{
UnknownErrorCode: codes.Unknown,
NotFoundErrorCode: codes.NotFound,
ConflictErrorCode: codes.AlreadyExists,
ForbiddenErrorCode: codes.PermissionDenied,
UnknownErrorCode: codes.Unknown,
NotFoundErrorCode: codes.NotFound,
ConflictErrorCode: codes.AlreadyExists,
ForbiddenErrorCode: codes.PermissionDenied,
InvalidArgumentErrorCode: codes.InvalidArgument,
ConnectionErrorCode: codes.Unavailable,
ConnectionErrorCode: codes.Unavailable,
}
grpcCode, mapped := codeMap[c]
@@ -55,8 +69,8 @@ func (c ErrorCode) GRPCCode() codes.Code {
}
type ServiceError struct {
code ErrorCode
msg string
code ErrorCode
msg string
original_err error
}

View File

@@ -1,3 +1,17 @@
// Copyright 2023 Declan Teevan
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package consumers
import (
@@ -8,14 +22,14 @@ import (
"google.golang.org/protobuf/proto"
"github.com/hexolan/panels/post-service/internal"
"github.com/hexolan/panels/post-service/internal/kafka/producer"
"github.com/hexolan/panels/post-service/internal/kafka/consumers/panelv1"
"github.com/hexolan/panels/post-service/internal/kafka/producer"
)
type PanelEventConsumer struct {
reader *kafka.Reader
dbRepo internal.PostDBRepository
dbRepo internal.PostDBRepository
eventProd producer.PostEventProducer
}
@@ -24,9 +38,9 @@ func NewPanelEventConsumer(cfg internal.Config, dbRepo internal.PostDBRepository
reader: kafka.NewReader(kafka.ReaderConfig{
Brokers: cfg.KafkaBrokers,
GroupID: "post-service",
Topic: "panel",
Topic: "panel",
}),
dbRepo: dbRepo,
dbRepo: dbRepo,
eventProd: eventProd,
}
}

View File

@@ -1,6 +1,20 @@
// Copyright 2023 Declan Teevan
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// protoc-gen-go v1.28.1
// protoc-gen-go v1.31.0
// protoc v4.23.4
// source: panel.proto

View File

@@ -1,6 +1,20 @@
// Copyright 2023 Declan Teevan
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// Code generated by protoc-gen-go-grpc. DO NOT EDIT.
// versions:
// - protoc-gen-go-grpc v1.2.0
// - protoc-gen-go-grpc v1.3.0
// - protoc v4.23.4
// source: panel.proto
@@ -19,6 +33,16 @@ import (
// Requires gRPC-Go v1.32.0 or later.
const _ = grpc.SupportPackageIsVersion7
const (
PanelService_CreatePanel_FullMethodName = "/panels.panel.v1.PanelService/CreatePanel"
PanelService_GetPanel_FullMethodName = "/panels.panel.v1.PanelService/GetPanel"
PanelService_GetPanelByName_FullMethodName = "/panels.panel.v1.PanelService/GetPanelByName"
PanelService_UpdatePanel_FullMethodName = "/panels.panel.v1.PanelService/UpdatePanel"
PanelService_UpdatePanelByName_FullMethodName = "/panels.panel.v1.PanelService/UpdatePanelByName"
PanelService_DeletePanel_FullMethodName = "/panels.panel.v1.PanelService/DeletePanel"
PanelService_DeletePanelByName_FullMethodName = "/panels.panel.v1.PanelService/DeletePanelByName"
)
// PanelServiceClient is the client API for PanelService service.
//
// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.
@@ -42,7 +66,7 @@ func NewPanelServiceClient(cc grpc.ClientConnInterface) PanelServiceClient {
func (c *panelServiceClient) CreatePanel(ctx context.Context, in *CreatePanelRequest, opts ...grpc.CallOption) (*Panel, error) {
out := new(Panel)
err := c.cc.Invoke(ctx, "/panels.panel.v1.PanelService/CreatePanel", in, out, opts...)
err := c.cc.Invoke(ctx, PanelService_CreatePanel_FullMethodName, in, out, opts...)
if err != nil {
return nil, err
}
@@ -51,7 +75,7 @@ func (c *panelServiceClient) CreatePanel(ctx context.Context, in *CreatePanelReq
func (c *panelServiceClient) GetPanel(ctx context.Context, in *GetPanelByIdRequest, opts ...grpc.CallOption) (*Panel, error) {
out := new(Panel)
err := c.cc.Invoke(ctx, "/panels.panel.v1.PanelService/GetPanel", in, out, opts...)
err := c.cc.Invoke(ctx, PanelService_GetPanel_FullMethodName, in, out, opts...)
if err != nil {
return nil, err
}
@@ -60,7 +84,7 @@ func (c *panelServiceClient) GetPanel(ctx context.Context, in *GetPanelByIdReque
func (c *panelServiceClient) GetPanelByName(ctx context.Context, in *GetPanelByNameRequest, opts ...grpc.CallOption) (*Panel, error) {
out := new(Panel)
err := c.cc.Invoke(ctx, "/panels.panel.v1.PanelService/GetPanelByName", in, out, opts...)
err := c.cc.Invoke(ctx, PanelService_GetPanelByName_FullMethodName, in, out, opts...)
if err != nil {
return nil, err
}
@@ -69,7 +93,7 @@ func (c *panelServiceClient) GetPanelByName(ctx context.Context, in *GetPanelByN
func (c *panelServiceClient) UpdatePanel(ctx context.Context, in *UpdatePanelByIdRequest, opts ...grpc.CallOption) (*Panel, error) {
out := new(Panel)
err := c.cc.Invoke(ctx, "/panels.panel.v1.PanelService/UpdatePanel", in, out, opts...)
err := c.cc.Invoke(ctx, PanelService_UpdatePanel_FullMethodName, in, out, opts...)
if err != nil {
return nil, err
}
@@ -78,7 +102,7 @@ func (c *panelServiceClient) UpdatePanel(ctx context.Context, in *UpdatePanelByI
func (c *panelServiceClient) UpdatePanelByName(ctx context.Context, in *UpdatePanelByNameRequest, opts ...grpc.CallOption) (*Panel, error) {
out := new(Panel)
err := c.cc.Invoke(ctx, "/panels.panel.v1.PanelService/UpdatePanelByName", in, out, opts...)
err := c.cc.Invoke(ctx, PanelService_UpdatePanelByName_FullMethodName, in, out, opts...)
if err != nil {
return nil, err
}
@@ -87,7 +111,7 @@ func (c *panelServiceClient) UpdatePanelByName(ctx context.Context, in *UpdatePa
func (c *panelServiceClient) DeletePanel(ctx context.Context, in *DeletePanelByIdRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) {
out := new(emptypb.Empty)
err := c.cc.Invoke(ctx, "/panels.panel.v1.PanelService/DeletePanel", in, out, opts...)
err := c.cc.Invoke(ctx, PanelService_DeletePanel_FullMethodName, in, out, opts...)
if err != nil {
return nil, err
}
@@ -96,7 +120,7 @@ func (c *panelServiceClient) DeletePanel(ctx context.Context, in *DeletePanelByI
func (c *panelServiceClient) DeletePanelByName(ctx context.Context, in *DeletePanelByNameRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) {
out := new(emptypb.Empty)
err := c.cc.Invoke(ctx, "/panels.panel.v1.PanelService/DeletePanelByName", in, out, opts...)
err := c.cc.Invoke(ctx, PanelService_DeletePanelByName_FullMethodName, in, out, opts...)
if err != nil {
return nil, err
}
@@ -165,7 +189,7 @@ func _PanelService_CreatePanel_Handler(srv interface{}, ctx context.Context, dec
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/panels.panel.v1.PanelService/CreatePanel",
FullMethod: PanelService_CreatePanel_FullMethodName,
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(PanelServiceServer).CreatePanel(ctx, req.(*CreatePanelRequest))
@@ -183,7 +207,7 @@ func _PanelService_GetPanel_Handler(srv interface{}, ctx context.Context, dec fu
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/panels.panel.v1.PanelService/GetPanel",
FullMethod: PanelService_GetPanel_FullMethodName,
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(PanelServiceServer).GetPanel(ctx, req.(*GetPanelByIdRequest))
@@ -201,7 +225,7 @@ func _PanelService_GetPanelByName_Handler(srv interface{}, ctx context.Context,
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/panels.panel.v1.PanelService/GetPanelByName",
FullMethod: PanelService_GetPanelByName_FullMethodName,
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(PanelServiceServer).GetPanelByName(ctx, req.(*GetPanelByNameRequest))
@@ -219,7 +243,7 @@ func _PanelService_UpdatePanel_Handler(srv interface{}, ctx context.Context, dec
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/panels.panel.v1.PanelService/UpdatePanel",
FullMethod: PanelService_UpdatePanel_FullMethodName,
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(PanelServiceServer).UpdatePanel(ctx, req.(*UpdatePanelByIdRequest))
@@ -237,7 +261,7 @@ func _PanelService_UpdatePanelByName_Handler(srv interface{}, ctx context.Contex
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/panels.panel.v1.PanelService/UpdatePanelByName",
FullMethod: PanelService_UpdatePanelByName_FullMethodName,
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(PanelServiceServer).UpdatePanelByName(ctx, req.(*UpdatePanelByNameRequest))
@@ -255,7 +279,7 @@ func _PanelService_DeletePanel_Handler(srv interface{}, ctx context.Context, dec
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/panels.panel.v1.PanelService/DeletePanel",
FullMethod: PanelService_DeletePanel_FullMethodName,
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(PanelServiceServer).DeletePanel(ctx, req.(*DeletePanelByIdRequest))
@@ -273,7 +297,7 @@ func _PanelService_DeletePanelByName_Handler(srv interface{}, ctx context.Contex
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/panels.panel.v1.PanelService/DeletePanelByName",
FullMethod: PanelService_DeletePanelByName_FullMethodName,
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(PanelServiceServer).DeletePanelByName(ctx, req.(*DeletePanelByNameRequest))

View File

@@ -1,3 +1,17 @@
// Copyright 2023 Declan Teevan
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package consumers
import (
@@ -8,14 +22,14 @@ import (
"google.golang.org/protobuf/proto"
"github.com/hexolan/panels/post-service/internal"
"github.com/hexolan/panels/post-service/internal/kafka/producer"
"github.com/hexolan/panels/post-service/internal/kafka/consumers/userv1"
"github.com/hexolan/panels/post-service/internal/kafka/producer"
)
type UserEventConsumer struct {
reader *kafka.Reader
dbRepo internal.PostDBRepository
dbRepo internal.PostDBRepository
eventProd producer.PostEventProducer
}
@@ -24,7 +38,7 @@ func NewUserEventConsumer(cfg internal.Config, dbRepo internal.PostDBRepository,
reader: kafka.NewReader(kafka.ReaderConfig{
Brokers: cfg.KafkaBrokers,
GroupID: "post-service",
Topic: "user",
Topic: "user",
}),
dbRepo: dbRepo,
}

View File

@@ -1,6 +1,20 @@
// Copyright 2023 Declan Teevan
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// protoc-gen-go v1.28.1
// protoc-gen-go v1.31.0
// protoc v4.23.4
// source: user.proto

View File

@@ -1,6 +1,20 @@
// Copyright 2023 Declan Teevan
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// Code generated by protoc-gen-go-grpc. DO NOT EDIT.
// versions:
// - protoc-gen-go-grpc v1.2.0
// - protoc-gen-go-grpc v1.3.0
// - protoc v4.23.4
// source: user.proto
@@ -19,6 +33,16 @@ import (
// Requires gRPC-Go v1.32.0 or later.
const _ = grpc.SupportPackageIsVersion7
const (
UserService_CreateUser_FullMethodName = "/panels.user.v1.UserService/CreateUser"
UserService_GetUser_FullMethodName = "/panels.user.v1.UserService/GetUser"
UserService_GetUserByName_FullMethodName = "/panels.user.v1.UserService/GetUserByName"
UserService_UpdateUser_FullMethodName = "/panels.user.v1.UserService/UpdateUser"
UserService_UpdateUserByName_FullMethodName = "/panels.user.v1.UserService/UpdateUserByName"
UserService_DeleteUser_FullMethodName = "/panels.user.v1.UserService/DeleteUser"
UserService_DeleteUserByName_FullMethodName = "/panels.user.v1.UserService/DeleteUserByName"
)
// UserServiceClient is the client API for UserService service.
//
// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.
@@ -42,7 +66,7 @@ func NewUserServiceClient(cc grpc.ClientConnInterface) UserServiceClient {
func (c *userServiceClient) CreateUser(ctx context.Context, in *CreateUserRequest, opts ...grpc.CallOption) (*User, error) {
out := new(User)
err := c.cc.Invoke(ctx, "/panels.user.v1.UserService/CreateUser", in, out, opts...)
err := c.cc.Invoke(ctx, UserService_CreateUser_FullMethodName, in, out, opts...)
if err != nil {
return nil, err
}
@@ -51,7 +75,7 @@ func (c *userServiceClient) CreateUser(ctx context.Context, in *CreateUserReques
func (c *userServiceClient) GetUser(ctx context.Context, in *GetUserByIdRequest, opts ...grpc.CallOption) (*User, error) {
out := new(User)
err := c.cc.Invoke(ctx, "/panels.user.v1.UserService/GetUser", in, out, opts...)
err := c.cc.Invoke(ctx, UserService_GetUser_FullMethodName, in, out, opts...)
if err != nil {
return nil, err
}
@@ -60,7 +84,7 @@ func (c *userServiceClient) GetUser(ctx context.Context, in *GetUserByIdRequest,
func (c *userServiceClient) GetUserByName(ctx context.Context, in *GetUserByNameRequest, opts ...grpc.CallOption) (*User, error) {
out := new(User)
err := c.cc.Invoke(ctx, "/panels.user.v1.UserService/GetUserByName", in, out, opts...)
err := c.cc.Invoke(ctx, UserService_GetUserByName_FullMethodName, in, out, opts...)
if err != nil {
return nil, err
}
@@ -69,7 +93,7 @@ func (c *userServiceClient) GetUserByName(ctx context.Context, in *GetUserByName
func (c *userServiceClient) UpdateUser(ctx context.Context, in *UpdateUserByIdRequest, opts ...grpc.CallOption) (*User, error) {
out := new(User)
err := c.cc.Invoke(ctx, "/panels.user.v1.UserService/UpdateUser", in, out, opts...)
err := c.cc.Invoke(ctx, UserService_UpdateUser_FullMethodName, in, out, opts...)
if err != nil {
return nil, err
}
@@ -78,7 +102,7 @@ func (c *userServiceClient) UpdateUser(ctx context.Context, in *UpdateUserByIdRe
func (c *userServiceClient) UpdateUserByName(ctx context.Context, in *UpdateUserByNameRequest, opts ...grpc.CallOption) (*User, error) {
out := new(User)
err := c.cc.Invoke(ctx, "/panels.user.v1.UserService/UpdateUserByName", in, out, opts...)
err := c.cc.Invoke(ctx, UserService_UpdateUserByName_FullMethodName, in, out, opts...)
if err != nil {
return nil, err
}
@@ -87,7 +111,7 @@ func (c *userServiceClient) UpdateUserByName(ctx context.Context, in *UpdateUser
func (c *userServiceClient) DeleteUser(ctx context.Context, in *DeleteUserByIdRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) {
out := new(emptypb.Empty)
err := c.cc.Invoke(ctx, "/panels.user.v1.UserService/DeleteUser", in, out, opts...)
err := c.cc.Invoke(ctx, UserService_DeleteUser_FullMethodName, in, out, opts...)
if err != nil {
return nil, err
}
@@ -96,7 +120,7 @@ func (c *userServiceClient) DeleteUser(ctx context.Context, in *DeleteUserByIdRe
func (c *userServiceClient) DeleteUserByName(ctx context.Context, in *DeleteUserByNameRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) {
out := new(emptypb.Empty)
err := c.cc.Invoke(ctx, "/panels.user.v1.UserService/DeleteUserByName", in, out, opts...)
err := c.cc.Invoke(ctx, UserService_DeleteUserByName_FullMethodName, in, out, opts...)
if err != nil {
return nil, err
}
@@ -165,7 +189,7 @@ func _UserService_CreateUser_Handler(srv interface{}, ctx context.Context, dec f
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/panels.user.v1.UserService/CreateUser",
FullMethod: UserService_CreateUser_FullMethodName,
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(UserServiceServer).CreateUser(ctx, req.(*CreateUserRequest))
@@ -183,7 +207,7 @@ func _UserService_GetUser_Handler(srv interface{}, ctx context.Context, dec func
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/panels.user.v1.UserService/GetUser",
FullMethod: UserService_GetUser_FullMethodName,
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(UserServiceServer).GetUser(ctx, req.(*GetUserByIdRequest))
@@ -201,7 +225,7 @@ func _UserService_GetUserByName_Handler(srv interface{}, ctx context.Context, de
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/panels.user.v1.UserService/GetUserByName",
FullMethod: UserService_GetUserByName_FullMethodName,
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(UserServiceServer).GetUserByName(ctx, req.(*GetUserByNameRequest))
@@ -219,7 +243,7 @@ func _UserService_UpdateUser_Handler(srv interface{}, ctx context.Context, dec f
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/panels.user.v1.UserService/UpdateUser",
FullMethod: UserService_UpdateUser_FullMethodName,
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(UserServiceServer).UpdateUser(ctx, req.(*UpdateUserByIdRequest))
@@ -237,7 +261,7 @@ func _UserService_UpdateUserByName_Handler(srv interface{}, ctx context.Context,
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/panels.user.v1.UserService/UpdateUserByName",
FullMethod: UserService_UpdateUserByName_FullMethodName,
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(UserServiceServer).UpdateUserByName(ctx, req.(*UpdateUserByNameRequest))
@@ -255,7 +279,7 @@ func _UserService_DeleteUser_Handler(srv interface{}, ctx context.Context, dec f
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/panels.user.v1.UserService/DeleteUser",
FullMethod: UserService_DeleteUser_FullMethodName,
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(UserServiceServer).DeleteUser(ctx, req.(*DeleteUserByIdRequest))
@@ -273,7 +297,7 @@ func _UserService_DeleteUserByName_Handler(srv interface{}, ctx context.Context,
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/panels.user.v1.UserService/DeleteUserByName",
FullMethod: UserService_DeleteUserByName_FullMethodName,
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(UserServiceServer).DeleteUserByName(ctx, req.(*DeleteUserByNameRequest))

View File

@@ -1,19 +1,33 @@
// Copyright 2023 Declan Teevan
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package kafka
import (
"github.com/hexolan/panels/post-service/internal"
"github.com/hexolan/panels/post-service/internal/kafka/producer"
"github.com/hexolan/panels/post-service/internal/kafka/consumers"
"github.com/hexolan/panels/post-service/internal/kafka/producer"
)
type eventConsumers struct {
userEC consumers.UserEventConsumer
userEC consumers.UserEventConsumer
panelEC consumers.PanelEventConsumer
}
func NewEventConsumers(cfg internal.Config, dbRepo internal.PostDBRepository, eventProd producer.PostEventProducer) eventConsumers {
return eventConsumers{
userEC: consumers.NewUserEventConsumer(cfg, dbRepo, eventProd),
userEC: consumers.NewUserEventConsumer(cfg, dbRepo, eventProd),
panelEC: consumers.NewPanelEventConsumer(cfg, dbRepo, eventProd),
}
}

View File

@@ -1,3 +1,17 @@
// Copyright 2023 Declan Teevan
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package producer
import (
@@ -17,8 +31,8 @@ type PostEventProducer struct {
func NewPostEventProducer(cfg internal.Config) PostEventProducer {
writer := &kafka.Writer{
Addr: kafka.TCP(cfg.KafkaBrokers...),
Topic: "post",
Addr: kafka.TCP(cfg.KafkaBrokers...),
Topic: "post",
Balancer: &kafka.LeastBytes{},
}

View File

@@ -1,25 +1,39 @@
// Copyright 2023 Declan Teevan
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package internal
import (
"regexp"
"context"
"strconv"
"encoding/json"
"database/sql"
"database/sql/driver"
"encoding/json"
"regexp"
"strconv"
"github.com/jackc/pgx/v5/pgtype"
"github.com/go-ozzo/ozzo-validation/v4"
"github.com/jackc/pgx/v5/pgtype"
)
// Post Models
type Post struct {
Id PostId `json:"id"`
PanelId string `json:"panel_id"`
PanelId string `json:"panel_id"`
AuthorId string `json:"author_id"`
Title string `json:"title"`
Title string `json:"title"`
Content string `json:"content"`
CreatedAt pgtype.Timestamp `json:"created_at"`
@@ -27,7 +41,7 @@ type Post struct {
}
type PostCreate struct {
Title string `json:"title"`
Title string `json:"title"`
Content string `json:"content"`
}
@@ -40,7 +54,7 @@ func (p *PostCreate) Validate() error {
}
type PostUpdate struct {
Title *string `json:"title,omitempty"`
Title *string `json:"title,omitempty"`
Content *string `json:"content,omitempty"`
}
@@ -58,15 +72,15 @@ type PostService interface {
}
type PostRepository interface {
CreatePost(ctx context.Context, panelId string, authorId string, data PostCreate) (*Post, error)
GetPost(ctx context.Context, id PostId) (*Post, error)
GetPanelPost(ctx context.Context, id PostId, panelId string) (*Post, error)
UpdatePost(ctx context.Context, id PostId, data PostUpdate) (*Post, error)
DeletePost(ctx context.Context, id PostId) error
CreatePost(ctx context.Context, panelId string, authorId string, data PostCreate) (*Post, error)
GetPost(ctx context.Context, id PostId) (*Post, error)
GetPanelPost(ctx context.Context, id PostId, panelId string) (*Post, error)
UpdatePost(ctx context.Context, id PostId, data PostUpdate) (*Post, error)
DeletePost(ctx context.Context, id PostId) error
GetFeedPosts(ctx context.Context) ([]*Post, error)
GetUserPosts(ctx context.Context, userId string) ([]*Post, error)
GetPanelPosts(ctx context.Context, panelId string) ([]*Post, error)
GetFeedPosts(ctx context.Context) ([]*Post, error)
GetUserPosts(ctx context.Context, userId string) ([]*Post, error)
GetPanelPosts(ctx context.Context, panelId string) ([]*Post, error)
}
type PostDBRepository interface {

View File

@@ -1,15 +1,29 @@
// Copyright 2023 Declan Teevan
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package postgres
import (
"context"
"strings"
"encoding/json"
"strings"
"github.com/rs/zerolog/log"
"github.com/doug-martin/goqu/v9"
_ "github.com/doug-martin/goqu/v9/dialect/postgres"
"github.com/jackc/pgx/v5"
"github.com/jackc/pgx/v5/pgxpool"
"github.com/rs/zerolog/log"
"github.com/hexolan/panels/post-service/internal"
)
@@ -42,7 +56,7 @@ func (r postDatabaseRepo) GetPost(ctx context.Context, id internal.PostId) (*int
var post internal.Post
row := r.db.QueryRow(ctx, "SELECT id, panel_id, author_id, title, content, created_at, updated_at FROM posts WHERE id=$1", id)
err := row.Scan(&post.Id, &post.PanelId, &post.AuthorId, &post.Title, &post.Content, &post.CreatedAt, &post.UpdatedAt)
if err != nil {
if err != nil {
if err == pgx.ErrNoRows {
return nil, internal.WrapServiceError(err, internal.NotFoundErrorCode, "post not found")
} else if strings.Contains(err.Error(), "failed to connect to") {
@@ -59,7 +73,7 @@ func (r postDatabaseRepo) GetPanelPost(ctx context.Context, id internal.PostId,
var post internal.Post
row := r.db.QueryRow(ctx, "SELECT id, panel_id, author_id, title, content, created_at, updated_at FROM posts WHERE id=$1 AND panel_id=$2", id, panelId)
err := row.Scan(&post.Id, &post.PanelId, &post.AuthorId, &post.Title, &post.Content, &post.CreatedAt, &post.UpdatedAt)
if err != nil {
if err != nil {
if err == pgx.ErrNoRows {
return nil, internal.WrapServiceError(err, internal.NotFoundErrorCode, "post not found on that panel")
} else if strings.Contains(err.Error(), "failed to connect to") {
@@ -123,7 +137,7 @@ func (r postDatabaseRepo) DeletePost(ctx context.Context, id internal.PostId) er
func (r postDatabaseRepo) GetFeedPosts(ctx context.Context) ([]*internal.Post, error) {
// todo: pagination
rows, err := r.db.Query(ctx, "SELECT id, panel_id, author_id, title, content, created_at, updated_at FROM posts ORDER BY created_at DESC LIMIT 25")
if err != nil {
if err != nil {
if strings.Contains(err.Error(), "failed to connect to") {
return nil, internal.WrapServiceError(err, internal.ConnectionErrorCode, "failed to connect to database")
}
@@ -152,7 +166,7 @@ func (r postDatabaseRepo) GetFeedPosts(ctx context.Context) ([]*internal.Post, e
func (r postDatabaseRepo) GetUserPosts(ctx context.Context, userId string) ([]*internal.Post, error) {
// todo: pagination
rows, err := r.db.Query(ctx, "SELECT id, panel_id, author_id, title, content, created_at, updated_at FROM posts WHERE author_id=$1 ORDER BY created_at DESC LIMIT 25", userId)
if err != nil {
if err != nil {
if strings.Contains(err.Error(), "failed to connect to") {
return nil, internal.WrapServiceError(err, internal.ConnectionErrorCode, "failed to connect to database")
}
@@ -181,7 +195,7 @@ func (r postDatabaseRepo) GetUserPosts(ctx context.Context, userId string) ([]*i
func (r postDatabaseRepo) GetPanelPosts(ctx context.Context, panelId string) ([]*internal.Post, error) {
// todo: pagination
rows, err := r.db.Query(ctx, "SELECT id, panel_id, author_id, title, content, created_at, updated_at FROM posts WHERE panel_id=$1 ORDER BY created_at DESC LIMIT 25", panelId)
if err != nil {
if err != nil {
if strings.Contains(err.Error(), "failed to connect to") {
return nil, internal.WrapServiceError(err, internal.ConnectionErrorCode, "failed to connect to database")
}

View File

@@ -1,10 +1,24 @@
// Copyright 2023 Declan Teevan
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package postgres
import (
"context"
"github.com/rs/zerolog/log"
"github.com/jackc/pgx/v5/pgxpool"
"github.com/rs/zerolog/log"
"github.com/hexolan/panels/post-service/internal"
)

View File

@@ -1,12 +1,26 @@
// Copyright 2023 Declan Teevan
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package redis
import (
"time"
"context"
"encoding/json"
"time"
"github.com/rs/zerolog/log"
"github.com/redis/go-redis/v9"
"github.com/rs/zerolog/log"
"github.com/hexolan/panels/post-service/internal"
)
@@ -19,7 +33,7 @@ type postCacheRepo struct {
func NewPostRepository(rdb *redis.Client, repo internal.PostRepository) internal.PostRepository {
return postCacheRepo{
rdb: rdb,
rdb: rdb,
repo: repo,
}
}
@@ -50,7 +64,7 @@ func (r postCacheRepo) cachePost(ctx context.Context, post *internal.Post) {
return
}
err = r.rdb.Set(ctx, post.Id.GetReprId(), string(value), 2 * time.Minute).Err()
err = r.rdb.Set(ctx, post.Id.GetReprId(), string(value), 2*time.Minute).Err()
if err != nil {
log.Error().Err(err).Msg("failed to cache post")
return

View File

@@ -1,24 +1,38 @@
// Copyright 2023 Declan Teevan
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package redis
import (
"time"
"context"
"time"
"github.com/rs/zerolog/log"
"github.com/redis/go-redis/v9"
"github.com/rs/zerolog/log"
"github.com/hexolan/panels/post-service/internal"
)
func NewRedisInterface(ctx context.Context, cfg internal.Config) *redis.Client {
rdb := redis.NewClient(&redis.Options{
Addr: cfg.RedisHost,
Password: cfg.RedisPass,
DB: 0,
rdb := redis.NewClient(&redis.Options{
Addr: cfg.RedisHost,
Password: cfg.RedisPass,
DB: 0,
DialTimeout: time.Millisecond * 250,
ReadTimeout: time.Millisecond * 500,
})
})
_, err := rdb.Ping(ctx).Result()
if err != nil {

View File

@@ -1,3 +1,17 @@
// Copyright 2023 Declan Teevan
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package rpc
import (

View File

@@ -12,10 +12,10 @@ func PostToProto(post *internal.Post) *Post {
proto := Post{
Id: post.Id.GetReprId(),
PanelId: post.PanelId,
PanelId: post.PanelId,
AuthorId: post.AuthorId,
Title: post.Title,
Title: post.Title,
Content: post.Content,
CreatedAt: timestamppb.New(post.CreatedAt.Time),
@@ -41,7 +41,7 @@ func PostsToProto(posts []*internal.Post) []*Post {
// Protobuf 'PostMutable' -> PostCreate
func PostCreateFromProto(proto *PostMutable) internal.PostCreate {
return internal.PostCreate{
Title: proto.GetTitle(),
Title: proto.GetTitle(),
Content: proto.GetContent(),
}
}
@@ -49,7 +49,7 @@ func PostCreateFromProto(proto *PostMutable) internal.PostCreate {
// Protobuf 'PostMutable' -> PostUpdate
func PostUpdateFromProto(proto *PostMutable) internal.PostUpdate {
return internal.PostUpdate{
Title: proto.Title,
Title: proto.Title,
Content: proto.Content,
}
}

View File

@@ -1,6 +1,20 @@
// Copyright 2023 Declan Teevan
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// protoc-gen-go v1.28.1
// protoc-gen-go v1.31.0
// protoc v4.23.4
// source: post.proto

View File

@@ -1,6 +1,20 @@
// Copyright 2023 Declan Teevan
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// Code generated by protoc-gen-go-grpc. DO NOT EDIT.
// versions:
// - protoc-gen-go-grpc v1.2.0
// - protoc-gen-go-grpc v1.3.0
// - protoc v4.23.4
// source: post.proto
@@ -19,6 +33,17 @@ import (
// Requires gRPC-Go v1.32.0 or later.
const _ = grpc.SupportPackageIsVersion7
const (
PostService_CreatePost_FullMethodName = "/panels.post.v1.PostService/CreatePost"
PostService_GetPost_FullMethodName = "/panels.post.v1.PostService/GetPost"
PostService_GetPanelPost_FullMethodName = "/panels.post.v1.PostService/GetPanelPost"
PostService_UpdatePost_FullMethodName = "/panels.post.v1.PostService/UpdatePost"
PostService_DeletePost_FullMethodName = "/panels.post.v1.PostService/DeletePost"
PostService_GetFeedPosts_FullMethodName = "/panels.post.v1.PostService/GetFeedPosts"
PostService_GetUserPosts_FullMethodName = "/panels.post.v1.PostService/GetUserPosts"
PostService_GetPanelPosts_FullMethodName = "/panels.post.v1.PostService/GetPanelPosts"
)
// PostServiceClient is the client API for PostService service.
//
// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.
@@ -43,7 +68,7 @@ func NewPostServiceClient(cc grpc.ClientConnInterface) PostServiceClient {
func (c *postServiceClient) CreatePost(ctx context.Context, in *CreatePostRequest, opts ...grpc.CallOption) (*Post, error) {
out := new(Post)
err := c.cc.Invoke(ctx, "/panels.post.v1.PostService/CreatePost", in, out, opts...)
err := c.cc.Invoke(ctx, PostService_CreatePost_FullMethodName, in, out, opts...)
if err != nil {
return nil, err
}
@@ -52,7 +77,7 @@ func (c *postServiceClient) CreatePost(ctx context.Context, in *CreatePostReques
func (c *postServiceClient) GetPost(ctx context.Context, in *GetPostRequest, opts ...grpc.CallOption) (*Post, error) {
out := new(Post)
err := c.cc.Invoke(ctx, "/panels.post.v1.PostService/GetPost", in, out, opts...)
err := c.cc.Invoke(ctx, PostService_GetPost_FullMethodName, in, out, opts...)
if err != nil {
return nil, err
}
@@ -61,7 +86,7 @@ func (c *postServiceClient) GetPost(ctx context.Context, in *GetPostRequest, opt
func (c *postServiceClient) GetPanelPost(ctx context.Context, in *GetPanelPostRequest, opts ...grpc.CallOption) (*Post, error) {
out := new(Post)
err := c.cc.Invoke(ctx, "/panels.post.v1.PostService/GetPanelPost", in, out, opts...)
err := c.cc.Invoke(ctx, PostService_GetPanelPost_FullMethodName, in, out, opts...)
if err != nil {
return nil, err
}
@@ -70,7 +95,7 @@ func (c *postServiceClient) GetPanelPost(ctx context.Context, in *GetPanelPostRe
func (c *postServiceClient) UpdatePost(ctx context.Context, in *UpdatePostRequest, opts ...grpc.CallOption) (*Post, error) {
out := new(Post)
err := c.cc.Invoke(ctx, "/panels.post.v1.PostService/UpdatePost", in, out, opts...)
err := c.cc.Invoke(ctx, PostService_UpdatePost_FullMethodName, in, out, opts...)
if err != nil {
return nil, err
}
@@ -79,7 +104,7 @@ func (c *postServiceClient) UpdatePost(ctx context.Context, in *UpdatePostReques
func (c *postServiceClient) DeletePost(ctx context.Context, in *DeletePostRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) {
out := new(emptypb.Empty)
err := c.cc.Invoke(ctx, "/panels.post.v1.PostService/DeletePost", in, out, opts...)
err := c.cc.Invoke(ctx, PostService_DeletePost_FullMethodName, in, out, opts...)
if err != nil {
return nil, err
}
@@ -88,7 +113,7 @@ func (c *postServiceClient) DeletePost(ctx context.Context, in *DeletePostReques
func (c *postServiceClient) GetFeedPosts(ctx context.Context, in *GetFeedPostsRequest, opts ...grpc.CallOption) (*FeedPosts, error) {
out := new(FeedPosts)
err := c.cc.Invoke(ctx, "/panels.post.v1.PostService/GetFeedPosts", in, out, opts...)
err := c.cc.Invoke(ctx, PostService_GetFeedPosts_FullMethodName, in, out, opts...)
if err != nil {
return nil, err
}
@@ -97,7 +122,7 @@ func (c *postServiceClient) GetFeedPosts(ctx context.Context, in *GetFeedPostsRe
func (c *postServiceClient) GetUserPosts(ctx context.Context, in *GetUserPostsRequest, opts ...grpc.CallOption) (*UserPosts, error) {
out := new(UserPosts)
err := c.cc.Invoke(ctx, "/panels.post.v1.PostService/GetUserPosts", in, out, opts...)
err := c.cc.Invoke(ctx, PostService_GetUserPosts_FullMethodName, in, out, opts...)
if err != nil {
return nil, err
}
@@ -106,7 +131,7 @@ func (c *postServiceClient) GetUserPosts(ctx context.Context, in *GetUserPostsRe
func (c *postServiceClient) GetPanelPosts(ctx context.Context, in *GetPanelPostsRequest, opts ...grpc.CallOption) (*PanelPosts, error) {
out := new(PanelPosts)
err := c.cc.Invoke(ctx, "/panels.post.v1.PostService/GetPanelPosts", in, out, opts...)
err := c.cc.Invoke(ctx, PostService_GetPanelPosts_FullMethodName, in, out, opts...)
if err != nil {
return nil, err
}
@@ -179,7 +204,7 @@ func _PostService_CreatePost_Handler(srv interface{}, ctx context.Context, dec f
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/panels.post.v1.PostService/CreatePost",
FullMethod: PostService_CreatePost_FullMethodName,
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(PostServiceServer).CreatePost(ctx, req.(*CreatePostRequest))
@@ -197,7 +222,7 @@ func _PostService_GetPost_Handler(srv interface{}, ctx context.Context, dec func
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/panels.post.v1.PostService/GetPost",
FullMethod: PostService_GetPost_FullMethodName,
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(PostServiceServer).GetPost(ctx, req.(*GetPostRequest))
@@ -215,7 +240,7 @@ func _PostService_GetPanelPost_Handler(srv interface{}, ctx context.Context, dec
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/panels.post.v1.PostService/GetPanelPost",
FullMethod: PostService_GetPanelPost_FullMethodName,
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(PostServiceServer).GetPanelPost(ctx, req.(*GetPanelPostRequest))
@@ -233,7 +258,7 @@ func _PostService_UpdatePost_Handler(srv interface{}, ctx context.Context, dec f
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/panels.post.v1.PostService/UpdatePost",
FullMethod: PostService_UpdatePost_FullMethodName,
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(PostServiceServer).UpdatePost(ctx, req.(*UpdatePostRequest))
@@ -251,7 +276,7 @@ func _PostService_DeletePost_Handler(srv interface{}, ctx context.Context, dec f
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/panels.post.v1.PostService/DeletePost",
FullMethod: PostService_DeletePost_FullMethodName,
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(PostServiceServer).DeletePost(ctx, req.(*DeletePostRequest))
@@ -269,7 +294,7 @@ func _PostService_GetFeedPosts_Handler(srv interface{}, ctx context.Context, dec
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/panels.post.v1.PostService/GetFeedPosts",
FullMethod: PostService_GetFeedPosts_FullMethodName,
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(PostServiceServer).GetFeedPosts(ctx, req.(*GetFeedPostsRequest))
@@ -287,7 +312,7 @@ func _PostService_GetUserPosts_Handler(srv interface{}, ctx context.Context, dec
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/panels.post.v1.PostService/GetUserPosts",
FullMethod: PostService_GetUserPosts_FullMethodName,
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(PostServiceServer).GetUserPosts(ctx, req.(*GetUserPostsRequest))
@@ -305,7 +330,7 @@ func _PostService_GetPanelPosts_Handler(srv interface{}, ctx context.Context, de
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/panels.post.v1.PostService/GetPanelPosts",
FullMethod: PostService_GetPanelPosts_FullMethodName,
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(PostServiceServer).GetPanelPosts(ctx, req.(*GetPanelPostsRequest))

View File

@@ -1,15 +1,29 @@
// Copyright 2023 Declan Teevan
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package rpc
import (
"net"
"context"
"net"
"github.com/grpc-ecosystem/go-grpc-middleware/v2/interceptors/logging"
"github.com/rs/zerolog"
"github.com/rs/zerolog/log"
"google.golang.org/grpc"
"google.golang.org/grpc/health"
"google.golang.org/grpc/health/grpc_health_v1"
"github.com/rs/zerolog"
"github.com/rs/zerolog/log"
"github.com/grpc-ecosystem/go-grpc-middleware/v2/interceptors/logging"
"github.com/hexolan/panels/post-service/internal"
"github.com/hexolan/panels/post-service/internal/rpc/postv1"
@@ -47,16 +61,16 @@ func loggingInterceptor(logger zerolog.Logger) logging.Logger {
logger := logger.With().Fields(fields).Logger()
switch lvl {
case logging.LevelError:
logger.Error().Msg(msg)
case logging.LevelWarn:
logger.Warn().Msg(msg)
case logging.LevelInfo:
logger.Info().Msg(msg)
case logging.LevelDebug:
logger.Debug().Msg(msg)
default:
logger.Debug().Interface("unknown-log-level", lvl).Msg(msg)
case logging.LevelError:
logger.Error().Msg(msg)
case logging.LevelWarn:
logger.Warn().Msg(msg)
case logging.LevelInfo:
logger.Info().Msg(msg)
case logging.LevelDebug:
logger.Debug().Msg(msg)
default:
logger.Debug().Interface("unknown-log-level", lvl).Msg(msg)
}
})
}

View File

@@ -1,3 +1,17 @@
// Copyright 2023 Declan Teevan
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package service
import (
@@ -17,7 +31,7 @@ type postService struct {
func NewPostService(events producer.PostEventProducer, repo internal.PostRepository) internal.PostService {
return postService{
events: events,
repo: repo,
repo: repo,
}
}
@@ -44,7 +58,7 @@ func (srv postService) GetPost(ctx context.Context, id internal.PostId) (*intern
}
func (srv postService) GetPanelPost(ctx context.Context, id internal.PostId, panelId string) (*internal.Post, error) {
panelId = strings.ToLower(panelId) // Panel IDs are case insensitive
panelId = strings.ToLower(panelId) // Panel IDs are case insensitive
return srv.repo.GetPanelPost(ctx, id, panelId)
}

View File

@@ -2,7 +2,7 @@
"name": "user-service",
"description": "Panels - User Service",
"version": "1.0.0",
"author": "Declan <declan@hexolan.dev>",
"author": "Declan Teevan <dt@hexolan.com>",
"license": "Apache-2.0",
"main": "index.ts",
"scripts": {

View File

@@ -1,3 +1,17 @@
// Copyright 2023 Declan Teevan
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
function getMongoURI(): string {
if (process.env.MONGODB_URI === undefined) {
throw new Error("mongodb_uri configuration not provided");

Some files were not shown because too many files have changed in this diff Show More