diff --git a/app/schemas/org.fossasia.openevent.general.OpenEventDatabase/8.json b/app/schemas/org.fossasia.openevent.general.OpenEventDatabase/8.json new file mode 100644 index 0000000000..b5f0fb7893 --- /dev/null +++ b/app/schemas/org.fossasia.openevent.general.OpenEventDatabase/8.json @@ -0,0 +1,1973 @@ +{ + "formatVersion": 1, + "database": { + "version": 8, + "identityHash": "bf7cbd2b19683a13c4f43725b790ccd4", + "entities": [ + { + "tableName": "Event", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER NOT NULL, `name` TEXT NOT NULL, `identifier` TEXT NOT NULL, `startsAt` TEXT NOT NULL, `endsAt` TEXT NOT NULL, `timezone` TEXT NOT NULL, `privacy` TEXT NOT NULL, `paymentCountry` TEXT, `paypalEmail` TEXT, `thumbnailImageUrl` TEXT, `schedulePublishedOn` TEXT, `paymentCurrency` TEXT, `ownerDescription` TEXT, `originalImageUrl` TEXT, `onsiteDetails` TEXT, `ownerName` TEXT, `largeImageUrl` TEXT, `deletedAt` TEXT, `ticketUrl` TEXT, `locationName` TEXT, `codeOfConduct` TEXT, `state` TEXT, `searchableLocationName` TEXT, `description` TEXT, `pentabarfUrl` TEXT, `xcalUrl` TEXT, `logoUrl` TEXT, `externalEventUrl` TEXT, `iconImageUrl` TEXT, `icalUrl` TEXT, `createdAt` TEXT, `bankDetails` TEXT, `chequeDetails` TEXT, `isComplete` INTEGER NOT NULL, `latitude` REAL, `longitude` REAL, `refundPolicy` TEXT, `canPayByStripe` INTEGER NOT NULL, `canPayByCheque` INTEGER NOT NULL, `canPayByBank` INTEGER NOT NULL, `canPayByPaypal` INTEGER NOT NULL, `canPayOnsite` INTEGER NOT NULL, `isSponsorsEnabled` INTEGER NOT NULL, `hasOwnerInfo` INTEGER NOT NULL, `isSessionsSpeakersEnabled` INTEGER NOT NULL, `isTicketingEnabled` INTEGER NOT NULL, `isTaxEnabled` INTEGER NOT NULL, `isMapShown` INTEGER NOT NULL, `favorite` INTEGER NOT NULL, `eventTopic` TEXT, `eventType` TEXT, `eventSubTopic` TEXT, `speakersCall` TEXT, PRIMARY KEY(`id`))", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "identifier", + "columnName": "identifier", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "startsAt", + "columnName": "startsAt", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "endsAt", + "columnName": "endsAt", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "timezone", + "columnName": "timezone", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "privacy", + "columnName": "privacy", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "paymentCountry", + "columnName": "paymentCountry", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "paypalEmail", + "columnName": "paypalEmail", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "thumbnailImageUrl", + "columnName": "thumbnailImageUrl", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "schedulePublishedOn", + "columnName": "schedulePublishedOn", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "paymentCurrency", + "columnName": "paymentCurrency", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "ownerDescription", + "columnName": "ownerDescription", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "originalImageUrl", + "columnName": "originalImageUrl", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "onsiteDetails", + "columnName": "onsiteDetails", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "ownerName", + "columnName": "ownerName", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "largeImageUrl", + "columnName": "largeImageUrl", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "deletedAt", + "columnName": "deletedAt", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "ticketUrl", + "columnName": "ticketUrl", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "locationName", + "columnName": "locationName", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "codeOfConduct", + "columnName": "codeOfConduct", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "state", + "columnName": "state", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "searchableLocationName", + "columnName": "searchableLocationName", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "description", + "columnName": "description", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "pentabarfUrl", + "columnName": "pentabarfUrl", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "xcalUrl", + "columnName": "xcalUrl", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "logoUrl", + "columnName": "logoUrl", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "externalEventUrl", + "columnName": "externalEventUrl", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "iconImageUrl", + "columnName": "iconImageUrl", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "icalUrl", + "columnName": "icalUrl", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "createdAt", + "columnName": "createdAt", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "bankDetails", + "columnName": "bankDetails", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "chequeDetails", + "columnName": "chequeDetails", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "isComplete", + "columnName": "isComplete", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "latitude", + "columnName": "latitude", + "affinity": "REAL", + "notNull": false + }, + { + "fieldPath": "longitude", + "columnName": "longitude", + "affinity": "REAL", + "notNull": false + }, + { + "fieldPath": "refundPolicy", + "columnName": "refundPolicy", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "canPayByStripe", + "columnName": "canPayByStripe", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "canPayByCheque", + "columnName": "canPayByCheque", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "canPayByBank", + "columnName": "canPayByBank", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "canPayByPaypal", + "columnName": "canPayByPaypal", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "canPayOnsite", + "columnName": "canPayOnsite", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isSponsorsEnabled", + "columnName": "isSponsorsEnabled", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "hasOwnerInfo", + "columnName": "hasOwnerInfo", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isSessionsSpeakersEnabled", + "columnName": "isSessionsSpeakersEnabled", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isTicketingEnabled", + "columnName": "isTicketingEnabled", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isTaxEnabled", + "columnName": "isTaxEnabled", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isMapShown", + "columnName": "isMapShown", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "favorite", + "columnName": "favorite", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "eventTopic", + "columnName": "eventTopic", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "eventType", + "columnName": "eventType", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "eventSubTopic", + "columnName": "eventSubTopic", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "speakersCall", + "columnName": "speakersCall", + "affinity": "TEXT", + "notNull": false + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": false + }, + "indices": [ + { + "name": "index_Event_eventTopic", + "unique": false, + "columnNames": [ + "eventTopic" + ], + "createSql": "CREATE INDEX `index_Event_eventTopic` ON `${TABLE_NAME}` (`eventTopic`)" + }, + { + "name": "index_Event_eventType", + "unique": false, + "columnNames": [ + "eventType" + ], + "createSql": "CREATE INDEX `index_Event_eventType` ON `${TABLE_NAME}` (`eventType`)" + }, + { + "name": "index_Event_eventSubTopic", + "unique": false, + "columnNames": [ + "eventSubTopic" + ], + "createSql": "CREATE INDEX `index_Event_eventSubTopic` ON `${TABLE_NAME}` (`eventSubTopic`)" + }, + { + "name": "index_Event_speakersCall", + "unique": false, + "columnNames": [ + "speakersCall" + ], + "createSql": "CREATE INDEX `index_Event_speakersCall` ON `${TABLE_NAME}` (`speakersCall`)" + } + ], + "foreignKeys": [] + }, + { + "tableName": "User", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER NOT NULL, `firstName` TEXT, `lastName` TEXT, `email` TEXT, `contact` TEXT, `details` TEXT, `thumbnailImageUrl` TEXT, `iconImageUrl` TEXT, `smallImageUrl` TEXT, `avatarUrl` TEXT, `facebookUrl` TEXT, `twitterUrl` TEXT, `instagramUrl` TEXT, `googlePlusUrl` TEXT, `originalImageUrl` TEXT, `isVerified` INTEGER NOT NULL, `isAdmin` INTEGER, `isSuperAdmin` INTEGER, `createdAt` TEXT, `lastAccessedAt` TEXT, `deletedAt` TEXT, PRIMARY KEY(`id`))", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "firstName", + "columnName": "firstName", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "lastName", + "columnName": "lastName", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "email", + "columnName": "email", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "contact", + "columnName": "contact", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "details", + "columnName": "details", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "thumbnailImageUrl", + "columnName": "thumbnailImageUrl", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "iconImageUrl", + "columnName": "iconImageUrl", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "smallImageUrl", + "columnName": "smallImageUrl", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "avatarUrl", + "columnName": "avatarUrl", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "facebookUrl", + "columnName": "facebookUrl", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "twitterUrl", + "columnName": "twitterUrl", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "instagramUrl", + "columnName": "instagramUrl", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "googlePlusUrl", + "columnName": "googlePlusUrl", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "originalImageUrl", + "columnName": "originalImageUrl", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "isVerified", + "columnName": "isVerified", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isAdmin", + "columnName": "isAdmin", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "isSuperAdmin", + "columnName": "isSuperAdmin", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "createdAt", + "columnName": "createdAt", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "lastAccessedAt", + "columnName": "lastAccessedAt", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "deletedAt", + "columnName": "deletedAt", + "affinity": "TEXT", + "notNull": false + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": false + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "SocialLink", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER NOT NULL, `link` TEXT NOT NULL, `name` TEXT NOT NULL, `event` INTEGER, PRIMARY KEY(`id`), FOREIGN KEY(`event`) REFERENCES `Event`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "link", + "columnName": "link", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "event", + "columnName": "event", + "affinity": "INTEGER", + "notNull": false + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": false + }, + "indices": [ + { + "name": "index_SocialLink_event", + "unique": false, + "columnNames": [ + "event" + ], + "createSql": "CREATE INDEX `index_SocialLink_event` ON `${TABLE_NAME}` (`event`)" + } + ], + "foreignKeys": [ + { + "table": "Event", + "onDelete": "CASCADE", + "onUpdate": "NO ACTION", + "columns": [ + "event" + ], + "referencedColumns": [ + "id" + ] + } + ] + }, + { + "tableName": "Ticket", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER NOT NULL, `description` TEXT, `type` TEXT, `name` TEXT NOT NULL, `maxOrder` INTEGER NOT NULL, `isFeeAbsorbed` INTEGER, `isDescriptionVisible` INTEGER, `price` REAL NOT NULL, `position` TEXT, `quantity` TEXT, `isHidden` INTEGER, `salesStartsAt` TEXT, `salesEndsAt` TEXT, `minOrder` INTEGER NOT NULL, `event` INTEGER, PRIMARY KEY(`id`), FOREIGN KEY(`event`) REFERENCES `Event`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "description", + "columnName": "description", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "type", + "columnName": "type", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "maxOrder", + "columnName": "maxOrder", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isFeeAbsorbed", + "columnName": "isFeeAbsorbed", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "isDescriptionVisible", + "columnName": "isDescriptionVisible", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "price", + "columnName": "price", + "affinity": "REAL", + "notNull": true + }, + { + "fieldPath": "position", + "columnName": "position", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "quantity", + "columnName": "quantity", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "isHidden", + "columnName": "isHidden", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "salesStartsAt", + "columnName": "salesStartsAt", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "salesEndsAt", + "columnName": "salesEndsAt", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "minOrder", + "columnName": "minOrder", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "event", + "columnName": "event", + "affinity": "INTEGER", + "notNull": false + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": false + }, + "indices": [ + { + "name": "index_Ticket_event", + "unique": false, + "columnNames": [ + "event" + ], + "createSql": "CREATE INDEX `index_Ticket_event` ON `${TABLE_NAME}` (`event`)" + } + ], + "foreignKeys": [ + { + "table": "Event", + "onDelete": "CASCADE", + "onUpdate": "NO ACTION", + "columns": [ + "event" + ], + "referencedColumns": [ + "id" + ] + } + ] + }, + { + "tableName": "Attendee", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER NOT NULL, `firstname` TEXT, `lastname` TEXT, `email` TEXT, `address` TEXT, `city` TEXT, `state` TEXT, `country` TEXT, `jobTitle` TEXT, `phone` TEXT, `taxBusinessInfo` TEXT, `billingAddress` TEXT, `homeAddress` TEXT, `shippingAddress` TEXT, `company` TEXT, `workAddress` TEXT, `workPhone` TEXT, `website` TEXT, `blog` TEXT, `github` TEXT, `facebook` TEXT, `twitter` TEXT, `gender` TEXT, `isCheckedIn` INTEGER, `checkinTimes` TEXT, `isCheckedOut` INTEGER NOT NULL, `pdfUrl` TEXT, `ticketId` TEXT, `event` INTEGER, `ticket` INTEGER, PRIMARY KEY(`id`), FOREIGN KEY(`event`) REFERENCES `Event`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE , FOREIGN KEY(`ticket`) REFERENCES `Ticket`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "firstname", + "columnName": "firstname", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "lastname", + "columnName": "lastname", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "email", + "columnName": "email", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "address", + "columnName": "address", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "city", + "columnName": "city", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "state", + "columnName": "state", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "country", + "columnName": "country", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "jobTitle", + "columnName": "jobTitle", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "phone", + "columnName": "phone", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "taxBusinessInfo", + "columnName": "taxBusinessInfo", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "billingAddress", + "columnName": "billingAddress", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "homeAddress", + "columnName": "homeAddress", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "shippingAddress", + "columnName": "shippingAddress", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "company", + "columnName": "company", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "workAddress", + "columnName": "workAddress", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "workPhone", + "columnName": "workPhone", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "website", + "columnName": "website", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "blog", + "columnName": "blog", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "github", + "columnName": "github", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "facebook", + "columnName": "facebook", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "twitter", + "columnName": "twitter", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "gender", + "columnName": "gender", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "isCheckedIn", + "columnName": "isCheckedIn", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "checkinTimes", + "columnName": "checkinTimes", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "isCheckedOut", + "columnName": "isCheckedOut", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "pdfUrl", + "columnName": "pdfUrl", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "ticketId", + "columnName": "ticketId", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "event", + "columnName": "event", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "ticket", + "columnName": "ticket", + "affinity": "INTEGER", + "notNull": false + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": false + }, + "indices": [ + { + "name": "index_Attendee_event", + "unique": false, + "columnNames": [ + "event" + ], + "createSql": "CREATE INDEX `index_Attendee_event` ON `${TABLE_NAME}` (`event`)" + }, + { + "name": "index_Attendee_ticket", + "unique": false, + "columnNames": [ + "ticket" + ], + "createSql": "CREATE INDEX `index_Attendee_ticket` ON `${TABLE_NAME}` (`ticket`)" + } + ], + "foreignKeys": [ + { + "table": "Event", + "onDelete": "CASCADE", + "onUpdate": "NO ACTION", + "columns": [ + "event" + ], + "referencedColumns": [ + "id" + ] + }, + { + "table": "Ticket", + "onDelete": "CASCADE", + "onUpdate": "NO ACTION", + "columns": [ + "ticket" + ], + "referencedColumns": [ + "id" + ] + } + ] + }, + { + "tableName": "EventTopic", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER NOT NULL, `name` TEXT NOT NULL, `slug` TEXT NOT NULL, `event` INTEGER, PRIMARY KEY(`id`), FOREIGN KEY(`event`) REFERENCES `Event`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "slug", + "columnName": "slug", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "event", + "columnName": "event", + "affinity": "INTEGER", + "notNull": false + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": false + }, + "indices": [ + { + "name": "index_EventTopic_event", + "unique": false, + "columnNames": [ + "event" + ], + "createSql": "CREATE INDEX `index_EventTopic_event` ON `${TABLE_NAME}` (`event`)" + } + ], + "foreignKeys": [ + { + "table": "Event", + "onDelete": "CASCADE", + "onUpdate": "NO ACTION", + "columns": [ + "event" + ], + "referencedColumns": [ + "id" + ] + } + ] + }, + { + "tableName": "Order", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER NOT NULL, `paymentMode` TEXT, `country` TEXT, `status` TEXT, `amount` REAL NOT NULL, `identifier` TEXT, `orderNotes` TEXT, `completedAt` TEXT, `city` TEXT, `address` TEXT, `createdAt` TEXT, `zipcode` TEXT, `paidVia` TEXT, `discountCodeId` TEXT, `ticketsPdfUrl` TEXT, `transactionId` TEXT, `isBillingEnabled` INTEGER NOT NULL, `taxBusinessInfo` TEXT, `company` TEXT, `event` INTEGER, `attendees` TEXT NOT NULL, PRIMARY KEY(`id`))", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "paymentMode", + "columnName": "paymentMode", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "country", + "columnName": "country", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "status", + "columnName": "status", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "amount", + "columnName": "amount", + "affinity": "REAL", + "notNull": true + }, + { + "fieldPath": "identifier", + "columnName": "identifier", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "orderNotes", + "columnName": "orderNotes", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "completedAt", + "columnName": "completedAt", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "city", + "columnName": "city", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "address", + "columnName": "address", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "createdAt", + "columnName": "createdAt", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "zipcode", + "columnName": "zipcode", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "paidVia", + "columnName": "paidVia", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "discountCodeId", + "columnName": "discountCodeId", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "ticketsPdfUrl", + "columnName": "ticketsPdfUrl", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "transactionId", + "columnName": "transactionId", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "isBillingEnabled", + "columnName": "isBillingEnabled", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "taxBusinessInfo", + "columnName": "taxBusinessInfo", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "company", + "columnName": "company", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "event", + "columnName": "event", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "attendees", + "columnName": "attendees", + "affinity": "TEXT", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": false + }, + "indices": [ + { + "name": "index_Order_event", + "unique": false, + "columnNames": [ + "event" + ], + "createSql": "CREATE INDEX `index_Order_event` ON `${TABLE_NAME}` (`event`)" + } + ], + "foreignKeys": [] + }, + { + "tableName": "CustomForm", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER NOT NULL, `form` TEXT NOT NULL, `fieldIdentifier` TEXT NOT NULL, `type` TEXT NOT NULL, `isRequired` INTEGER NOT NULL, `isIncluded` INTEGER NOT NULL, `isFixed` INTEGER, `ticketsNumber` INTEGER, `event` INTEGER, PRIMARY KEY(`id`), FOREIGN KEY(`event`) REFERENCES `Event`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "form", + "columnName": "form", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "fieldIdentifier", + "columnName": "fieldIdentifier", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "type", + "columnName": "type", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "isRequired", + "columnName": "isRequired", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isIncluded", + "columnName": "isIncluded", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isFixed", + "columnName": "isFixed", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "ticketsNumber", + "columnName": "ticketsNumber", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "event", + "columnName": "event", + "affinity": "INTEGER", + "notNull": false + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": false + }, + "indices": [], + "foreignKeys": [ + { + "table": "Event", + "onDelete": "CASCADE", + "onUpdate": "NO ACTION", + "columns": [ + "event" + ], + "referencedColumns": [ + "id" + ] + } + ] + }, + { + "tableName": "Speaker", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER NOT NULL, `name` TEXT, `email` TEXT, `photoUrl` TEXT, `shortBiography` TEXT, `longBiography` TEXT, `speakingExperience` TEXT, `position` TEXT, `mobile` TEXT, `location` TEXT, `country` TEXT, `city` TEXT, `organisation` TEXT, `gender` TEXT, `website` TEXT, `twitter` TEXT, `facebook` TEXT, `linkedin` TEXT, `github` TEXT, `isFeatured` INTEGER NOT NULL, `event` INTEGER, `user` INTEGER, PRIMARY KEY(`id`))", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "email", + "columnName": "email", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "photoUrl", + "columnName": "photoUrl", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "shortBiography", + "columnName": "shortBiography", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "longBiography", + "columnName": "longBiography", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "speakingExperience", + "columnName": "speakingExperience", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "position", + "columnName": "position", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "mobile", + "columnName": "mobile", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "location", + "columnName": "location", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "country", + "columnName": "country", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "city", + "columnName": "city", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "organisation", + "columnName": "organisation", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "gender", + "columnName": "gender", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "website", + "columnName": "website", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "twitter", + "columnName": "twitter", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "facebook", + "columnName": "facebook", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "linkedin", + "columnName": "linkedin", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "github", + "columnName": "github", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "isFeatured", + "columnName": "isFeatured", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "event", + "columnName": "event", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "user", + "columnName": "user", + "affinity": "INTEGER", + "notNull": false + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": false + }, + "indices": [ + { + "name": "index_Speaker_event", + "unique": false, + "columnNames": [ + "event" + ], + "createSql": "CREATE INDEX `index_Speaker_event` ON `${TABLE_NAME}` (`event`)" + }, + { + "name": "index_Speaker_user", + "unique": false, + "columnNames": [ + "user" + ], + "createSql": "CREATE INDEX `index_Speaker_user` ON `${TABLE_NAME}` (`user`)" + } + ], + "foreignKeys": [] + }, + { + "tableName": "SpeakerWithEvent", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`event_id` INTEGER NOT NULL, `speaker_id` INTEGER NOT NULL, PRIMARY KEY(`event_id`, `speaker_id`), FOREIGN KEY(`event_id`) REFERENCES `Event`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION , FOREIGN KEY(`speaker_id`) REFERENCES `Speaker`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION )", + "fields": [ + { + "fieldPath": "eventId", + "columnName": "event_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "speakerId", + "columnName": "speaker_id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "event_id", + "speaker_id" + ], + "autoGenerate": false + }, + "indices": [ + { + "name": "index_SpeakerWithEvent_event_id", + "unique": false, + "columnNames": [ + "event_id" + ], + "createSql": "CREATE INDEX `index_SpeakerWithEvent_event_id` ON `${TABLE_NAME}` (`event_id`)" + }, + { + "name": "index_SpeakerWithEvent_speaker_id", + "unique": false, + "columnNames": [ + "speaker_id" + ], + "createSql": "CREATE INDEX `index_SpeakerWithEvent_speaker_id` ON `${TABLE_NAME}` (`speaker_id`)" + } + ], + "foreignKeys": [ + { + "table": "Event", + "onDelete": "NO ACTION", + "onUpdate": "NO ACTION", + "columns": [ + "event_id" + ], + "referencedColumns": [ + "id" + ] + }, + { + "table": "Speaker", + "onDelete": "NO ACTION", + "onUpdate": "NO ACTION", + "columns": [ + "speaker_id" + ], + "referencedColumns": [ + "id" + ] + } + ] + }, + { + "tableName": "Sponsor", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER NOT NULL, `name` TEXT, `description` TEXT, `url` TEXT, `logoUrl` TEXT, `level` INTEGER NOT NULL, `type` TEXT, PRIMARY KEY(`id`))", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "description", + "columnName": "description", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "url", + "columnName": "url", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "logoUrl", + "columnName": "logoUrl", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "level", + "columnName": "level", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "type", + "columnName": "type", + "affinity": "TEXT", + "notNull": false + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": false + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "SponsorWithEvent", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`event_id` INTEGER NOT NULL, `sponsor_id` INTEGER NOT NULL, PRIMARY KEY(`event_id`, `sponsor_id`), FOREIGN KEY(`event_id`) REFERENCES `Event`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION , FOREIGN KEY(`sponsor_id`) REFERENCES `Sponsor`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION )", + "fields": [ + { + "fieldPath": "eventId", + "columnName": "event_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "sponsorId", + "columnName": "sponsor_id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "event_id", + "sponsor_id" + ], + "autoGenerate": false + }, + "indices": [ + { + "name": "index_SponsorWithEvent_event_id", + "unique": false, + "columnNames": [ + "event_id" + ], + "createSql": "CREATE INDEX `index_SponsorWithEvent_event_id` ON `${TABLE_NAME}` (`event_id`)" + }, + { + "name": "index_SponsorWithEvent_sponsor_id", + "unique": false, + "columnNames": [ + "sponsor_id" + ], + "createSql": "CREATE INDEX `index_SponsorWithEvent_sponsor_id` ON `${TABLE_NAME}` (`sponsor_id`)" + } + ], + "foreignKeys": [ + { + "table": "Event", + "onDelete": "NO ACTION", + "onUpdate": "NO ACTION", + "columns": [ + "event_id" + ], + "referencedColumns": [ + "id" + ] + }, + { + "table": "Sponsor", + "onDelete": "NO ACTION", + "onUpdate": "NO ACTION", + "columns": [ + "sponsor_id" + ], + "referencedColumns": [ + "id" + ] + } + ] + }, + { + "tableName": "Session", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER NOT NULL, `shortAbstract` TEXT, `comments` TEXT, `longAbstract` TEXT, `level` TEXT, `signupUrl` TEXT, `endsAt` TEXT, `language` TEXT, `title` TEXT, `startsAt` TEXT, `slidesUrl` TEXT, `averageRating` REAL, `submittedAt` TEXT, `deletedAt` TEXT, `subtitle` TEXT, `createdAt` TEXT, `state` TEXT, `lastModifiedAt` TEXT, `videoUrl` TEXT, `audioUrl` TEXT, `sessionType` TEXT, `microlocation` TEXT, `track` TEXT, PRIMARY KEY(`id`))", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "shortAbstract", + "columnName": "shortAbstract", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "comments", + "columnName": "comments", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "longAbstract", + "columnName": "longAbstract", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "level", + "columnName": "level", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "signupUrl", + "columnName": "signupUrl", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "endsAt", + "columnName": "endsAt", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "language", + "columnName": "language", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "title", + "columnName": "title", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "startsAt", + "columnName": "startsAt", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "slidesUrl", + "columnName": "slidesUrl", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "averageRating", + "columnName": "averageRating", + "affinity": "REAL", + "notNull": false + }, + { + "fieldPath": "submittedAt", + "columnName": "submittedAt", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "deletedAt", + "columnName": "deletedAt", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "subtitle", + "columnName": "subtitle", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "createdAt", + "columnName": "createdAt", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "state", + "columnName": "state", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "lastModifiedAt", + "columnName": "lastModifiedAt", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "videoUrl", + "columnName": "videoUrl", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "audioUrl", + "columnName": "audioUrl", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "sessionType", + "columnName": "sessionType", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "microlocation", + "columnName": "microlocation", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "track", + "columnName": "track", + "affinity": "TEXT", + "notNull": false + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": false + }, + "indices": [ + { + "name": "index_Session_sessionType", + "unique": false, + "columnNames": [ + "sessionType" + ], + "createSql": "CREATE INDEX `index_Session_sessionType` ON `${TABLE_NAME}` (`sessionType`)" + }, + { + "name": "index_Session_microlocation", + "unique": false, + "columnNames": [ + "microlocation" + ], + "createSql": "CREATE INDEX `index_Session_microlocation` ON `${TABLE_NAME}` (`microlocation`)" + }, + { + "name": "index_Session_track", + "unique": false, + "columnNames": [ + "track" + ], + "createSql": "CREATE INDEX `index_Session_track` ON `${TABLE_NAME}` (`track`)" + } + ], + "foreignKeys": [] + }, + { + "tableName": "SpeakersCall", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER NOT NULL, `announcement` TEXT NOT NULL, `startsAt` TEXT NOT NULL, `endsAt` TEXT NOT NULL, `hash` TEXT, `privacy` TEXT, PRIMARY KEY(`id`))", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "announcement", + "columnName": "announcement", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "startsAt", + "columnName": "startsAt", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "endsAt", + "columnName": "endsAt", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "hash", + "columnName": "hash", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "privacy", + "columnName": "privacy", + "affinity": "TEXT", + "notNull": false + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": false + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Feedback", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER, `rating` TEXT, `comment` TEXT, `event` INTEGER, `user` INTEGER, PRIMARY KEY(`id`))", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "rating", + "columnName": "rating", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "comment", + "columnName": "comment", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "event", + "columnName": "event", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "user", + "columnName": "user", + "affinity": "INTEGER", + "notNull": false + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": false + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Notification", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER NOT NULL, `message` TEXT, `receivedAt` TEXT, `isRead` INTEGER NOT NULL, `title` TEXT, `deletedAt` TEXT, PRIMARY KEY(`id`))", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "message", + "columnName": "message", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "receivedAt", + "columnName": "receivedAt", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "isRead", + "columnName": "isRead", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "title", + "columnName": "title", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "deletedAt", + "columnName": "deletedAt", + "affinity": "TEXT", + "notNull": false + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": false + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Settings", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER, `appName` TEXT, `tagline` TEXT, `isPaypalActivated` INTEGER NOT NULL, `isStripeActivated` INTEGER NOT NULL, `isOmiseActivated` INTEGER NOT NULL, `frontendUrl` TEXT, `cookiePolicy` TEXT, `cookiePolicyLink` TEXT, `orderExpiryTime` INTEGER, PRIMARY KEY(`id`))", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "appName", + "columnName": "appName", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "tagline", + "columnName": "tagline", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "isPaypalActivated", + "columnName": "isPaypalActivated", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isStripeActivated", + "columnName": "isStripeActivated", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isOmiseActivated", + "columnName": "isOmiseActivated", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "frontendUrl", + "columnName": "frontendUrl", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "cookiePolicy", + "columnName": "cookiePolicy", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "cookiePolicyLink", + "columnName": "cookiePolicyLink", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "orderExpiryTime", + "columnName": "orderExpiryTime", + "affinity": "INTEGER", + "notNull": false + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": false + }, + "indices": [], + "foreignKeys": [] + } + ], + "views": [], + "setupQueries": [ + "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)", + "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, 'bf7cbd2b19683a13c4f43725b790ccd4')" + ] + } +} \ No newline at end of file diff --git a/app/src/main/java/org/fossasia/openevent/general/OpenEventDatabase.kt b/app/src/main/java/org/fossasia/openevent/general/OpenEventDatabase.kt index 5e2e01bcea..8e5016efbd 100644 --- a/app/src/main/java/org/fossasia/openevent/general/OpenEventDatabase.kt +++ b/app/src/main/java/org/fossasia/openevent/general/OpenEventDatabase.kt @@ -32,6 +32,8 @@ import org.fossasia.openevent.general.sessions.SessionDao import org.fossasia.openevent.general.sessions.microlocation.MicroLocationConverter import org.fossasia.openevent.general.sessions.sessiontype.SessionTypeConverter import org.fossasia.openevent.general.sessions.track.TrackConverter +import org.fossasia.openevent.general.settings.Settings +import org.fossasia.openevent.general.settings.SettingsDao import org.fossasia.openevent.general.social.SocialLink import org.fossasia.openevent.general.social.SocialLinksDao import org.fossasia.openevent.general.speakercall.SpeakersCallConverter @@ -49,7 +51,8 @@ import org.fossasia.openevent.general.ticket.TicketIdConverter @Database(entities = [Event::class, User::class, SocialLink::class, Ticket::class, Attendee::class, EventTopic::class, Order::class, CustomForm::class, Speaker::class, SpeakerWithEvent::class, Sponsor::class, - SponsorWithEvent::class, Session::class, SpeakersCall::class, Feedback::class, Notification::class], version = 7) + SponsorWithEvent::class, Session::class, SpeakersCall::class, Feedback::class, Notification::class, + Settings::class], version = 8) @TypeConverters(EventIdConverter::class, EventTopicConverter::class, EventTypeConverter::class, EventSubTopicConverter::class, TicketIdConverter::class, MicroLocationConverter::class, UserIdConverter::class, AttendeeIdConverter::class, ListAttendeeIdConverter::class, SessionTypeConverter::class, TrackConverter::class, @@ -85,4 +88,6 @@ abstract class OpenEventDatabase : RoomDatabase() { abstract fun feedbackDao(): FeedbackDao abstract fun notificationDao(): NotificationDao + + abstract fun settingsDao(): SettingsDao } diff --git a/app/src/main/java/org/fossasia/openevent/general/StartupViewModel.kt b/app/src/main/java/org/fossasia/openevent/general/StartupViewModel.kt new file mode 100644 index 0000000000..ab955270bd --- /dev/null +++ b/app/src/main/java/org/fossasia/openevent/general/StartupViewModel.kt @@ -0,0 +1,119 @@ +package org.fossasia.openevent.general + +import androidx.lifecycle.LiveData +import androidx.lifecycle.MutableLiveData +import androidx.lifecycle.ViewModel +import io.reactivex.disposables.CompositeDisposable +import io.reactivex.rxkotlin.plusAssign +import org.fossasia.openevent.general.auth.AuthHolder +import org.fossasia.openevent.general.auth.AuthService +import org.fossasia.openevent.general.auth.RequestPasswordReset +import org.fossasia.openevent.general.auth.forgot.PasswordReset +import org.fossasia.openevent.general.common.SingleLiveEvent +import org.fossasia.openevent.general.data.Preference +import org.fossasia.openevent.general.data.Resource +import org.fossasia.openevent.general.event.NEW_NOTIFICATIONS +import org.fossasia.openevent.general.notification.NotificationService +import org.fossasia.openevent.general.settings.SettingsService +import org.fossasia.openevent.general.utils.HttpErrors +import org.fossasia.openevent.general.utils.extensions.withDefaultSchedulers +import retrofit2.HttpException +import timber.log.Timber + +class StartupViewModel( + private val preference: Preference, + private val resource: Resource, + private val authHolder: AuthHolder, + private val authService: AuthService, + private val notificationService: NotificationService, + private val settingsService: SettingsService +) : ViewModel() { + private val compositeDisposable = CompositeDisposable() + val mutableNewNotifications = MutableLiveData() + val newNotifications: LiveData = mutableNewNotifications + private val mutableDialogProgress = MutableLiveData() + val dialogProgress: LiveData = mutableDialogProgress + private val mutableIsRefresh = MutableLiveData() + val isRefresh: LiveData = mutableIsRefresh + private val mutableResetPasswordEmail = MutableLiveData() + val resetPasswordEmail: LiveData = mutableResetPasswordEmail + private val mutableMessage = SingleLiveEvent() + val message: LiveData = mutableMessage + + fun isLoggedIn() = authHolder.isLoggedIn() + + fun getId() = authHolder.getId() + + fun syncNotifications() { + if (!isLoggedIn()) + return + compositeDisposable += notificationService.syncNotifications(getId()) + .withDefaultSchedulers() + .subscribe({ list -> + list?.forEach { + if (!it.isRead) { + preference.putBoolean(NEW_NOTIFICATIONS, true) + mutableNewNotifications.value = true + } + } + }, { + if (it is HttpException) { + if (authHolder.isLoggedIn() && it.code() == HttpErrors.UNAUTHORIZED) { + logoutAndRefresh() + } + } + Timber.e(it, "Error fetching notifications") + }) + } + + private fun logoutAndRefresh() { + compositeDisposable += authService.logout() + .withDefaultSchedulers() + .subscribe({ + mutableIsRefresh.value = true + }, { + Timber.e(it, "Error while logout") + mutableMessage.value = resource.getString(R.string.error) + }) + } + + fun checkAndReset(token: String, newPassword: String) { + val resetRequest = RequestPasswordReset(PasswordReset(token, newPassword)) + if (authHolder.isLoggedIn()) { + compositeDisposable += authService.logout() + .withDefaultSchedulers() + .doOnSubscribe { + mutableDialogProgress.value = true + }.subscribe { + resetPassword(resetRequest) + } + } else + resetPassword(resetRequest) + } + + private fun resetPassword(resetRequest: RequestPasswordReset) { + compositeDisposable += authService.resetPassword(resetRequest) + .withDefaultSchedulers() + .doOnSubscribe { + mutableDialogProgress.value = true + }.doFinally { + mutableDialogProgress.value = false + }.subscribe({ + Timber.e(it.toString()) + mutableMessage.value = resource.getString(R.string.reset_password_message) + mutableResetPasswordEmail.value = it.email + }, { + Timber.e(it, "Failed to reset password") + }) + } + + fun fetchSettings() { + compositeDisposable += settingsService.fetchSettings() + .withDefaultSchedulers() + .subscribe({ + Timber.d("Settings fetched successfully") + }, { + Timber.e(it, "Error in fetching settings form API") + }) + } +} diff --git a/app/src/main/java/org/fossasia/openevent/general/attendees/AttendeeFragment.kt b/app/src/main/java/org/fossasia/openevent/general/attendees/AttendeeFragment.kt index 15a5bdf0d9..3d42cccbe6 100644 --- a/app/src/main/java/org/fossasia/openevent/general/attendees/AttendeeFragment.kt +++ b/app/src/main/java/org/fossasia/openevent/general/attendees/AttendeeFragment.kt @@ -117,8 +117,6 @@ import java.util.Calendar import java.util.Currency import kotlin.collections.ArrayList -private const val COUNT_DOWN_TIME = 15 // in minutes - class AttendeeFragment : Fragment(), ComplexBackPressFragment { private lateinit var rootView: View @@ -260,9 +258,13 @@ class AttendeeFragment : Fragment(), ComplexBackPressFragment { .observe(viewLifecycleOwner, Observer { loadEventDetailsUI(it) setupPaymentOptions(it) - if (attendeeViewModel.pendingOrder.value != null) { - setupCountDownTimer(it) - } + }) + + attendeeViewModel.getSettings() + attendeeViewModel.orderExpiryTime + .nonNull() + .observe(viewLifecycleOwner, Observer { + setupCountDownTimer(it) }) val currentEvent = attendeeViewModel.event.value @@ -271,33 +273,22 @@ class AttendeeFragment : Fragment(), ComplexBackPressFragment { else { setupPaymentOptions(currentEvent) loadEventDetailsUI(currentEvent) - if (attendeeViewModel.pendingOrder.value != null) { - setupCountDownTimer(currentEvent) - } } } private fun setupPendingOrder() { - attendeeViewModel.pendingOrder - .nonNull() - .observe(viewLifecycleOwner, Observer { - attendeeViewModel.event.value?.let { - setupCountDownTimer(it) - } - }) - val currentPendingOrder = attendeeViewModel.pendingOrder.value if (currentPendingOrder == null) { attendeeViewModel.initializeOrder(safeArgs.eventId) } } - private fun setupCountDownTimer(event: Event) { + private fun setupCountDownTimer(orderExpiryTime: Int) { rootView.timeoutCounterLayout.visibility = View.VISIBLE rootView.timeoutInfoTextView.text = - getString(R.string.ticket_timeout_info_message, event.orderExpiryTime.toString()) + getString(R.string.ticket_timeout_info_message, orderExpiryTime.toString()) - val timeLeft: Long = if (attendeeViewModel.timeout == -1L) COUNT_DOWN_TIME * 60 * 1000L + val timeLeft: Long = if (attendeeViewModel.timeout == -1L) orderExpiryTime * 60 * 1000L else attendeeViewModel.timeout timer = object : CountDownTimer(timeLeft, 1000) { override fun onFinish() { diff --git a/app/src/main/java/org/fossasia/openevent/general/attendees/AttendeeViewModel.kt b/app/src/main/java/org/fossasia/openevent/general/attendees/AttendeeViewModel.kt index 41fb5c37de..c4b54cdccb 100644 --- a/app/src/main/java/org/fossasia/openevent/general/attendees/AttendeeViewModel.kt +++ b/app/src/main/java/org/fossasia/openevent/general/attendees/AttendeeViewModel.kt @@ -21,6 +21,7 @@ import org.fossasia.openevent.general.order.Charge import org.fossasia.openevent.general.order.ConfirmOrder import org.fossasia.openevent.general.order.Order import org.fossasia.openevent.general.order.OrderService +import org.fossasia.openevent.general.settings.SettingsService import org.fossasia.openevent.general.ticket.Ticket import org.fossasia.openevent.general.ticket.TicketService import org.fossasia.openevent.general.utils.HttpErrors @@ -38,6 +39,7 @@ const val PAYMENT_MODE_ONSITE = "onsite" const val PAYMENT_MODE_CHEQUE = "cheque" const val PAYMENT_MODE_PAYPAL = "paypal" const val PAYMENT_MODE_STRIPE = "stripe" +private const val ORDER_EXPIRY_TIME = 15 class AttendeeViewModel( private val attendeeService: AttendeeService, @@ -46,6 +48,7 @@ class AttendeeViewModel( private val orderService: OrderService, private val ticketService: TicketService, private val authService: AuthService, + private val settingsService: SettingsService, private val resource: Resource ) : ViewModel() { @@ -71,6 +74,8 @@ class AttendeeViewModel( val pendingOrder: LiveData = mutablePendingOrder private val mutableStripeOrderMade = MutableLiveData() val stripeOrderMade: LiveData = mutableStripeOrderMade + private val mutableOrderExpiryTime = MutableLiveData() + val orderExpiryTime: LiveData = mutableOrderExpiryTime val attendees = ArrayList() private val attendeesForOrder = ArrayList() @@ -391,6 +396,21 @@ class AttendeeViewModel( return true } + fun getSettings() { + compositeDisposable += settingsService.fetchSettings() + .withDefaultSchedulers() + .doOnSubscribe { + mutableProgress.value = true + }.doFinally { + mutableProgress.value = false + }.subscribe({ + mutableOrderExpiryTime.value = it.orderExpiryTime + }, { + mutableOrderExpiryTime.value = ORDER_EXPIRY_TIME + Timber.e(it, "Error fetching settings") + }) + } + override fun onCleared() { super.onCleared() compositeDisposable.clear() diff --git a/app/src/main/java/org/fossasia/openevent/general/di/Modules.kt b/app/src/main/java/org/fossasia/openevent/general/di/Modules.kt index ba522599bb..ace5aef334 100644 --- a/app/src/main/java/org/fossasia/openevent/general/di/Modules.kt +++ b/app/src/main/java/org/fossasia/openevent/general/di/Modules.kt @@ -12,6 +12,7 @@ import okhttp3.OkHttpClient import okhttp3.logging.HttpLoggingInterceptor import org.fossasia.openevent.general.BuildConfig import org.fossasia.openevent.general.OpenEventDatabase +import org.fossasia.openevent.general.StartupViewModel import org.fossasia.openevent.general.about.AboutEventViewModel import org.fossasia.openevent.general.attendees.Attendee import org.fossasia.openevent.general.attendees.AttendeeApi @@ -90,6 +91,9 @@ import org.fossasia.openevent.general.sessions.SessionViewModel import org.fossasia.openevent.general.sessions.microlocation.MicroLocation import org.fossasia.openevent.general.sessions.sessiontype.SessionType import org.fossasia.openevent.general.sessions.track.Track +import org.fossasia.openevent.general.settings.Settings +import org.fossasia.openevent.general.settings.SettingsApi +import org.fossasia.openevent.general.settings.SettingsService import org.fossasia.openevent.general.settings.SettingsViewModel import org.fossasia.openevent.general.social.SocialLink import org.fossasia.openevent.general.social.SocialLinkApi @@ -194,6 +198,10 @@ val apiModule = module { val retrofit: Retrofit = get() retrofit.create(DiscountApi::class.java) } + single { + val retrofit: Retrofit = get() + retrofit.create(SettingsApi::class.java) + } factory { AuthHolder(get()) } factory { AuthService(get(), get(), get(), get(), get()) } @@ -208,11 +216,13 @@ val apiModule = module { factory { SessionService(get(), get()) } factory { NotificationService(get(), get()) } factory { FeedbackService(get(), get()) } + factory { SettingsService(get(), get()) } } val viewModelModule = module { viewModel { LoginViewModel(get(), get(), get()) } - viewModel { EventsViewModel(get(), get(), get(), get(), get(), get(), get(), get()) } + viewModel { EventsViewModel(get(), get(), get(), get(), get()) } + viewModel { StartupViewModel(get(), get(), get(), get(), get(), get()) } viewModel { ProfileViewModel(get(), get()) } viewModel { SignUpViewModel(get(), get(), get()) } viewModel { @@ -220,7 +230,7 @@ val viewModelModule = module { viewModel { SessionViewModel(get(), get(), get()) } viewModel { SearchViewModel(get(), get()) } viewModel { SearchResultsViewModel(get(), get(), get(), get(), get()) } - viewModel { AttendeeViewModel(get(), get(), get(), get(), get(), get(), get()) } + viewModel { AttendeeViewModel(get(), get(), get(), get(), get(), get(), get(), get()) } viewModel { SearchLocationViewModel(get(), get()) } viewModel { SearchTimeViewModel(get()) } viewModel { SearchTypeViewModel(get(), get(), get()) } @@ -292,7 +302,7 @@ val networkModule = module { EventSubTopic::class.java, Feedback::class.java, Speaker::class.java, Session::class.java, SessionType::class.java, MicroLocation::class.java, SpeakersCall::class.java, Sponsor::class.java, EventFAQ::class.java, Notification::class.java, Track::class.java, - DiscountCode::class.java) + DiscountCode::class.java, Settings::class.java) Retrofit.Builder() .client(get()) @@ -385,4 +395,9 @@ val databaseModule = module { val database: OpenEventDatabase = get() database.notificationDao() } + + factory { + val database: OpenEventDatabase = get() + database.settingsDao() + } } diff --git a/app/src/main/java/org/fossasia/openevent/general/event/Event.kt b/app/src/main/java/org/fossasia/openevent/general/event/Event.kt index 9820a8ada9..45a24b8d9f 100644 --- a/app/src/main/java/org/fossasia/openevent/general/event/Event.kt +++ b/app/src/main/java/org/fossasia/openevent/general/event/Event.kt @@ -57,7 +57,6 @@ data class Event( val latitude: Double? = null, val longitude: Double? = null, val refundPolicy: String? = null, - val orderExpiryTime: Int = 10, val canPayByStripe: Boolean = false, val canPayByCheque: Boolean = false, diff --git a/app/src/main/java/org/fossasia/openevent/general/event/EventsFragment.kt b/app/src/main/java/org/fossasia/openevent/general/event/EventsFragment.kt index e30759aae1..7cdd5f8543 100644 --- a/app/src/main/java/org/fossasia/openevent/general/event/EventsFragment.kt +++ b/app/src/main/java/org/fossasia/openevent/general/event/EventsFragment.kt @@ -37,6 +37,7 @@ import kotlinx.android.synthetic.main.fragment_events.view.newNotificationDotToo import kotlinx.android.synthetic.main.fragment_events.view.notificationToolbar import org.fossasia.openevent.general.R import org.fossasia.openevent.general.BottomIconDoubleClick +import org.fossasia.openevent.general.StartupViewModel import org.fossasia.openevent.general.utils.RESET_PASSWORD_TOKEN import org.fossasia.openevent.general.common.EventClickListener import org.fossasia.openevent.general.common.FavoriteFabClickListener @@ -58,6 +59,7 @@ private const val EVENTS_FRAGMENT = "eventsFragment" class EventsFragment : Fragment(), BottomIconDoubleClick { private val eventsViewModel by viewModel() + private val startupViewModel by viewModel() private lateinit var rootView: View private val preference = Preference() private val eventsListAdapter = EventsListAdapter() @@ -82,7 +84,7 @@ class EventsFragment : Fragment(), BottomIconDoubleClick { if (token != null) showResetPasswordAlertDialog(token) - eventsViewModel.resetPasswordEmail + startupViewModel.resetPasswordEmail .nonNull() .observe(viewLifecycleOwner, Observer { findNavController(rootView).navigate( @@ -90,7 +92,7 @@ class EventsFragment : Fragment(), BottomIconDoubleClick { ) }) - eventsViewModel.dialogProgress + startupViewModel.dialogProgress .nonNull() .observe(viewLifecycleOwner, Observer { progressDialog.show(it) @@ -102,10 +104,11 @@ class EventsFragment : Fragment(), BottomIconDoubleClick { rootView.eventsRecycler.adapter = eventsListAdapter rootView.eventsRecycler.isNestedScrollingEnabled = false - eventsViewModel.syncNotifications() + startupViewModel.syncNotifications() + startupViewModel.fetchSettings() handleNotificationDotVisibility( preference.getBoolean(NEW_NOTIFICATIONS, false)) - eventsViewModel.newNotifications + startupViewModel.newNotifications .nonNull() .observe(viewLifecycleOwner, Observer { handleNotificationDotVisibility(it) @@ -195,9 +198,21 @@ class EventsFragment : Fragment(), BottomIconDoubleClick { } } + startupViewModel.isRefresh + .nonNull() + .observe(viewLifecycleOwner, Observer { + if (it) refreshData() + }) + return rootView } + private fun refreshData() { + eventsViewModel.loadLocationEvents() + startupViewModel.fetchSettings() + startupViewModel.syncNotifications() + } + private fun handleNotificationDotVisibility(isVisible: Boolean) { rootView.newNotificationDot.isVisible = isVisible rootView.newNotificationDotToolbar.isVisible = isVisible @@ -261,7 +276,7 @@ class EventsFragment : Fragment(), BottomIconDoubleClick { } private fun moveToNotification() { - eventsViewModel.mutableNewNotifications.value = false + startupViewModel.mutableNewNotifications.value = false findNavController(rootView).navigate(EventsFragmentDirections.actionEventsToNotification()) } @@ -293,7 +308,7 @@ class EventsFragment : Fragment(), BottomIconDoubleClick { .setTitle(getString(R.string.title_change_password)) .setView(layout) .setPositiveButton(getString(R.string.change)) { _, _ -> - eventsViewModel.checkAndReset(token, layout.newPassword.text.toString()) + startupViewModel.checkAndReset(token, layout.newPassword.text.toString()) } .setNegativeButton(getString(R.string.cancel)) { dialog, _ -> dialog.cancel() diff --git a/app/src/main/java/org/fossasia/openevent/general/event/EventsViewModel.kt b/app/src/main/java/org/fossasia/openevent/general/event/EventsViewModel.kt index 18c11c0451..253f153c7b 100644 --- a/app/src/main/java/org/fossasia/openevent/general/event/EventsViewModel.kt +++ b/app/src/main/java/org/fossasia/openevent/general/event/EventsViewModel.kt @@ -11,20 +11,13 @@ import io.reactivex.disposables.CompositeDisposable import io.reactivex.rxkotlin.plusAssign import io.reactivex.schedulers.Schedulers import org.fossasia.openevent.general.R -import org.fossasia.openevent.general.auth.AuthHolder -import org.fossasia.openevent.general.auth.AuthService -import org.fossasia.openevent.general.auth.RequestPasswordReset -import org.fossasia.openevent.general.auth.forgot.PasswordReset import org.fossasia.openevent.general.common.SingleLiveEvent import org.fossasia.openevent.general.connectivity.MutableConnectionLiveData import org.fossasia.openevent.general.data.Preference import org.fossasia.openevent.general.data.Resource import org.fossasia.openevent.general.event.paging.EventsDataSourceFactory -import org.fossasia.openevent.general.notification.NotificationService import org.fossasia.openevent.general.search.location.SAVED_LOCATION -import org.fossasia.openevent.general.utils.HttpErrors import org.fossasia.openevent.general.utils.extensions.withDefaultSchedulers -import retrofit2.HttpException import timber.log.Timber const val NEW_NOTIFICATIONS = "newNotifications" @@ -34,21 +27,14 @@ class EventsViewModel( private val preference: Preference, private val resource: Resource, private val mutableConnectionLiveData: MutableConnectionLiveData, - private val authHolder: AuthHolder, - private val authService: AuthService, - private val notificationService: NotificationService, private val config: PagedList.Config ) : ViewModel() { private val compositeDisposable = CompositeDisposable() val connection: LiveData = mutableConnectionLiveData - val mutableNewNotifications = MutableLiveData() - val newNotifications: LiveData = mutableNewNotifications private val mutableProgress = MediatorLiveData() val progress: MediatorLiveData = mutableProgress - private val mutableDialogProgress = MutableLiveData() - val dialogProgress: LiveData = mutableDialogProgress private val mutablePagedEvents = MutableLiveData>() val pagedEvents: LiveData> = mutablePagedEvents private val mutableMessage = SingleLiveEvent() @@ -57,12 +43,6 @@ class EventsViewModel( private val mutableSavedLocation = MutableLiveData() val savedLocation: LiveData = mutableSavedLocation private lateinit var sourceFactory: EventsDataSourceFactory - private val mutableResetPasswordEmail = MutableLiveData() - val resetPasswordEmail: LiveData = mutableResetPasswordEmail - - fun isLoggedIn() = authHolder.isLoggedIn() - - fun getId() = authHolder.getId() fun loadLocation() { mutableSavedLocation.value = preference.getString(SAVED_LOCATION) @@ -123,71 +103,6 @@ class EventsViewModel( }) } - fun syncNotifications() { - if (!isLoggedIn()) - return - compositeDisposable += notificationService.syncNotifications(getId()) - .withDefaultSchedulers() - .subscribe({ list -> - list?.forEach { - if (!it.isRead) { - preference.putBoolean(NEW_NOTIFICATIONS, true) - mutableNewNotifications.value = true - } - } - }, { - if (it is HttpException) { - if (authHolder.isLoggedIn() && it.code() == HttpErrors.UNAUTHORIZED) { - logoutAndRefresh() - } - } - Timber.e(it, "Error fetching notifications") - }) - } - - private fun logoutAndRefresh() { - compositeDisposable += authService.logout() - .withDefaultSchedulers() - .subscribe({ - loadLocationEvents() - syncNotifications() - }, { - mutableProgress.value = false - Timber.e(it, "Error while logout") - mutableMessage.value = resource.getString(R.string.error) - }) - } - - fun checkAndReset(token: String, newPassword: String) { - val resetRequest = RequestPasswordReset(PasswordReset(token, newPassword)) - if (authHolder.isLoggedIn()) { - compositeDisposable += authService.logout() - .withDefaultSchedulers() - .doOnSubscribe { - mutableDialogProgress.value = true - }.subscribe { - resetPassword(resetRequest) - } - } else - resetPassword(resetRequest) - } - - private fun resetPassword(resetRequest: RequestPasswordReset) { - compositeDisposable += authService.resetPassword(resetRequest) - .withDefaultSchedulers() - .doOnSubscribe { - mutableDialogProgress.value = true - }.doFinally { - mutableDialogProgress.value = false - }.subscribe({ - Timber.e(it.toString()) - mutableMessage.value = resource.getString(R.string.reset_password_message) - mutableResetPasswordEmail.value = it.email - }, { - Timber.e(it, "Failed to reset password") - }) - } - override fun onCleared() { super.onCleared() compositeDisposable.clear() diff --git a/app/src/main/java/org/fossasia/openevent/general/settings/Settings.kt b/app/src/main/java/org/fossasia/openevent/general/settings/Settings.kt new file mode 100644 index 0000000000..6b38de3fd0 --- /dev/null +++ b/app/src/main/java/org/fossasia/openevent/general/settings/Settings.kt @@ -0,0 +1,27 @@ +package org.fossasia.openevent.general.settings + +import androidx.room.Entity +import androidx.room.PrimaryKey +import com.fasterxml.jackson.databind.PropertyNamingStrategy +import com.fasterxml.jackson.databind.annotation.JsonNaming +import com.github.jasminb.jsonapi.IntegerIdHandler +import com.github.jasminb.jsonapi.annotations.Id +import com.github.jasminb.jsonapi.annotations.Type + +@Type("setting") +@JsonNaming(PropertyNamingStrategy.KebabCaseStrategy::class) +@Entity +data class Settings( + @Id(IntegerIdHandler::class) + @PrimaryKey + val id: Int? = null, + val appName: String? = null, + val tagline: String? = null, + val isPaypalActivated: Boolean = false, + val isStripeActivated: Boolean = false, + val isOmiseActivated: Boolean = false, + val frontendUrl: String? = null, + val cookiePolicy: String? = null, + val cookiePolicyLink: String? = null, + val orderExpiryTime: Int? = null +) diff --git a/app/src/main/java/org/fossasia/openevent/general/settings/SettingsApi.kt b/app/src/main/java/org/fossasia/openevent/general/settings/SettingsApi.kt new file mode 100644 index 0000000000..8b738f612a --- /dev/null +++ b/app/src/main/java/org/fossasia/openevent/general/settings/SettingsApi.kt @@ -0,0 +1,10 @@ +package org.fossasia.openevent.general.settings + +import io.reactivex.Single +import retrofit2.http.GET + +interface SettingsApi { + + @GET("settings") + fun getSettings(): Single +} diff --git a/app/src/main/java/org/fossasia/openevent/general/settings/SettingsDao.kt b/app/src/main/java/org/fossasia/openevent/general/settings/SettingsDao.kt new file mode 100644 index 0000000000..548da25730 --- /dev/null +++ b/app/src/main/java/org/fossasia/openevent/general/settings/SettingsDao.kt @@ -0,0 +1,17 @@ +package org.fossasia.openevent.general.settings + +import androidx.room.Dao +import androidx.room.Insert +import androidx.room.OnConflictStrategy.REPLACE +import androidx.room.Query +import io.reactivex.Single + +@Dao +interface SettingsDao { + + @Insert(onConflict = REPLACE) + fun insertSettings(settings: Settings) + + @Query("SELECT * FROM Settings") + fun getSettings(): Single +} diff --git a/app/src/main/java/org/fossasia/openevent/general/settings/SettingsService.kt b/app/src/main/java/org/fossasia/openevent/general/settings/SettingsService.kt new file mode 100644 index 0000000000..2199ff61e8 --- /dev/null +++ b/app/src/main/java/org/fossasia/openevent/general/settings/SettingsService.kt @@ -0,0 +1,18 @@ +package org.fossasia.openevent.general.settings + +import io.reactivex.Single + +class SettingsService( + private val settingsApi: SettingsApi, + private val settingsDao: SettingsDao +) { + + fun fetchSettings(): Single { + return settingsApi.getSettings().map { + settingsDao.insertSettings(it) + it + }.flatMap { + settingsDao.getSettings() + } + } +} diff --git a/app/src/main/res/layout/fragment_attendee.xml b/app/src/main/res/layout/fragment_attendee.xml index 4c2e6667b2..d952a4fa2b 100644 --- a/app/src/main/res/layout/fragment_attendee.xml +++ b/app/src/main/res/layout/fragment_attendee.xml @@ -50,7 +50,7 @@ android:layout_weight="2" android:layout_width="0dp" android:layout_height="match_parent" - android:textSize="@dimen/text_size_expanded_title_large" + android:textSize="@dimen/text_size_expanded_title_medium" android:textColor="@android:color/black" android:textStyle="bold" android:gravity="center_vertical"