rename column in logs table, add coverters

This commit is contained in:
Evgenii Alekseev 2025-03-08 16:26:58 +02:00
parent 713cc63a0f
commit 631e572d60
8 changed files with 63 additions and 34 deletions

View File

@ -24,4 +24,7 @@ steps = [
""" """
alter table logs add column process_id text not null default '' alter table logs add column process_id text not null default ''
""", """,
"""
alter table logs rename column record to message
""",
] ]

View File

@ -21,7 +21,6 @@ from sqlite3 import Connection
from ahriman.core.database.operations.operations import Operations from ahriman.core.database.operations.operations import Operations
from ahriman.models.log_record import LogRecord from ahriman.models.log_record import LogRecord
from ahriman.models.log_record_id import LogRecordId
from ahriman.models.repository_id import RepositoryId from ahriman.models.repository_id import RepositoryId
@ -48,10 +47,10 @@ class LogsOperations(Operations):
def run(connection: Connection) -> list[LogRecord]: def run(connection: Connection) -> list[LogRecord]:
return [ return [
LogRecord(LogRecordId(package_base, row["version"], row["process_id"]), row["created"], row["record"]) LogRecord.from_json(package_base, row)
for row in connection.execute( for row in connection.execute(
""" """
select created, record, version, process_id from ( select created, message, version, process_id from (
select * from logs select * from logs
where package_base = :package_base and repository = :repository where package_base = :package_base and repository = :repository
order by created desc limit :limit offset :offset order by created desc limit :limit offset :offset
@ -81,18 +80,14 @@ class LogsOperations(Operations):
connection.execute( connection.execute(
""" """
insert into logs insert into logs
(package_base, version, created, record, repository, process_id) (package_base, version, created, message, repository, process_id)
values values
(:package_base, :version, :created, :record, :repository, :process_id) (:package_base, :version, :created, :message, :repository, :process_id)
""", """,
{ {
"package_base": log_record.log_record_id.package_base, "package_base": log_record.log_record_id.package_base,
"version": log_record.log_record_id.version,
"created": log_record.created,
"record": log_record.message,
"repository": repository_id.id, "repository": repository_id.id,
"process_id": log_record.log_record_id.process_id, } | log_record.view()
}
) )
return self.with_connection(run, commit=True) return self.with_connection(run, commit=True)

View File

@ -30,7 +30,6 @@ from ahriman.models.dependencies import Dependencies
from ahriman.models.event import Event, EventType from ahriman.models.event import Event, EventType
from ahriman.models.internal_status import InternalStatus from ahriman.models.internal_status import InternalStatus
from ahriman.models.log_record import LogRecord from ahriman.models.log_record import LogRecord
from ahriman.models.log_record_id import LogRecordId
from ahriman.models.package import Package from ahriman.models.package import Package
from ahriman.models.pkgbuild_patch import PkgbuildPatch from ahriman.models.pkgbuild_patch import PkgbuildPatch
from ahriman.models.repository_id import RepositoryId from ahriman.models.repository_id import RepositoryId
@ -345,13 +344,7 @@ class WebClient(Client, SyncAhrimanClient):
response = self.make_request("GET", self._logs_url(package_base), params=query) response = self.make_request("GET", self._logs_url(package_base), params=query)
response_json = response.json() response_json = response.json()
return [ return [LogRecord.from_json(package_base, record) for record in response_json]
LogRecord(
LogRecordId(package_base, record["version"], record["process_id"]),
record["created"],
record["message"]
) for record in response_json
]
return [] return []

View File

@ -78,7 +78,7 @@ class Event:
dump(dict[str, Any]): json dump body dump(dict[str, Any]): json dump body
Returns: Returns:
Self: dependencies object Self: event object
""" """
return cls( return cls(
event=dump["event"], event=dump["event"],

View File

@ -18,6 +18,7 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>. # along with this program. If not, see <http://www.gnu.org/licenses/>.
# #
from dataclasses import dataclass from dataclasses import dataclass
from typing import Any, Self
from ahriman.models.log_record_id import LogRecordId from ahriman.models.log_record_id import LogRecordId
@ -36,3 +37,40 @@ class LogRecord:
log_record_id: LogRecordId log_record_id: LogRecordId
created: float created: float
message: str message: str
@classmethod
def from_json(cls, package_base: str, dump: dict[str, Any]) -> Self:
"""
construct log record from the json dump
Args:
package_base(str): package base for which log record belongs
dump(dict[str, Any]): json dump body
Returns:
Self: log record object
"""
if "process_id" in dump:
log_record_id = LogRecordId(package_base, dump["version"], dump["process_id"])
else:
log_record_id = LogRecordId(package_base, dump["version"])
return cls(
log_record_id=log_record_id,
created=dump["created"],
message=dump["message"],
)
def view(self) -> dict[str, Any]:
"""
generate json log record view
Returns:
dict[str, Any]: json-friendly dictionary
"""
return {
"created": self.created,
"message": self.message,
"version": self.log_record_id.version,
"process_id": self.log_record_id.process_id,
}

View File

@ -22,7 +22,6 @@ from aiohttp.web import HTTPBadRequest, HTTPNoContent, HTTPNotFound, Response, j
from ahriman.core.exceptions import UnknownPackageError from ahriman.core.exceptions import UnknownPackageError
from ahriman.core.utils import pretty_datetime from ahriman.core.utils import pretty_datetime
from ahriman.models.log_record import LogRecord from ahriman.models.log_record import LogRecord
from ahriman.models.log_record_id import LogRecordId
from ahriman.models.user_access import UserAccess from ahriman.models.user_access import UserAccess
from ahriman.web.apispec.decorators import apidocs from ahriman.web.apispec.decorators import apidocs
from ahriman.web.schemas import LogSchema, LogsSchema, PackageNameSchema, PackageVersionSchema, RepositoryIdSchema from ahriman.web.schemas import LogSchema, LogsSchema, PackageNameSchema, PackageVersionSchema, RepositoryIdSchema
@ -123,15 +122,10 @@ class LogsView(StatusViewGuard, BaseView):
try: try:
data = await self.request.json() data = await self.request.json()
created = data["created"] log_record = LogRecord.from_json(package_base, data)
record = data["message"]
version = data["version"]
except Exception as ex: except Exception as ex:
raise HTTPBadRequest(reason=str(ex)) raise HTTPBadRequest(reason=str(ex))
# either read from process identifier from payload or assign to the current process identifier
process_id = data.get("process_id", LogRecordId("", "").process_id)
log_record = LogRecord(LogRecordId(package_base, version, process_id), created, record)
self.service().package_logs_add(log_record) self.service().package_logs_add(log_record)
raise HTTPNoContent raise HTTPNoContent

View File

@ -63,12 +63,5 @@ class LogsView(StatusViewGuard, BaseView):
logs = self.service(package_base=package_base).package_logs_get(package_base, limit, offset) logs = self.service(package_base=package_base).package_logs_get(package_base, limit, offset)
response = [ response = [log_record.view() for log_record in logs]
{
"created": log_record.created,
"message": log_record.message,
"version": log_record.log_record_id.version,
"process_id": log_record.log_record_id.process_id,
} for log_record in logs
]
return json_response(response) return json_response(response)

View File

@ -0,0 +1,13 @@
from ahriman.models.log_record import LogRecord
from ahriman.models.log_record_id import LogRecordId
def test_log_record_from_json_view() -> None:
"""
must construct same object from json
"""
log_record = LogRecord(LogRecordId("base", "version"), 0, "message")
assert LogRecord.from_json(log_record.log_record_id.package_base, log_record.view()) == log_record
log_record = LogRecord(LogRecordId("base", "version", "process_id"), 0, "message")
assert LogRecord.from_json(log_record.log_record_id.package_base, log_record.view()) == log_record