Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions .github/copilot-instructions.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,14 @@ Always reference these instructions first and fallback to search or bash command

## Working Effectively

### Environment Manager:
- **Package Manager**: Uses `uv` for dependency and virtual environment management
- **Activate Environment**: Always use `source .venv/bin/activate` before running any Python commands
- **Install Dependencies**: `uv pip install -e .` or `pip install -e .` (within activated venv)
- **All Python/pip commands must be run within activated venv**

### Bootstrap, Build, and Test Repository:
- `source .venv/bin/activate` -- activate the uv-managed virtual environment FIRST
- `pip install -e .` -- installs the package in development mode. NEVER CANCEL: Takes 10-60 seconds, may timeout due to network issues. Set timeout to 120+ seconds (extra margin for slow mirrors or network issues).
- `pip install coverage pre-commit pytest pytest-cov pytest-dotenv ruff grpcio-tools` -- installs development dependencies. NEVER CANCEL: Takes 30-120 seconds. Set timeout to 180+ seconds (extra margin for slow mirrors or network issues).
- `python -m pytest tests/ -v` -- runs unit tests (when tests are available)
Expand Down Expand Up @@ -121,10 +128,12 @@ tp-auth-serverside/

### gRPC and Protocol Buffer Development:
- **Protobuf Compilation**: `python -m grpc_tools.protoc --proto_path=protos --python_out=src/tp_auth_serverside/pb --grpc_python_out=src/tp_auth_serverside/pb protos/refresh.proto`
- **After Generation**: Manually fix the import in `refresh_pb2_grpc.py` to use absolute import: `from tp_auth_serverside.pb import refresh_pb2 as refresh__pb2`
- **Generated Files**: Located in `src/tp_auth_serverside/pb/` (refresh_pb2.py, refresh_pb2_grpc.py)
- **Service Implementation**: `RefreshHandler` class in `src/tp_auth_serverside/core/handler/refresh_handler.py`
- **Testing gRPC**: Requires starting both Redis and gRPC server for integration tests
- **Proto Schema**: `protos/refresh.proto` defines the RefreshService interface
- **No External Proto Dependencies**: Package uses custom `RefreshResponse` message instead of `google.protobuf.Empty` to avoid external dependencies

## Database Types and Testing

Expand Down
21 changes: 0 additions & 21 deletions protos/google/protobuf/empty.proto

This file was deleted.

8 changes: 5 additions & 3 deletions protos/refresh.proto
Original file line number Diff line number Diff line change
@@ -1,14 +1,16 @@
syntax = "proto3";

import "google/protobuf/empty.proto";

package refresh;

message RefreshRequest {
string user_id = 1;
string token = 2;
}

message RefreshResponse {
// Empty response - no fields needed
}

service RefreshService {
rpc RefreshToken (RefreshRequest) returns (google.protobuf.Empty);
rpc RefreshToken (RefreshRequest) returns (RefreshResponse);
}
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[project]
name = "tp-auth-serverside"
version = "0.1.3"
version = "0.1.4"
description = "A server side authentication utility which stores session tokens in memory db."
readme = "README.md"
requires-python = ">=3.13"
Expand Down
9 changes: 4 additions & 5 deletions src/tp_auth_serverside/core/handler/refresh_handler.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,8 @@
import logging

from google.protobuf import empty_pb2

from tp_auth_serverside.db.memorydb.login import get_token, set_token
from tp_auth_serverside.db.memorydb.refresh import is_refresh_restricted, set_restrict_refresh
from tp_auth_serverside.pb import refresh_pb2
from tp_auth_serverside.pb.refresh_pb2_grpc import RefreshServiceServicer
from tp_auth_serverside.utilities.jwt_util import JWTUtil

Expand All @@ -14,10 +13,10 @@ async def RefreshToken(self, request, context):
token = request.token
if await is_refresh_restricted(user_id, token):
logging.warning(f"Refresh token is restricted for user_id: {user_id}, token: {token}")
return empty_pb2.Empty()
return refresh_pb2.RefreshResponse()
jwt_token = await get_token(user_id, token)
if not jwt_token:
return empty_pb2.Empty()
return refresh_pb2.RefreshResponse()
jwt_util = JWTUtil()
try:
logging.info(f"Refreshing token for user_id: {user_id}, token: {token}")
Expand All @@ -27,4 +26,4 @@ async def RefreshToken(self, request, context):
await set_restrict_refresh(user_id, token)
except Exception as e:
logging.error(f"Error refreshing token for user_id: {user_id}, token: {token}, error: {e}")
return empty_pb2.Empty()
return refresh_pb2.RefreshResponse()
12 changes: 7 additions & 5 deletions src/tp_auth_serverside/pb/refresh_pb2.py

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

9 changes: 4 additions & 5 deletions src/tp_auth_serverside/pb/refresh_pb2_grpc.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,8 @@
"""Client and server classes corresponding to protobuf-defined services."""

import grpc
from google.protobuf import empty_pb2 as google_dot_protobuf_dot_empty__pb2

import tp_auth_serverside.pb.refresh_pb2 as refresh__pb2
from tp_auth_serverside.pb import refresh_pb2 as refresh__pb2

GRPC_GENERATED_VERSION = "1.75.1"
GRPC_VERSION = grpc.__version__
Expand Down Expand Up @@ -39,7 +38,7 @@ def __init__(self, channel):
self.RefreshToken = channel.unary_unary(
"/refresh.RefreshService/RefreshToken",
request_serializer=refresh__pb2.RefreshRequest.SerializeToString,
response_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
response_deserializer=refresh__pb2.RefreshResponse.FromString,
_registered_method=True,
)

Expand All @@ -59,7 +58,7 @@ def add_RefreshServiceServicer_to_server(servicer, server):
"RefreshToken": grpc.unary_unary_rpc_method_handler(
servicer.RefreshToken,
request_deserializer=refresh__pb2.RefreshRequest.FromString,
response_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
response_serializer=refresh__pb2.RefreshResponse.SerializeToString,
),
}
generic_handler = grpc.method_handlers_generic_handler("refresh.RefreshService", rpc_method_handlers)
Expand Down Expand Up @@ -89,7 +88,7 @@ def RefreshToken(
target,
"/refresh.RefreshService/RefreshToken",
refresh__pb2.RefreshRequest.SerializeToString,
google_dot_protobuf_dot_empty__pb2.Empty.FromString,
refresh__pb2.RefreshResponse.FromString,
options,
channel_credentials,
insecure,
Expand Down