2023-01-03 01:21:08 +00:00
|
|
|
const util = @import("util");
|
|
|
|
|
|
|
|
const Uuid = util.Uuid;
|
|
|
|
const DateTime = util.DateTime;
|
|
|
|
|
|
|
|
const common = struct {
|
|
|
|
const Direction = enum {
|
|
|
|
ascending,
|
|
|
|
descending,
|
|
|
|
|
|
|
|
pub const jsonStringify = util.jsonSerializeEnumAsString;
|
|
|
|
};
|
|
|
|
|
|
|
|
const PageDirection = enum {
|
|
|
|
forward,
|
|
|
|
backward,
|
|
|
|
|
|
|
|
pub const jsonStringify = util.jsonSerializeEnumAsString;
|
|
|
|
};
|
|
|
|
|
|
|
|
fn QueryResult(comptime R: type, comptime A: type) type {
|
|
|
|
return struct {
|
|
|
|
items: []R,
|
|
|
|
|
|
|
|
next_page: A,
|
|
|
|
prev_page: A,
|
|
|
|
};
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
pub const accounts = struct {
|
|
|
|
pub const Role = enum {
|
|
|
|
user,
|
|
|
|
admin,
|
|
|
|
};
|
|
|
|
|
2023-01-08 23:35:58 +00:00
|
|
|
pub const CreateArgs = struct {
|
|
|
|
for_actor: Uuid,
|
|
|
|
password_hash: []const u8,
|
2023-01-03 01:21:08 +00:00
|
|
|
invite_id: ?Uuid = null,
|
|
|
|
email: ?[]const u8 = null,
|
|
|
|
role: Role = .user,
|
|
|
|
};
|
|
|
|
|
|
|
|
pub const Credentials = struct {
|
|
|
|
account_id: Uuid,
|
|
|
|
password_hash: []const u8,
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
pub const actors = struct {
|
|
|
|
pub const Actor = struct {
|
|
|
|
id: Uuid,
|
|
|
|
|
|
|
|
username: []const u8,
|
|
|
|
host: []const u8,
|
|
|
|
community_id: Uuid,
|
|
|
|
|
|
|
|
display_name: ?[]const u8,
|
|
|
|
bio: []const u8,
|
|
|
|
|
|
|
|
avatar_file_id: ?Uuid,
|
|
|
|
header_file_id: ?Uuid,
|
|
|
|
|
|
|
|
profile_fields: []const ProfileField,
|
|
|
|
|
|
|
|
created_at: DateTime,
|
|
|
|
updated_at: DateTime,
|
|
|
|
|
|
|
|
pub const sql_serialize = struct {
|
|
|
|
pub const profile_fields = .json;
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
pub const ProfileField = struct {
|
|
|
|
key: []const u8,
|
|
|
|
value: []const u8,
|
|
|
|
};
|
|
|
|
|
|
|
|
// TODO: get rid of this
|
|
|
|
pub const Profile = struct {
|
|
|
|
display_name: ?[]const u8,
|
|
|
|
bio: []const u8,
|
|
|
|
avatar_file_id: ?Uuid,
|
|
|
|
header_file_id: ?Uuid,
|
|
|
|
profile_fields: []const ProfileField,
|
|
|
|
|
|
|
|
pub const sql_serialize = struct {
|
|
|
|
pub const profile_fields = .json;
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
pub const ProfileUpdateArgs = struct {
|
|
|
|
display_name: ??[]const u8,
|
|
|
|
bio: ?[]const u8,
|
|
|
|
avatar_file_id: ??Uuid,
|
|
|
|
header_file_id: ??Uuid,
|
|
|
|
profile_fields: ?[]const ProfileField,
|
|
|
|
|
|
|
|
pub const sql_serialize = struct {
|
|
|
|
pub const profile_fields = .json;
|
|
|
|
};
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
pub const communities = struct {
|
|
|
|
pub const Community = struct {
|
|
|
|
id: Uuid,
|
|
|
|
|
|
|
|
owner_id: ?Uuid,
|
|
|
|
host: []const u8,
|
|
|
|
name: []const u8,
|
|
|
|
|
|
|
|
scheme: Scheme,
|
|
|
|
kind: Kind,
|
|
|
|
created_at: DateTime,
|
|
|
|
};
|
|
|
|
|
|
|
|
pub const Kind = enum {
|
|
|
|
admin,
|
|
|
|
local,
|
|
|
|
|
|
|
|
pub const jsonStringify = util.jsonSerializeEnumAsString;
|
|
|
|
};
|
|
|
|
|
|
|
|
pub const Scheme = enum {
|
|
|
|
https,
|
|
|
|
http,
|
|
|
|
|
|
|
|
pub const jsonStringify = util.jsonSerializeEnumAsString;
|
|
|
|
};
|
|
|
|
|
|
|
|
pub const CreateOptions = struct {
|
|
|
|
name: ?[]const u8 = null,
|
|
|
|
kind: Kind = .local,
|
|
|
|
};
|
|
|
|
|
|
|
|
pub const QueryArgs = struct {
|
|
|
|
pub const OrderBy = enum {
|
|
|
|
name,
|
|
|
|
host,
|
|
|
|
created_at,
|
|
|
|
|
|
|
|
pub const jsonStringify = util.jsonSerializeEnumAsString;
|
|
|
|
};
|
|
|
|
|
|
|
|
pub const Direction = common.Direction;
|
|
|
|
pub const PageDirection = common.PageDirection;
|
|
|
|
pub const Prev = struct {
|
|
|
|
id: Uuid,
|
|
|
|
order_val: OrderVal,
|
|
|
|
};
|
|
|
|
pub const OrderVal = union(OrderBy) {
|
|
|
|
name: []const u8,
|
|
|
|
host: []const u8,
|
|
|
|
created_at: DateTime,
|
|
|
|
};
|
|
|
|
|
|
|
|
// Max items to fetch
|
|
|
|
max_items: usize = 20,
|
|
|
|
|
|
|
|
// Selection filters
|
|
|
|
owner_id: ?Uuid = null, // searches for communities owned by this user
|
|
|
|
like: ?[]const u8 = null, // searches for communities with host or name LIKE '%?%'
|
|
|
|
created_before: ?DateTime = null,
|
|
|
|
created_after: ?DateTime = null,
|
|
|
|
|
|
|
|
// Ordering parameter
|
|
|
|
order_by: OrderBy = .created_at,
|
|
|
|
direction: Direction = .ascending,
|
|
|
|
|
|
|
|
// Page start parameter(s)
|
|
|
|
// This struct is a reference to the last value scanned
|
|
|
|
// If prev is present, then prev.order_val must have the same tag as order_by
|
|
|
|
// "prev" here refers to it being the previous value returned. It may be that
|
|
|
|
// prev refers to the item directly after the results you are about to recieve,
|
|
|
|
// if you are querying the previous page.
|
|
|
|
prev: ?Prev = null,
|
|
|
|
|
|
|
|
// What direction to scan the page window
|
|
|
|
// If "forward", then "prev" is interpreted as the item directly before the items
|
|
|
|
// to query, in the direction of "direction" above. If "backward", then the opposite
|
|
|
|
page_direction: PageDirection = .forward,
|
|
|
|
};
|
|
|
|
|
|
|
|
pub const QueryResult = common.QueryResult(Community, QueryArgs);
|
|
|
|
};
|
|
|
|
|
|
|
|
pub const drive = struct {
|
|
|
|
pub const DriveEntry = struct {
|
|
|
|
pub const Kind = enum {
|
|
|
|
dir,
|
|
|
|
file,
|
|
|
|
|
|
|
|
pub const jsonStringify = util.jsonSerializeEnumAsString;
|
|
|
|
};
|
|
|
|
|
|
|
|
id: Uuid,
|
|
|
|
owner_id: Uuid,
|
|
|
|
|
|
|
|
name: ?[]const u8,
|
|
|
|
|
|
|
|
path: []const u8,
|
|
|
|
parent_directory_id: ?Uuid,
|
|
|
|
|
|
|
|
file_id: ?Uuid,
|
|
|
|
kind: Kind,
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
pub const files = struct {
|
|
|
|
pub const FileUpload = struct {
|
2023-01-04 19:03:23 +00:00
|
|
|
pub const Status = enum {
|
|
|
|
uploading,
|
|
|
|
uploaded,
|
|
|
|
external,
|
|
|
|
deleted,
|
|
|
|
|
|
|
|
pub const jsonStringify = util.jsonSerializeEnumAsString;
|
|
|
|
};
|
|
|
|
|
2023-01-03 01:21:08 +00:00
|
|
|
id: Uuid,
|
|
|
|
|
|
|
|
owner_id: Uuid,
|
|
|
|
size: usize,
|
|
|
|
|
|
|
|
filename: []const u8,
|
|
|
|
description: ?[]const u8,
|
|
|
|
content_type: ?[]const u8,
|
|
|
|
sensitive: bool,
|
|
|
|
|
|
|
|
status: Status,
|
|
|
|
|
|
|
|
created_at: DateTime,
|
|
|
|
updated_at: DateTime,
|
|
|
|
};
|
|
|
|
|
|
|
|
pub const CreateOptions = struct {
|
|
|
|
filename: []const u8,
|
|
|
|
description: ?[]const u8,
|
|
|
|
content_type: ?[]const u8,
|
|
|
|
sensitive: bool,
|
|
|
|
};
|
|
|
|
|
|
|
|
pub const UpdateArgs = struct {
|
|
|
|
filename: ?[]const u8,
|
|
|
|
description: ?[]const u8,
|
|
|
|
content_type: ?[]const u8,
|
|
|
|
sensitive: ?bool,
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
pub const invites = struct {
|
2023-01-04 19:03:23 +00:00
|
|
|
pub const UseCount = usize;
|
2023-01-03 01:21:08 +00:00
|
|
|
pub const Invite = struct {
|
|
|
|
id: Uuid,
|
|
|
|
|
|
|
|
created_by: Uuid, // User ID
|
|
|
|
community_id: Uuid,
|
|
|
|
name: []const u8,
|
|
|
|
code: []const u8,
|
|
|
|
|
|
|
|
created_at: DateTime,
|
|
|
|
times_used: UseCount,
|
|
|
|
|
|
|
|
expires_at: ?DateTime,
|
|
|
|
max_uses: ?UseCount,
|
|
|
|
|
|
|
|
kind: Kind,
|
|
|
|
};
|
|
|
|
pub const Kind = enum {
|
|
|
|
system,
|
|
|
|
community_owner,
|
|
|
|
user,
|
|
|
|
|
|
|
|
pub const jsonStringify = util.jsonSerializeEnumAsString;
|
|
|
|
};
|
|
|
|
|
2023-01-04 19:03:23 +00:00
|
|
|
pub const CreateOptions = struct {
|
|
|
|
created_by: Uuid,
|
|
|
|
community_id: Uuid,
|
2023-01-03 01:21:08 +00:00
|
|
|
name: ?[]const u8 = null,
|
|
|
|
max_uses: ?UseCount = null,
|
|
|
|
lifespan: ?DateTime.Duration = null,
|
|
|
|
kind: Kind = .user,
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
pub const follows = struct {
|
|
|
|
pub const Follow = struct {
|
|
|
|
id: Uuid,
|
|
|
|
|
|
|
|
followed_by_id: Uuid,
|
|
|
|
followee_id: Uuid,
|
|
|
|
|
|
|
|
created_at: DateTime,
|
|
|
|
};
|
|
|
|
pub const QueryArgs = struct {
|
|
|
|
pub const OrderBy = enum {
|
|
|
|
created_at,
|
|
|
|
};
|
|
|
|
|
|
|
|
pub const Direction = common.Direction;
|
|
|
|
pub const PageDirection = common.PageDirection;
|
|
|
|
pub const Prev = struct {
|
|
|
|
id: Uuid,
|
|
|
|
order_val: union(OrderBy) {
|
|
|
|
created_at: DateTime,
|
|
|
|
},
|
|
|
|
};
|
|
|
|
|
|
|
|
max_items: usize = 20,
|
|
|
|
|
|
|
|
followed_by_id: ?Uuid = null,
|
|
|
|
followee_id: ?Uuid = null,
|
|
|
|
|
|
|
|
order_by: OrderBy = .created_at,
|
|
|
|
|
|
|
|
direction: Direction = .descending,
|
|
|
|
|
|
|
|
prev: ?Prev = null,
|
|
|
|
|
|
|
|
page_direction: PageDirection = .forward,
|
|
|
|
};
|
|
|
|
|
|
|
|
pub const QueryResult = common.QueryResult(Follow, QueryArgs);
|
|
|
|
};
|
|
|
|
|
|
|
|
pub const notes = struct {
|
|
|
|
pub const Note = struct {
|
|
|
|
id: Uuid,
|
|
|
|
|
2023-01-04 19:03:23 +00:00
|
|
|
author: actors.Actor, // TODO
|
2023-01-03 01:21:08 +00:00
|
|
|
content: []const u8,
|
|
|
|
created_at: DateTime,
|
|
|
|
|
|
|
|
// TODO: This sucks
|
|
|
|
pub const sql_serialize = struct {
|
|
|
|
pub const @"author.profile_fields" = .json;
|
|
|
|
};
|
|
|
|
};
|
|
|
|
pub const QueryArgs = struct {
|
|
|
|
pub const PageDirection = common.PageDirection;
|
|
|
|
pub const Prev = struct {
|
|
|
|
id: Uuid,
|
|
|
|
created_at: DateTime,
|
|
|
|
};
|
|
|
|
|
|
|
|
max_items: usize = 20,
|
|
|
|
|
|
|
|
created_before: ?DateTime = null,
|
|
|
|
created_after: ?DateTime = null,
|
|
|
|
community_id: ?Uuid = null,
|
|
|
|
followed_by: ?Uuid = null,
|
|
|
|
|
|
|
|
prev: ?Prev = null,
|
|
|
|
|
|
|
|
page_direction: PageDirection = .forward,
|
|
|
|
};
|
|
|
|
pub const QueryResult = common.QueryResult(Note, QueryArgs);
|
|
|
|
};
|
|
|
|
|
|
|
|
pub const tokens = struct {
|
|
|
|
pub const Token = struct {
|
|
|
|
account_id: Uuid,
|
|
|
|
issued_at: DateTime,
|
|
|
|
|
|
|
|
hash: []const u8,
|
|
|
|
};
|
|
|
|
};
|