[mod] helpers: outsourced pit

This commit is contained in:
Fenris Wolf 2024-09-26 16:47:38 +02:00
parent 32ec509064
commit 810965d255
5 changed files with 16 additions and 482 deletions

View file

@ -111,8 +111,8 @@ namespace _zeitbild.api
const session : {key : string; value : lib_plankton.session.type_session;} = await session_from_stuff(stuff);
const user_id : _zeitbild.type_user_id = await _zeitbild.service.user.identify(session.value.name);
const from : _zeitbild.helpers.type_pit = parseInt(stuff.query_parameters["from"]);
const to : _zeitbild.helpers.type_pit = parseInt(stuff.query_parameters["to"]);
const from : lib_plankton.pit.type_pit = parseInt(stuff.query_parameters["from"]);
const to : lib_plankton.pit.type_pit = parseInt(stuff.query_parameters["to"]);
const calendar_ids_wanted : (null | Array<_zeitbild.type_calendar_id>) = (
(
("calendar_ids" in stuff.query_parameters)

View file

@ -4,478 +4,12 @@
namespace _zeitbild.helpers
{
/**
*/
export function date_object_get_week_of_year(
date : Date
) : int
{
let date_ : Date = new Date(date.getTime());
date_.setHours(0, 0, 0, 0);
// Thursday in current week decides the year.
date_.setDate(date_.getDate() + 3 - (date_.getDay() + 6) % 7);
// January 4 is always in week 1.
let week1 : Date = new Date(date_.getFullYear(), 0, 4);
// Adjust to Thursday in week 1 and count number of weeks from date to week1.
return (
1
+
Math.round(
(
((date_.getTime() - week1.getTime()) / 86400000)
-
3
+
(week1.getDay() + 6) % 7
)
/
7
)
);
}
/**
* @todo unite with type_datetimeobject?
*/
export type type_datetime = {
timezone_shift : int;
date : type_date;
time : (
null
|
type_time
);
};
/**
* @todo timezone_shift
*/
function datetime_from_date_object(
date : Date,
options : {
timezone_shift ?: int;
} = {}
) : type_datetime
{
options = Object.assign(
{
"timezone_shift": 0,
},
options
);
const date_ : Date = lib_plankton.call.convey(
date,
[
(x : Date) => x.getTime(),
(x : int) => (x + (((options.timezone_shift as int) * (60 * 60)) * 1000)),
(x : int) => new Date(x),
]
);
const iso_string : string = date_.toISOString();
return {
"timezone_shift": (options.timezone_shift as int),
"date": {
"year": parseInt(iso_string.slice(0, 4)),
"month": parseInt(iso_string.slice(5, 7)),
"day": parseInt(iso_string.slice(8, 10)),
},
"time": {
"hour": parseInt(iso_string.slice(11, 13)),
"minute": parseInt(iso_string.slice(14, 16)),
"second": parseInt(iso_string.slice(17, 19)),
},
};
}
/**
* @todo negative shift?
*/
function datetime_to_date_object(
datetime : type_datetime
) : Date
{
const iso_string : string = lib_plankton.string.coin(
"{{year}}-{{month}}-{{day}}T{{hour}}:{{minute}}:{{second}}.000+{{shift}}",
{
"year": datetime.date.year.toFixed(0).padStart(4, "0"),
"month": datetime.date.month.toFixed(0).padStart(2, "0"),
"day": datetime.date.day.toFixed(0).padStart(2, "0"),
"hour": ((datetime.time !== null) ? datetime.time.hour : 0).toFixed(0).padStart(2, "0"),
"minute": ((datetime.time !== null) ? datetime.time.minute : 0).toFixed(0).padStart(2, "0"),
"second": ((datetime.time !== null) ? datetime.time.second : 0).toFixed(0).padStart(2, "0"),
"shift": (datetime.timezone_shift.toFixed(0).padStart(2, "0") + ":00"),
}
);
return (new Date(iso_string));
}
/**
*/
export type type_pit = int;
/**
*/
export function pit_to_date_object(
pit : type_pit
) : Date
{
return (new Date(pit * 1000));
}
/**
*/
function pit_from_date_object(
date_object : Date
) : type_pit
{
return Math.round(date_object.getTime() / 1000);
}
/**
*/
export function pit_now(
) : type_pit
{
return pit_from_date_object(new Date(Date.now()));
}
/**
* @todo timezone
*/
export function pit_to_datetime(
pit : type_pit,
options : {
timezone_shift ?: int
} = {}
) : type_datetime
{
options = Object.assign(
{
"timezone_shift": 0,
},
options
);
const date_object : Date = pit_to_date_object(pit);
return datetime_from_date_object(
date_object,
{
"timezone_shift": (options.timezone_shift as int),
}
);
}
/**
*/
export function pit_from_datetime(
datetime : type_datetime
) : type_pit
{
return lib_plankton.call.convey(
datetime,
[
datetime_to_date_object,
pit_from_date_object,
]
);
}
/**
*/
export function pit_is_before(
pit : type_pit,
reference : type_pit
) : boolean
{
return (pit < reference);
}
/**
*/
function pit_is_after(
pit : type_pit,
reference : type_pit
) : boolean
{
return (pit > reference);
}
/**
*/
export function pit_is_between(
pit : type_pit,
reference_left : type_pit,
reference_right : type_pit
) : boolean
{
return (
pit_is_after(pit, reference_left)
&&
pit_is_before(pit, reference_right)
);
}
/**
*/
function pit_shift_hour(
pit : type_pit,
increment : int
) : type_pit
{
return (pit + (60 * 60 * increment));
}
/**
*/
export function pit_shift_day(
pit : type_pit,
increment : int
) : type_pit
{
return (pit + (60 * 60 * 24 * increment));
}
/**
*/
export function pit_shift_week(
pit : type_pit,
increment : int
) : type_pit
{
return (pit + (60 * 60 * 24 * 7 * increment));
}
/**
*/
function pit_shift_year(
pit : type_pit,
increment : int
) : type_pit
{
return (pit + (60 * 60 * 24 * 365 * increment));
}
/**
*/
function pit_trunc_minute(
pit : type_pit
) : type_pit
{
const datetime_input : type_datetime = pit_to_datetime(pit);
const datetime_output : type_datetime = {
"timezone_shift": 0,
"date": {
"year": datetime_input.date.year,
"month": datetime_input.date.month,
"day": datetime_input.date.day,
},
"time": {
"hour": (
(datetime_input.time === null)
?
0
:
datetime_input.time.hour
),
"minute": (
(datetime_input.time === null)
?
0
:
datetime_input.time.minute
),
"second": 0,
},
};
return pit_from_datetime(datetime_output);
}
/**
*/
function pit_trunc_hour(
pit : type_pit
) : type_pit
{
const datetime_input : type_datetime = pit_to_datetime(pit);
const datetime_output : type_datetime = {
"timezone_shift": 0,
"date": {
"year": datetime_input.date.year,
"month": datetime_input.date.month,
"day": datetime_input.date.day,
},
"time": {
"hour": (
(datetime_input.time === null)
?
0
:
datetime_input.time.hour
),
"minute": 0,
"second": 0,
},
};
return pit_from_datetime(datetime_output);
}
/**
*/
function pit_trunc_day(
pit : type_pit
) : type_pit
{
const datetime_input : type_datetime = pit_to_datetime(pit);
const datetime_output : type_datetime = {
"timezone_shift": 0,
"date": {
"year": datetime_input.date.year,
"month": datetime_input.date.month,
"day": datetime_input.date.day,
},
"time": {
"hour": 0,
"minute": 0,
"second": 0,
},
};
return pit_from_datetime(datetime_output);
}
/**
*/
export function pit_trunc_week(
pit : type_pit
) : type_pit
{
const date_object : Date = pit_to_date_object(pit);
return lib_plankton.call.convey(
date_object.getDay(),
[
(x : int) => ((x === 0) ? 7 : x),
(x : int) => (x - 1),
(x : int) => pit_shift_day(pit, (-x)),
pit_trunc_day
]
);
}
/**
*/
function pit_trunc_month(
pit : type_pit
) : type_pit
{
const datetime_input : type_datetime = pit_to_datetime(pit);
const datetime_output : type_datetime = {
"timezone_shift": 0,
"date": {
"year": datetime_input.date.year,
"month": datetime_input.date.month,
"day": 1,
},
"time": {
"hour": 0,
"minute": 0,
"second": 0,
},
};
return pit_from_datetime(datetime_output);
}
/**
*/
function pit_trunc_year(
pit : type_pit
) : type_pit
{
const datetime_input : type_datetime = pit_to_datetime(pit);
const datetime_output : type_datetime = {
"timezone_shift": 0,
"date": {
"year": datetime_input.date.year,
"month": 1,
"day": 1,
},
"time": {
"hour": 0,
"minute": 0,
"second": 0,
},
};
return pit_from_datetime(datetime_output);
}
/**
* @param year year according to specified timezone shift
* @param week week according to specified timezone shift
* @return the begin of the week (monday, 00:00)
*/
export function pit_from_year_and_week(
year : int,
week : int,
options : {
timezone_shift ?: int;
} = {}
) : type_pit
{
options = Object.assign(
{
"timezone_shift": 0,
},
options
);
return lib_plankton.call.convey(
{
"timezone_shift": (options.timezone_shift as int),
"date": {
"year": year,
"month": 1,
"day": 1,
},
"time": {
"hour": 0,
"minute": 0,
"second": 0
}
},
[
pit_from_datetime,
(x : type_pit) => pit_shift_week(x, (week - 1)),
pit_trunc_week,
]
);
}
/**
* @todo timezone
*/
function ical_datetime_to_own_datetime(
ical_datetime : lib_plankton.ical.type_datetime
) : type_datetime
) : lib_plankton.pit.type_datetime
{
return {
"timezone_shift": 0,
@ -504,7 +38,7 @@ namespace _zeitbild.helpers
*/
export function ical_dt_to_own_datetime(
ical_dt: lib_plankton.ical.type_dt
) : type_datetime
) : lib_plankton.pit.type_datetime
{
return {
"timezone_shift": 0,

View file

@ -184,7 +184,7 @@ namespace _zeitbild.repository.resource
stuff : type_local_resource_event_stuff
) : Record<string, any>
{
const encode_datetime : ((datetime : _zeitbild.helpers.type_datetime) => string) = ((datetime) => {
const encode_datetime : ((datetime : lib_plankton.pit.type_datetime) => string) = ((datetime) => {
return lib_plankton.string.coin(
"{{timezone_shift}}|{{date}}{{macro_time}}",
{
@ -237,7 +237,7 @@ namespace _zeitbild.repository.resource
row : Record<string, any>
) : type_local_resource_event_stuff
{
const decode_datetime : ((datetime_raw : string) => _zeitbild.helpers.type_datetime) = ((datetime_raw) => {
const decode_datetime : ((datetime_raw : string) => lib_plankton.pit.type_datetime) = ((datetime_raw) => {
const parts : Array<string> = datetime_raw.split("|");
const timezone_shift : int = parseInt(parts[0]);
if (parts[1].length <= 10) {

View file

@ -165,8 +165,8 @@ namespace _zeitbild.service.calendar
*/
async function get_events(
calendar_id : _zeitbild.type_calendar_id,
from_pit : _zeitbild.helpers.type_pit,
to_pit : _zeitbild.helpers.type_pit,
from_pit : lib_plankton.pit.type_pit,
to_pit : lib_plankton.pit.type_pit,
user_id : _zeitbild.type_user_id
) : Promise<
Array<
@ -197,8 +197,8 @@ namespace _zeitbild.service.calendar
(events) => Promise.resolve(
events
.filter(
(event : _zeitbild.type_event_object) => _zeitbild.helpers.pit_is_between(
_zeitbild.helpers.pit_from_datetime(event.begin),
(event : _zeitbild.type_event_object) => lib_plankton.pit.is_between(
lib_plankton.pit.from_datetime(event.begin),
from_pit,
to_pit
)
@ -279,8 +279,8 @@ namespace _zeitbild.service.calendar
(event) => (event !== null)
)
.filter(
(event) => _zeitbild.helpers.pit_is_between(
_zeitbild.helpers.pit_from_datetime(event.begin),
(event) => lib_plankton.pit.is_between(
lib_plankton.pit.from_datetime(event.begin),
from_pit,
to_pit
)
@ -305,8 +305,8 @@ namespace _zeitbild.service.calendar
*/
export async function gather_events(
calendar_ids_wanted : (null | Array<_zeitbild.type_calendar_id>),
from_pit : _zeitbild.helpers.type_pit,
to_pit : _zeitbild.helpers.type_pit,
from_pit : lib_plankton.pit.type_pit,
to_pit : lib_plankton.pit.type_pit,
user_id : _zeitbild.type_user_id
) : Promise<
Array<

View file

@ -35,11 +35,11 @@ namespace _zeitbild
*/
export type type_event_object = {
name : string;
begin : _zeitbild.helpers.type_datetime;
begin : lib_plankton.pit.type_datetime;
end : (
null
|
_zeitbild.helpers.type_datetime
lib_plankton.pit.type_datetime
);
location : (
null