common.InitialData.java Source code

Java tutorial

Introduction

Here is the source code for common.InitialData.java

Source

/*
 * MyTake.org
 *
 *  Copyright 2017 by its authors.
 *  Some rights reserved. See LICENSE, https://github.com/mytakedotorg/mytakedotorg/graphs/contributors
 */
package common;

import static db.Tables.ACCOUNT;
import static db.Tables.MODERATOR;
import static db.Tables.TAKEDRAFT;
import static db.Tables.TAKEPUBLISHED;
import static db.Tables.TAKEREVISION;

import com.google.common.io.Resources;
import com.google.inject.Binder;
import com.typesafe.config.Config;
import db.Tables;
import db.tables.records.AccountRecord;
import db.tables.records.TakedraftRecord;
import db.tables.records.TakepublishedRecord;
import db.tables.records.TakerevisionRecord;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.function.Consumer;
import org.jooby.Env;
import org.jooby.Jooby;
import org.jooq.DSLContext;

/** This is for setting the initial data for the case that the database is empty. */
public class InitialData {
    /** If the database is empty, initializes with some data. */
    public static class Module implements Jooby.Module {
        @Override
        public void configure(Env env, Config conf, Binder binder) throws Throwable {
            env.onStart(registry -> {
                try (DSLContext dsl = registry.require(DSLContext.class)) {
                    int numAccounts = dsl.fetchCount(Tables.ACCOUNT);
                    if (numAccounts == 0) {
                        init(dsl, registry.require(Time.class));
                    }
                }
            });
        }
    }

    public static void init(DSLContext dsl, Time time) throws Exception {
        int sampleUser = usernameEmail(dsl, time, "samples", "samples@email.com");
        take(dsl, time, sampleUser, "Why it's so hard to have peace",
                "/presidential-debate-clinton-trump-2-of-3_304.000-321.000.png");
        take(dsl, time, sampleUser, "Does a law mean what it says, or what it meant?",
                "/bill-of-rights_283-439_283-439.png");
        take(dsl, time, sampleUser, "Don't worry, we'll protect the Constitution for you!",
                "/united-states-constitution_17730-18357_17730-18357.png");

        draft(dsl, time, sampleUser, "In my opinion", b -> {
        });
        draft(dsl, time, sampleUser, "In other words", b -> b.p("What a world"));

        int otherUser = usernameEmail(dsl, time, "other", "other@email.com");
        take(dsl, time, otherUser, "I am a strawman", b -> {
        });
        draft(dsl, time, otherUser, "To make sure users don't leak", b -> {
        });

        usernameEmail(dsl, time, "empty", "empty@email.com");

        dsl.insertInto(MODERATOR).columns(MODERATOR.ID).values(usernameEmail(dsl, time, "mod1", "mod1@email.com"))
                .values(usernameEmail(dsl, time, "mod2", "mod2@email.com")).execute();
    }

    static TakerevisionRecord draft(DSLContext dsl, Time time, int user, String title, TakeBuilder builder) {
        TakerevisionRecord rev = dsl.newRecord(TAKEREVISION);
        rev.setCreatedAt(time.nowTimestamp());
        rev.setCreatedIp(IP);
        rev.setTitle(title);
        rev.setBlocks(builder.buildString());
        rev.insert();

        TakedraftRecord draft = dsl.newRecord(TAKEDRAFT);
        draft.setUserId(user);
        draft.setLastRevision(rev.getId());
        draft.insert();

        return rev;
    }

    static TakerevisionRecord draft(DSLContext dsl, Time time, int user, String title,
            Consumer<TakeBuilder> builder) {
        return draft(dsl, time, user, title, TakeBuilder.builder(builder));
    }

    static int usernameEmail(DSLContext dsl, Time time, String username, String email) {
        AccountRecord record = dsl.newRecord(ACCOUNT);
        record.setUsername(username);
        record.setEmail(email);
        record.setCreatedAt(time.nowTimestamp());
        record.setCreatedIp(IP);
        record.setUpdatedAt(time.nowTimestamp());
        record.setUpdatedIp(IP);
        record.setLastSeenAt(time.nowTimestamp());
        record.setLastSeenIp(IP);
        record.setLastEmailedAt(time.nowTimestamp());
        record.insert();
        return record.getId();
    }

    static TakepublishedRecord take(DSLContext dsl, Time time, int user, String title, String factTitleSlug)
            throws IOException {
        TakepublishedRecord record = takeInternal(dsl, time, user, title);
        String jsonData = Resources.toString(
                Resources.getResource("initialdata/" + record.getTitleSlug() + ".json"), StandardCharsets.UTF_8);
        record.setBlocks(jsonData);
        record.setImageUrl(factTitleSlug);
        record.insert();
        return record;
    }

    static TakepublishedRecord take(DSLContext dsl, Time time, int user, String title, Consumer<TakeBuilder> b)
            throws IOException {
        return take(dsl, time, user, title, TakeBuilder.builder(b));
    }

    static TakepublishedRecord take(DSLContext dsl, Time time, int user, String title, TakeBuilder b)
            throws IOException {
        TakepublishedRecord record = takeInternal(dsl, time, user, title);
        record.setBlocks(b.buildString());
        record.insert();
        return record;
    }

    private static TakepublishedRecord takeInternal(DSLContext dsl, Time time, int user, String title) {
        TakepublishedRecord record = dsl.newRecord(TAKEPUBLISHED);
        record.setUserId(user);
        record.setTitle(title);
        String slugified = Text.slugify(title);
        record.setTitleSlug(slugified);
        record.setPublishedAt(time.nowTimestamp());
        record.setPublishedIp(IP);
        return record;
    }

    private static final String IP = "127.0.0.1";
}