mirror of
https://github.com/hexolan/panels.git
synced 2026-03-26 12:40:21 +00:00
style: license headers + gofmt
This commit is contained in:
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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": {
|
||||
|
||||
@@ -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 (
|
||||
@@ -16,4 +30,4 @@ func main() {
|
||||
// Serve the api.
|
||||
app := api.NewAPIApp(cfg)
|
||||
api.ServeAPIApp(app)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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"
|
||||
)
|
||||
|
||||
@@ -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
|
||||
@@ -38,4 +52,4 @@ func ServeAPIApp(app *fiber.App) {
|
||||
if err != nil {
|
||||
panic(fmt.Sprintf("failed to serve API: %v", err))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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,
|
||||
})
|
||||
}
|
||||
|
||||
@@ -56,4 +70,4 @@ func (tv tokenValidator) ValidateToken(c *fiber.Ctx, userToken string) (bool, er
|
||||
|
||||
c.Locals("tokenClaims", claims)
|
||||
return true, nil
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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})
|
||||
}
|
||||
|
||||
@@ -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) {
|
||||
@@ -36,10 +50,10 @@ func RegisterRoutes(app *fiber.App) {
|
||||
|
||||
panelV1.Get("/id/:panel_id/posts", v1.GetPanelPostsFromId)
|
||||
panelV1.Get("/name/:panel_name/posts", v1.GetPanelPostsFromName)
|
||||
|
||||
|
||||
panelV1.Get("/id/:panel_id/posts/:id", v1.GetPanelPostFromId)
|
||||
panelV1.Get("/name/:panel_name/posts/:id", v1.GetPanelPostFromName)
|
||||
|
||||
|
||||
panelV1.Post("/id/:panel_id", handlers.AuthMiddleware, v1.CreatePanelPostFromId)
|
||||
panelV1.Post("/name/:panel_name", handlers.AuthMiddleware, v1.CreatePanelPostFromName)
|
||||
|
||||
@@ -51,10 +65,10 @@ func RegisterRoutes(app *fiber.App) {
|
||||
|
||||
userV1.Get("/username/:username", v1.GetUserByUsername)
|
||||
userV1.Delete("/username/:username", handlers.AuthMiddleware, v1.DeleteUserByUsername)
|
||||
|
||||
|
||||
userV1.Get("/me", handlers.AuthMiddleware, v1.GetCurrentUser)
|
||||
userV1.Delete("/me", handlers.AuthMiddleware, v1.DeleteCurrentUser)
|
||||
|
||||
|
||||
// Auth Service Routes
|
||||
authV1.Post("/login", v1.LoginWithPassword)
|
||||
|
||||
@@ -63,4 +77,4 @@ func RegisterRoutes(app *fiber.App) {
|
||||
commentV1.Post("/", handlers.AuthMiddleware, v1.CreateComment)
|
||||
commentV1.Patch("/:id", handlers.AuthMiddleware, v1.UpdateComment)
|
||||
commentV1.Delete("/:id", handlers.AuthMiddleware, v1.DeleteComment)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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,8 +77,8 @@ func LoginWithPassword(c *fiber.Ctx) error {
|
||||
return c.JSON(fiber.Map{
|
||||
"status": "success",
|
||||
"data": fiber.Map{
|
||||
"user": user,
|
||||
"user": user,
|
||||
"token": token,
|
||||
},
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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")
|
||||
}
|
||||
|
||||
@@ -123,16 +137,16 @@ func CreateComment(c *fiber.Ctx) error {
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
|
||||
// Create the comment
|
||||
ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
|
||||
defer cancel()
|
||||
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 {
|
||||
@@ -140,4 +154,4 @@ func CreateComment(c *fiber.Ctx) error {
|
||||
}
|
||||
|
||||
return c.JSON(fiber.Map{"status": "success", "data": comment})
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -29,7 +43,7 @@ func getPanelIDFromName(name string) (string, error) {
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
|
||||
return panel.GetId(), nil
|
||||
}
|
||||
|
||||
@@ -76,7 +90,7 @@ func UpdatePanelById(c *fiber.Ctx) error {
|
||||
ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
|
||||
defer cancel()
|
||||
panel, err := rpc.Svcs.GetPanelSvc().UpdatePanel(
|
||||
ctx,
|
||||
ctx,
|
||||
&panelv1.UpdatePanelByIdRequest{Id: c.Params("id"), Data: patchData},
|
||||
)
|
||||
if err != nil {
|
||||
@@ -106,7 +120,7 @@ func UpdatePanelByName(c *fiber.Ctx) error {
|
||||
ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
|
||||
defer cancel()
|
||||
panel, err := rpc.Svcs.GetPanelSvc().UpdatePanelByName(
|
||||
ctx,
|
||||
ctx,
|
||||
&panelv1.UpdatePanelByNameRequest{Name: c.Params("name"), Data: patchData},
|
||||
)
|
||||
if err != nil {
|
||||
@@ -183,4 +197,4 @@ func CreatePanel(c *fiber.Ctx) error {
|
||||
}
|
||||
|
||||
return c.JSON(fiber.Map{"status": "success", "data": panel})
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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,10 +205,10 @@ 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")
|
||||
}
|
||||
|
||||
|
||||
// delete the post
|
||||
ctx, cancel := context.WithTimeout(context.Background(), 15*time.Second)
|
||||
defer cancel()
|
||||
@@ -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 {
|
||||
@@ -281,4 +295,4 @@ func CreatePanelPostFromName(c *fiber.Ctx) error {
|
||||
}
|
||||
|
||||
return c.JSON(fiber.Map{"status": "success", "data": post})
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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 {
|
||||
@@ -87,7 +101,7 @@ func DeleteUserById(c *fiber.Ctx) error {
|
||||
if currentUser.Id != c.Params("id") && !currentUser.IsAdmin {
|
||||
return fiber.NewError(fiber.StatusForbidden, "no permissions to delete that user")
|
||||
}
|
||||
|
||||
|
||||
// delete the user
|
||||
ctx, cancel := context.WithTimeout(context.Background(), 15*time.Second)
|
||||
defer cancel()
|
||||
@@ -113,7 +127,7 @@ func DeleteUserByUsername(c *fiber.Ctx) error {
|
||||
if currentUser.Id != c.Params("id") && !currentUser.IsAdmin {
|
||||
return fiber.NewError(fiber.StatusForbidden, "no permissions to delete that user")
|
||||
}
|
||||
|
||||
|
||||
// delete the user
|
||||
ctx, cancel := context.WithTimeout(context.Background(), 15*time.Second)
|
||||
defer cancel()
|
||||
@@ -155,7 +169,7 @@ func UserSignup(c *fiber.Ctx) error {
|
||||
if err := c.BodyParser(form); err != nil {
|
||||
fiber.NewError(fiber.StatusBadRequest, "malformed request")
|
||||
}
|
||||
|
||||
|
||||
// Attempt to create the user
|
||||
// todo: defer this logic away from gateway-service in future (potentially into seperate registration-service)
|
||||
ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
|
||||
@@ -189,8 +203,8 @@ func UserSignup(c *fiber.Ctx) error {
|
||||
return c.JSON(fiber.Map{
|
||||
"status": "success",
|
||||
"data": fiber.Map{
|
||||
"user": user,
|
||||
"user": user,
|
||||
"token": token,
|
||||
},
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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,11 +54,11 @@ 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
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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),
|
||||
}
|
||||
}
|
||||
@@ -61,4 +75,4 @@ func dialRPC(addr string) *grpc.ClientConn {
|
||||
}
|
||||
|
||||
return conn
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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"
|
||||
)
|
||||
@@ -34,4 +48,4 @@ func main() {
|
||||
// Create and serve RPC
|
||||
rpcServer := rpc.NewRPCServer(service)
|
||||
rpcServer.Serve()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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"
|
||||
)
|
||||
|
||||
@@ -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 internal
|
||||
|
||||
import (
|
||||
"os"
|
||||
"fmt"
|
||||
"os"
|
||||
"strings"
|
||||
|
||||
"github.com/rs/zerolog"
|
||||
"github.com/rs/zerolog/log"
|
||||
)
|
||||
|
||||
func NewConfig() Config {
|
||||
func NewConfig() Config {
|
||||
// Parse the log level
|
||||
logLvl, err := zerolog.ParseLevel(optFromEnvFallback("LOG_LEVEL", "info"))
|
||||
if err != nil {
|
||||
@@ -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
|
||||
@@ -86,4 +100,4 @@ func (cfg Config) GetPostgresURL() string {
|
||||
|
||||
func (cfg Config) GetLogLevel() zerolog.Level {
|
||||
return cfg.LogLevel
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -77,4 +91,4 @@ func (e ServiceError) GRPCStatus() *status.Status {
|
||||
|
||||
func (e ServiceError) Unwrap() error {
|
||||
return e.original_err
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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{},
|
||||
}
|
||||
|
||||
@@ -59,4 +73,4 @@ func (ep PanelEventProducer) DispatchDeletedEvent(id int64) {
|
||||
Type: "deleted",
|
||||
Data: &panelv1.Panel{Id: internal.StringifyPanelId(id)},
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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,9 +27,9 @@ 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"`
|
||||
UpdatedAt pgtype.Timestamp `json:"updated_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"`
|
||||
}
|
||||
|
||||
@@ -75,4 +89,4 @@ type PanelRepository interface {
|
||||
GetPanelIdFromName(ctx context.Context, name string) (*int64, error)
|
||||
UpdatePanel(ctx context.Context, id int64, data PanelUpdate) (*Panel, error)
|
||||
DeletePanel(ctx context.Context, id int64) error
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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") {
|
||||
@@ -137,4 +151,4 @@ func (r panelDatabaseRepo) DeletePanel(ctx context.Context, id int64) error {
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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"
|
||||
)
|
||||
@@ -14,11 +28,11 @@ func NewPostgresInterface(ctx context.Context, cfg internal.Config) *pgxpool.Poo
|
||||
if err != nil {
|
||||
log.Panic().Err(err).Caller().Msg("")
|
||||
}
|
||||
|
||||
|
||||
err = db.Ping(ctx)
|
||||
if err != nil {
|
||||
log.Warn().Err(err).Msg("failed Postgres ping")
|
||||
}
|
||||
|
||||
return db
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
@@ -120,4 +134,4 @@ func (r panelCacheRepo) DeletePanel(ctx context.Context, id int64) error {
|
||||
// Purge any cached version of the panel.
|
||||
r.purgeCachedPanel(ctx, id)
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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 {
|
||||
@@ -26,4 +40,4 @@ func NewRedisInterface(ctx context.Context, cfg internal.Config) *redis.Client {
|
||||
}
|
||||
|
||||
return rdb
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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 (
|
||||
@@ -13,7 +27,7 @@ import (
|
||||
|
||||
type panelServer struct {
|
||||
pb.UnimplementedPanelServiceServer
|
||||
|
||||
|
||||
service internal.PanelService
|
||||
}
|
||||
|
||||
@@ -29,7 +43,7 @@ func (svr *panelServer) CreatePanel(ctx context.Context, request *pb.CreatePanel
|
||||
|
||||
// Convert to business model
|
||||
data := pb.PanelCreateFromProto(request.GetData())
|
||||
|
||||
|
||||
// Attempt to create the panel
|
||||
panel, err := svr.service.CreatePanel(ctx, data)
|
||||
if err != nil {
|
||||
@@ -159,4 +173,4 @@ func (svr *panelServer) DeletePanelByName(ctx context.Context, request *pb.Delet
|
||||
return nil, err
|
||||
}
|
||||
return &emptypb.Empty{}, nil
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
})
|
||||
}
|
||||
@@ -67,11 +81,11 @@ func (r *RPCServer) Serve() {
|
||||
if err != nil {
|
||||
log.Panic().Err(err).Caller().Msg("failed to listen on RPC port (:9090)")
|
||||
}
|
||||
|
||||
|
||||
// Begin serving gRPC.
|
||||
log.Info().Str("address", lis.Addr().String()).Msg("attempting to serve RPC...")
|
||||
err = r.grpcSvr.Serve(lis)
|
||||
if err != nil {
|
||||
log.Panic().Err(err).Caller().Msg("failed to serve RPC")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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,
|
||||
}
|
||||
}
|
||||
|
||||
@@ -52,7 +66,7 @@ func (srv panelService) GetPanelByName(ctx context.Context, name string) (*inter
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
|
||||
// Pass to service method for GetPanel (by id).
|
||||
return srv.GetPanel(ctx, *id)
|
||||
}
|
||||
@@ -92,7 +106,7 @@ func (srv panelService) UpdatePanelByName(ctx context.Context, name string, data
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
|
||||
// Pass to service method for UpdatePanel (by id).
|
||||
return srv.UpdatePanel(ctx, *id, data)
|
||||
}
|
||||
@@ -123,4 +137,4 @@ func (srv panelService) DeletePanelByName(ctx context.Context, name string) erro
|
||||
|
||||
// Pass to service method for DeletePanel (by id).
|
||||
return srv.DeletePanel(ctx, *id)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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,17 +20,17 @@ 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"
|
||||
)
|
||||
|
||||
func main() {
|
||||
zerolog.TimeFieldFormat = zerolog.TimeFormatUnix
|
||||
|
||||
|
||||
// Load the configuration
|
||||
cfg := internal.NewConfig()
|
||||
zerolog.SetGlobalLevel(cfg.GetLogLevel())
|
||||
@@ -39,4 +53,4 @@ func main() {
|
||||
// Create and serve RPC
|
||||
rpcServer := rpc.NewRPCServer(service)
|
||||
rpcServer.Serve()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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"
|
||||
)
|
||||
|
||||
@@ -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 internal
|
||||
|
||||
import (
|
||||
"os"
|
||||
"fmt"
|
||||
"os"
|
||||
"strings"
|
||||
|
||||
"github.com/rs/zerolog"
|
||||
"github.com/rs/zerolog/log"
|
||||
)
|
||||
|
||||
func NewConfig() Config {
|
||||
func NewConfig() Config {
|
||||
// Parse the log level
|
||||
logLvl, err := zerolog.ParseLevel(optFromEnvFallback("LOG_LEVEL", "info"))
|
||||
if err != nil {
|
||||
@@ -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
|
||||
@@ -86,4 +100,4 @@ func (cfg Config) GetPostgresURL() string {
|
||||
|
||||
func (cfg Config) GetLogLevel() zerolog.Level {
|
||||
return cfg.LogLevel
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -77,4 +91,4 @@ func (e ServiceError) GRPCStatus() *status.Status {
|
||||
|
||||
func (e ServiceError) Unwrap() error {
|
||||
return e.original_err
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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,
|
||||
}
|
||||
}
|
||||
@@ -42,7 +56,7 @@ func (ec PanelEventConsumer) ProcessEvent(evt *panelv1.PanelEvent) {
|
||||
if err == nil {
|
||||
for _, postId := range postIds {
|
||||
ec.eventProd.DispatchDeletedEvent(postId)
|
||||
}
|
||||
}
|
||||
}
|
||||
log.Debug().Str("src", "panel-event-consumer").Any("event", evt).Msg("processed panel deleted event")
|
||||
}
|
||||
@@ -73,4 +87,4 @@ func (ec PanelEventConsumer) Start() {
|
||||
if err := ec.reader.Close(); err != nil {
|
||||
log.Panic().Err(err).Str("src", "panel-event-consumer").Msg("failed to close Kafka reader")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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,
|
||||
}
|
||||
@@ -72,4 +86,4 @@ func (ec UserEventConsumer) Start() {
|
||||
if err := ec.reader.Close(); err != nil {
|
||||
log.Panic().Err(err).Str("src", "user-event-consumer").Msg("failed to close Kafka reader")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -1,23 +1,37 @@
|
||||
// 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),
|
||||
}
|
||||
}
|
||||
|
||||
func (ecs eventConsumers) Start() {
|
||||
go ecs.panelEC.Start()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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{},
|
||||
}
|
||||
|
||||
@@ -57,4 +71,4 @@ func (ep PostEventProducer) DispatchDeletedEvent(id internal.PostId) {
|
||||
Type: "deleted",
|
||||
Data: &postv1.Post{Id: id.GetReprId()},
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,33 +1,47 @@
|
||||
// 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"
|
||||
|
||||
"github.com/jackc/pgx/v5/pgtype"
|
||||
"encoding/json"
|
||||
"regexp"
|
||||
"strconv"
|
||||
|
||||
"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"`
|
||||
UpdatedAt pgtype.Timestamp `json:"updated_at"`
|
||||
}
|
||||
|
||||
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 {
|
||||
@@ -159,4 +173,4 @@ func NewPostIdFromRepr(reprId string) (*PostId, error) {
|
||||
func getIdFromRepr(reprId string) (*int64, error) {
|
||||
id, err := strconv.ParseInt(reprId, 36, 64)
|
||||
return &id, err
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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") {
|
||||
@@ -77,7 +91,7 @@ func (r postDatabaseRepo) UpdatePost(ctx context.Context, id internal.PostId, da
|
||||
patchData := goqu.Record{"updated_at": goqu.L("timezone('utc', now())")}
|
||||
marshalled, _ := json.Marshal(data)
|
||||
_ = json.Unmarshal(marshalled, &patchData)
|
||||
|
||||
|
||||
// Build a statement to updated the post
|
||||
statement, args, _ := goqu.Dialect("postgres").Update("posts").Prepared(true).Set(patchData).Where(goqu.C("id").Eq(id)).ToSQL()
|
||||
|
||||
@@ -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")
|
||||
}
|
||||
@@ -259,4 +273,4 @@ func (r postDatabaseRepo) DeletePostsOnPanel(ctx context.Context, panelId string
|
||||
}
|
||||
|
||||
return deletedIds, nil
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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"
|
||||
)
|
||||
@@ -14,11 +28,11 @@ func NewPostgresInterface(ctx context.Context, cfg internal.Config) *pgxpool.Poo
|
||||
if err != nil {
|
||||
log.Panic().Err(err).Caller().Msg("")
|
||||
}
|
||||
|
||||
|
||||
err = db.Ping(ctx)
|
||||
if err != nil {
|
||||
log.Warn().Err(err).Msg("failed Postgres ping")
|
||||
}
|
||||
|
||||
return db
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
@@ -148,4 +162,4 @@ func (r postCacheRepo) GetUserPosts(ctx context.Context, userId string) ([]*inte
|
||||
|
||||
func (r postCacheRepo) GetPanelPosts(ctx context.Context, panelId string) ([]*internal.Post, error) {
|
||||
return r.repo.GetPanelPosts(ctx, panelId)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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 {
|
||||
@@ -26,4 +40,4 @@ func NewRedisInterface(ctx context.Context, cfg internal.Config) *redis.Client {
|
||||
}
|
||||
|
||||
return rdb
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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 (
|
||||
@@ -13,7 +27,7 @@ import (
|
||||
|
||||
type postServer struct {
|
||||
pb.UnimplementedPostServiceServer
|
||||
|
||||
|
||||
service internal.PostService
|
||||
}
|
||||
|
||||
@@ -37,7 +51,7 @@ func (svr *postServer) CreatePost(ctx context.Context, request *pb.CreatePostReq
|
||||
|
||||
// Convert to service model
|
||||
data := pb.PostCreateFromProto(request.GetData())
|
||||
|
||||
|
||||
// Pass to service method for creation
|
||||
post, err := svr.service.CreatePost(ctx, request.GetPanelId(), request.GetUserId(), data)
|
||||
if err != nil {
|
||||
@@ -176,4 +190,4 @@ func (svr *postServer) GetPanelPosts(ctx context.Context, request *pb.GetPanelPo
|
||||
}
|
||||
|
||||
return &pb.PanelPosts{Posts: pb.PostsToProto(posts)}, nil
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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),
|
||||
@@ -36,12 +36,12 @@ func PostsToProto(posts []*internal.Post) []*Post {
|
||||
protoPosts = append(protoPosts, PostToProto(post))
|
||||
}
|
||||
return protoPosts
|
||||
}
|
||||
}
|
||||
|
||||
// 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,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
})
|
||||
}
|
||||
@@ -67,11 +81,11 @@ func (r *RPCServer) Serve() {
|
||||
if err != nil {
|
||||
log.Panic().Err(err).Caller().Msg("failed to listen on RPC port (:9090)")
|
||||
}
|
||||
|
||||
|
||||
// Begin serving RPC
|
||||
log.Info().Str("address", lis.Addr().String()).Msg("Attempting to serve RPC...")
|
||||
err = r.grpcSvr.Serve(lis)
|
||||
if err != nil {
|
||||
log.Panic().Err(err).Caller().Msg("failed to serve RPC")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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,
|
||||
}
|
||||
}
|
||||
|
||||
@@ -30,7 +44,7 @@ func (srv postService) CreatePost(ctx context.Context, panelId string, authorId
|
||||
|
||||
// Create the post
|
||||
post, err := srv.repo.CreatePost(ctx, panelId, authorId, data)
|
||||
|
||||
|
||||
// Dispatch post created event
|
||||
if err == nil {
|
||||
srv.events.DispatchCreatedEvent(post)
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
@@ -72,7 +86,7 @@ func (srv postService) UpdatePost(ctx context.Context, id internal.PostId, data
|
||||
|
||||
func (srv postService) DeletePost(ctx context.Context, id internal.PostId) error {
|
||||
err := srv.repo.DeletePost(ctx, id)
|
||||
|
||||
|
||||
// Dispatch post deleted event
|
||||
if err == nil {
|
||||
srv.events.DispatchDeletedEvent(id)
|
||||
@@ -91,4 +105,4 @@ func (srv postService) GetUserPosts(ctx context.Context, userId string) ([]*inte
|
||||
|
||||
func (srv postService) GetPanelPosts(ctx context.Context, panelId string) ([]*internal.Post, error) {
|
||||
return srv.repo.GetPanelPosts(ctx, panelId)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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": {
|
||||
|
||||
@@ -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");
|
||||
|
||||
@@ -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 { Kafka, Message, Producer } from "kafkajs";
|
||||
|
||||
import { kafkaBrokers } from "../config";
|
||||
|
||||
@@ -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 mongoose from "mongoose";
|
||||
|
||||
import { mongodbUri } from "./config";
|
||||
|
||||
@@ -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 { Document, Schema, model } from "mongoose";
|
||||
import uniqueValidator from "mongoose-unique-validator";
|
||||
|
||||
|
||||
@@ -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 { Timestamp } from "@bufbuild/protobuf";
|
||||
|
||||
import { User as ProtoUser } from "../proto/user_pb";
|
||||
|
||||
@@ -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.
|
||||
|
||||
// @generated by protoc-gen-connect-es v0.13.2 with parameter "target=ts"
|
||||
// @generated from file user.proto (package panels.user.v1, syntax proto3)
|
||||
/* eslint-disable */
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user