Skip to content

Instantly share code, notes, and snippets.

@guillaumewuip
guillaumewuip / request.sql
Last active November 30, 2016 05:44
Moodle files access
DROP PROCEDURE IF EXISTS getLogsForModule;
DELIMITER $$
CREATE PROCEDURE getLogsForModule(module VARCHAR(255))
BEGIN
-- on doit passer par un concat car le nom d'une table doit être statique
SET @request = CONCAT("SELECT l.*, i.*, c.*, category_path(c.category) as category_path, u.*
FROM mdl_logstore_standard_log l
LEFT OUTER JOIN mdl_", module, " i ON i.id = l.objectid
LEFT OUTER JOIN mdl_course c ON c.id = l.courseid
@guillaumewuip
guillaumewuip / Message.ts
Created February 20, 2020 07:44
How to model your entities - 1
// Message.ts
export type TextMessage = {
text: string;
}
export type ImageMessage = {
mimeType: string;
url: string;
description: string;
}
@guillaumewuip
guillaumewuip / Message.ts
Created February 20, 2020 07:46
How to model your entities - 2
// Message.ts
export type Message = TextMessage | ImageMessage | AudioMessage;
@guillaumewuip
guillaumewuip / Somewhere.ts
Last active February 20, 2020 09:55
How to model your entities - 3
import { Message } from ‘./Message’
function renderMessage(message: Message) {
if (message.text) {
// ok we know it’s a TextMessage
return <TextComponent text={message.text} />
}
if (message.url) {
// Problem!
@guillaumewuip
guillaumewuip / Message.ts
Created February 20, 2020 07:50
How to model your entities - 4
export type TextMessage = {
messageType: 'TEXT';
...
}
export type ImageMessage = {
messageType: 'IMAGE';
...
}
@guillaumewuip
guillaumewuip / Somewhere.ts
Created February 20, 2020 07:51
How to model your entities - 5
function renderMessage(message: Message) {
if (message.messageType === 'TEXT') {
// message is typed as TextMessage here
return <TextComponent text={message.text} />
}
if (message.messageType === 'IMAGE') {
// message is typed as ImageMessage here
return <ImageComponent url={message.url} description={message.description} />
}
@guillaumewuip
guillaumewuip / Message.ts
Created February 20, 2020 07:53
How to model your entities - 6
// If this function returns true, TS will know the message variable is a TextMessage
function isText(message: Message): message is TextMessage {
return message.messageType === ‘TEXT’;
}
// Repeat for isImage and isAudio
@guillaumewuip
guillaumewuip / Somewhere.ts
Created February 20, 2020 07:54
How to model your entities - 7
if (isText(message)) {
return <TextComponent text={message.text} />
}
@guillaumewuip
guillaumewuip / Option.ts
Created February 20, 2020 07:56
How to model your entities - 8
import { Option, fold } from ‘fp-ts/lib/Option`;
const user: Option<User> = … // ie. None | Some<User>
return fold(
() => <p>oops, no user!</p>,
(user: User) => <UserView user={user} />,
)(user);
@guillaumewuip
guillaumewuip / Message.ts
Created February 20, 2020 07:57
How to model your entities - 9
// Message.ts
function fold<R>(
onText: (message: TextMessage) => R,
onImage: (message: ImageMessage) => R,
onAudio: (message: AudioMessage) => R,
) => {
return (message: Message): R => {
switch (message.messageType) {
case ‘TEXT’:
return onText(message);