[mod] helpers: outsourced pit
This commit is contained in:
parent
32ec509064
commit
810965d255
5 changed files with 16 additions and 482 deletions
|
@ -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)
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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<
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Add table
Reference in a new issue